<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"> <channel><title>Vokiel.com</title> <link>http://blog.vokiel.com</link> <description>Web Developer Blog</description> <lastBuildDate>Tue, 08 May 2012 18:58:05 +0000</lastBuildDate> <language>pl</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BlogVokielCom" /><feedburner:info uri="blogvokielcom" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>WordCamp Poznań 2011 – moje wystąpienie</title><link>http://feedproxy.google.com/~r/BlogVokielCom/~3/3fayK6q01U0/wordcamp-poznan-2011-moje-wystapienie</link> <comments>http://blog.vokiel.com/wordcamp-poznan-2011-moje-wystapienie#comments</comments> <pubDate>Tue, 08 May 2012 18:58:05 +0000</pubDate> <dc:creator>Vokiel</dc:creator> <category><![CDATA[WordPress]]></category> <category><![CDATA[css3]]></category> <category><![CDATA[event]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[konferencja]]></category> <category><![CDATA[wtyczki]]></category> <guid isPermaLink="false">http://blog.vokiel.com/?p=1117</guid> <description><![CDATA[Stowarzyszenie „ABSOLWENCI NA WALIZKACH” w swoim kanale na Youtube.com umieściło nowe nagrania z zeszłorocznego WordCamp’a. W tej serii znalazło się też moje wystąpienie: Tworzenie wtyczek – oszczędzaj swój czas]]></description> <content:encoded><![CDATA[<div
id="attachment_996" class="wp-caption alignright" style="width: 210px"><a
rel="nofollow" target="_blank" href="http://2011.poznan.wordcamp.org/prelegenci/#robert-mikolajuk"><img
src="http://blog.vokiel.com/wp-content/uploads/2011/12/bylem-speakerem.jpg" alt="" title="WordCamp Poznań 2011" width="200" height="200" class="size-full wp-image-996" /></a><p
class="wp-caption-text">WordCamp Poznań 2011</p></div><p>Stowarzyszenie <em><a
rel="nofollow" target="_blank" href="http://absolwencinawalizkach.pl/#referrer=blog.vokiel.com" title="ABSOLWENCI NA WALIZKACH" target="_blank">ABSOLWENCI NA WALIZKACH</a></em> w swoim <a
rel="nofollow" target="_blank" href="http://www.youtube.com/user/absolwenciwsieci#referrer=blog.vokiel.com" title="ABSOLWENCI NA WALIZKACH" target="_blank">kanale na Youtube.com</a> umieściło nowe nagrania z zeszłorocznego WordCamp&#8217;a. To już druga seria nagrań z tej konferencji, w tej pojawiło się także moje wystąpienie. W pierwszej serii pojawiły się prezentacje czterech prelegentów: Arek Stęplowski, Michał Maćkowiak, Maciej Kuchnik, Magdalena Bród. Druga okazała się trochę bardziej rozbudowana: Szymon Skulimowski, Marcin Wolak, Marcin Pietrzak, Bartosz Bilicki, Paweł Pela oraz Robert Mikołajuk.</p><p>Zapraszam do zapoznania się z <a
href="http://blog.vokiel.com/wordcamp-poznan-2011-relacja" title="WordCamp Poznań 2011 – relacja" target="_blank">moją relacją </a>z tego wydarzenia, a także do obejrzenia nagrań z wielu ciekawych wystąpień.</p><p><span
id="more-1117"></span></p><h2>Moje wystąpienie</h2><p>Tematem mojej prezentacji było tworzenie wtyczek, główne punkty to m.in:</p><ul
class="nice-list"><li>Wstęp o WordPress i o sile wtyczek</li><li>Podstawy wtyczek</li><li>Organizacja pracy, zasady tworzenia, podstawowe błędy</li><li>Praktyczny przykład tworzenia wtyczki od podstaw</li><li>Integracja z panelem administracyjnym</li></ul><h2>Moje wystąpienia (playlista)</h2><h2> <iframe
width="640" height="360" src="http://www.youtube.com/embed/videoseries?list=PLEBC20EAE4D52D430&amp;hl=pl_PL" frameborder="0" allowfullscreen></iframe></h2> <img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/3fayK6q01U0" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://blog.vokiel.com/wordcamp-poznan-2011-moje-wystapienie/feed</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://blog.vokiel.com/wordcamp-poznan-2011-moje-wystapienie</feedburner:origLink></item> <item><title>Workspace czyli moje środowisko pracy</title><link>http://feedproxy.google.com/~r/BlogVokielCom/~3/JimgL8lsyQg/workspace-czyli-moje-srodowisko-pracy</link> <comments>http://blog.vokiel.com/workspace-czyli-moje-srodowisko-pracy#comments</comments> <pubDate>Fri, 13 Apr 2012 16:17:44 +0000</pubDate> <dc:creator>Vokiel</dc:creator> <category><![CDATA[XYZ]]></category> <category><![CDATA[blog]]></category> <category><![CDATA[eclipse]]></category> <category><![CDATA[PHP]]></category> <guid isPermaLink="false">http://blog.vokiel.com/?p=1092</guid> <description><![CDATA[Miesiąc temu Radek Benkel na swoim blogu popełnił ciekawy wpis o własnym środowisku pracy. Kontynuując temat publikuję opis swojego, pod tym samym tytułem.]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.vokiel.com/wp-content/uploads/2012/04/logo-300x83.jpg" alt="vokiel.com-logotyp" width="300" height="83" class="alignright size-medium wp-image-1108" style="padding:15px;"/> Miesiąc temu <a
rel="nofollow" target="_blank" href="http://www.twitter.com/singlespl#referrer=blog.vokiel.com" title="singlespl" target="_blank">Radek Benkel</a> na swoim blogu popełnił ciekawy wpis o własnym <a
rel="nofollow" target="_blank" href="http://blog.rbenkel.me/2012/03/workspace-czyli-moje-srodowisko-pracy/#referrer=blog.vokiel.com" title="Workspace czyli moje środowisko pracy" target="_blank">środowisku pracy</a>. Kontynuując temat publikuję opis swojego, pod tym samym tytułem. Taka wymiana doświadczeń zwykle jest bardzo ciekawa, pozwala poznać czyjeś techniki, programy, przyzwyczajenia, które mogą okazać się lepsze od naszych. W dużej mierze skorzystam z podziału Radka, dzięki temu czytelnikom będzie łatwiej porównywać takie zestawienia.<br
/> <span
id="more-1092"></span></p><h2>Hardware</h2><p>Ze sprzętem zawsze mam problem, bo podchodzę do wyboru bardzo pragmatycznie. Porównuję konfiguracje, parametry, nadaje im wagi, wybieram konkretny model w wyniku długotrwałych porównań. Tak też było ostatnim razem, ważna była wielkość matrycy, i7 ze wsparciem dla AES i wirtualizacji, szybki dysk, niska cena <img
src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Excel w ruch i voila, wybrałem ASUS&#8217;a:<br
/> <strong>ASUS X43S</strong>: <em>14&#8243;, i7-2670QM, 2,26GHz, 8GB RAM, 750 GB SATA 7200 obr., Radeon HD 6730M 2048 MB DDR3 (pamieć własna).</em><br
/> Dlaczego nie Apple? Nie chcę zaczynać flame, ale jakoś nie czuję, żeby MacOSX był wart 3 000zł.</p><p>W zestawie myszka bezprzewodowa Logitech M525 oraz monitor Philips Brilliance 225PL &#8211; z możliwością ustawienia w <em>&#8222;trzech wymiarach&#8221;</em>, bez dodatkowej klawiatury &#8211; brak miejsca na biurku, ale już nie tak długo ulegnie to zmianie.</p><p>Do tego stary laptop ma Win7 x64 do testów pod Windowsem.</p><p>Telefon &#8211; Nokia e52. Smartfony jakoś mnie nie przekonują, z założenia telefon ma służyć do dzwonienia i pisania sms. Ten ma jeszcze bardzo dobrą nawigację, Opera mobile do szybkiego sprawdzenia czegoś na necie (Wi-Fi), putty w razie konieczności nagłej interwencji na serwerze,  czytnik kodów QR, własna appka typu ToDoList (html+javascript). Możliwości duże, telefon mały, bateria trzyma do dwóch tygodni.</p><h2>Software</h2><ul
class="nice-list"><li><strong>system operacyjny</strong> &#8211; Linux Fedora 16, poprzednio Windows 7 oraz Linux Mint, wcześniej jeszcze czysty Debian. Debian nadal stoi na VM, jeden Mint na najstarszym Laptopie.</li><li><strong>application stack</strong> &#8211; PHP 5.3, Apache2, MySQL &#8211; HeidiSQL (wine) &#8211; tak jak zauważył Radek Heidi jest po prostu świetne, czasem jeszcze MySQL Workbench</li><li><strong>framework</strong> &#8211; Kohana</li><li><strong>IDE</strong> &#8211; Eclipse, jakoś NetBeans nie przypadł mi do gustu, przyzwyczajenie wygrywa, PHPStorm w testach trial&#8217;a wypadło bardzo dobrze, prawdopodobnie niedługo kupię</li><li><strong>edytor tekstowy</strong> &#8211; genialny, niezastąpiony Notepad++, w konsoli nano</li><li><strong>IM</strong> &#8211; Pidgin, z kilkoma wtyczkami jest na prawdę przyjazny, poza XMPP obsługuje też Twitter&#8217;a, IRC&#8217;a, no i Gadu-Gadu, do tego Skype &#8211; ten linuxowy jest taki świetnie minimalistyczny, o niebo przyjaźniejszy niż na Win</li><li><strong>launcher</strong> &#8211; po prostu ALT+F2</li><li><strong>przeglądarka</strong> &#8211; główna Opera &#8211; subiektywnie od dawien-dawna jest najwygodniejsza do codziennej pracy, poza tym wiadomo: Firefox, Chrome, Krusader, IE8 na VM z WinXP, IE9 na drugim laptopie z Win7</li><li><strong>terminal</strong> &#8211; standardowy z ustawionymi kolorami, bash</li><li><strong>menadżer pakietów</strong> &#8211; yum oraz apper</li><li><strong>VM</strong> &#8211; VirtualBox, chociaż powoli rozglądam się za alternatywą, bo VBox potrafi być irytujący</li><li><strong>FTP</strong> &#8211; FileZilla, Krusader, w niektórych przypadkach SSHFS</li><li><strong>mail</strong> &#8211; Thunderbird, dla niektórych kont webowy GMail, wcześniej TheBat</li><li><strong>muzyka</strong> &#8211; Amarok, ale brakuje mi prostego Winampa czy ALSong</li><li><strong>video</strong> &#8211; VLC, MPlayer, najbardziej przywiązany byłem do SubEdit&#8217;a oraz Media Player Classic</li><li><strong>pakiet biurowy </strong>- LibreOffice, na Win Office 2007 &#8211; co by nie mówić, jest to świetny program</li><li><strong>prezentacje</strong> &#8211; generalnie nie robię <img
src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , ostatnio na Wordcamp&#8217;a w HTML+CSS &#8211; engine z Google, poza tym Impress lub PowerPoint <img
src='http://blog.vokiel.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /></li></ul><h3>Z rzeczy , o których Radek nie pisał:</h3><ul
class="nice-list"><li><strong>monitoring serwera </strong>- munin, phpmemcached. Dodatkowo jeśli mogę to tu podpiąc &#8211; conky rysujący najważniejsze rzeczy na bieżąco</li><li><strong>zarządzanie projektami</strong> &#8211; repozytorium git i svn, spięte razem z Redmine</li><li><strong>manager plików </strong>- krusader lub mc, na Win &#8211; TotalCommander. Nie wyobrażam sobie pracy pomiędzy okienkami</li><li><strong>grafika</strong> &#8211; Photoshop, FastStone Image Viewer, Gwenview</li><li><strong>rss</strong> &#8211; czytnik Google, wcześniej w Operze</li><li><strong>snippets</strong> &#8211; JCC (jCodeCollector), opisowe &#8211; Gnote</li><li><strong>ważne dane </strong>- TrueCrypt</li></ul><h2>Podsumowanie</h2><p>Jeśli chcecie poznać jakieś szczegóły, sposoby pracy czy interesuje Was coś więcej &#8211; piszcie śmiało w komentarzach.<br
/> Przekazuję piłeczkę dalej, kto następny chętny do opisania swojego środowiska pracy?</p> <img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/JimgL8lsyQg" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://blog.vokiel.com/workspace-czyli-moje-srodowisko-pracy/feed</wfw:commentRss> <slash:comments>3</slash:comments> <feedburner:origLink>http://blog.vokiel.com/workspace-czyli-moje-srodowisko-pracy</feedburner:origLink></item> <item><title>protectEmails jQuery plugin</title><link>http://feedproxy.google.com/~r/BlogVokielCom/~3/HdB3ClpWFEw/protectemails-jquery-plugin</link> <comments>http://blog.vokiel.com/protectemails-jquery-plugin#comments</comments> <pubDate>Sun, 29 Jan 2012 14:00:53 +0000</pubDate> <dc:creator>Vokiel</dc:creator> <category><![CDATA[CSS]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[jQuery]]></category> <category><![CDATA[email]]></category> <category><![CDATA[HTML]]></category> <category><![CDATA[planetaphp]]></category> <category><![CDATA[spam]]></category> <guid isPermaLink="false">http://blog.vokiel.com/?p=1047</guid> <description><![CDATA[Wtyczka do jQuery dająca ochronę przed spam-botami. Dwuetapowe działanie - chroni przed botami, nawet przy wyłączonym JavaScript.]]></description> <content:encoded><![CDATA[<div
id="attachment_1080" class="wp-caption alignright" style="width: 260px"><img
src="http://blog.vokiel.com/wp-content/uploads/2012/01/nospam.jpg" alt="" title="nospam" width="250" height="200" class="size-full wp-image-1080" /><p
class="wp-caption-text">src: http://http.cdnlayer.com</p></div><p>Ochrona własnego adresu poczty elektronicznej stała się &#8222;oczywistą oczywistością&#8221;. Niezliczone spam-boty przeczesują Internet w poszukiwaniu adresów email, które później zalewane są falą niechcianej poczty. Niestety często jesteśmy zmuszeni udostępnić swój adres. Wpisany zwykłym tekstem, a tym bardziej dodany do linku z <code
class="b">mailto</code> stanie się bardzo szybko łupem spamerów. O ile na formę upublicznienia adresu w obcych serwisach zwykle nie mamy wpływu, o tyle mamy w przypadku własnych. Jako, że potrzeba jest matką wynalazku, postanowiłem stworzyć własne rozwiązanie. Połączenie CSS i JavaScript przyniosło oczekiwany skutek.</p><p><span
id="more-1047"></span></p><h2>Założenia protectEmails</h2><p>Tworząc założenia starałem się patrzeć na problem możliwie z wielu stron. Najważniejszymi punktami są:</p><ol
class="nice-list"><li>Czytelność dla użytkownika końcowego</li><li>Ochrona przed podstawowymi mechanizmami spam-botów</li><li>Łatwość modyfikacji wyglądu</li><li>Prostota w stosowaniu</li></ol><h3>Czytelność dla użytkownika końcowego</h3><p>Przede wszystkim chciałem uniknąć rozwiązań typu <code
class="b">info [at] example.com</code>, które poza tym, że już dawno nie chronią przed botami, to dodatkowo są męczące dla użytkowników. Wszystkie odmiany tego rozwiązania charakteryzują się tą samą trudnością w pozyskaniu maila przez odwiedzającego stronę &#8211; podmiana fragmentów, łatwość pomyłki. Tworząc swoje rozwiązanie, chciałem, aby adres email był widoczny w zwykłej formie, po prostu jako <code
class="b">info@example.com</code>.</p><p>Dodatkowo, uważam, że ważne jest też zachowanie standardowej funkcjonalności linku, który otwiera domyślny program pocztowy klienta.</p><h3>Ochrona przed podstawowymi mechanizmami spam-botów</h3><p>Rozwiązanie musi być w jakiś sposób unikatowe, tak aby standardowe funkcje spamerów nie były w stanie takiego adresu wyłuskać. Oczywiście, nie da się zabezpieczyć w 100%, zawsze znajdzie się ktoś, kto napisze dedykowane rozwiązanie. Jednak dużą część automatów można wyeliminować.</p><p>Poszukując gotowych rozwiązań spotkałem się z dużą ilością pseudo-zabezpieczeń. Nie dość, że utrudniają one życie użytkownikom, to dodatkowo wystawiają adresy na pastwę botów, np.:</p><div
class="wp_syntax"><div
class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;mailto:info@example.com&quot;</span>&gt;</span>info [ at ] example.com<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;mailto:info@example.com&quot;</span>&gt;</span>info [ at ] example [dot] com<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div><p>Lub po prostu utrudniają życie, np.:</p><div
class="wp_syntax"><div
class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;email&quot;</span>&gt;</span>info [ at ] example [dot] com<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>spam&gt;</span></pre></div></div><p>W przypadku powyższego istnieją rozwiązania oparte na JavaScript, które na podstawie klasy modyfikują znacznik span, przerabiając go na klikalny adres email. Jest to dość dobre rozwiązanie z jednym mankamentem &#8211; adres jest czytelny dla botów.</p><h3>Łatwość modyfikacji wyglądu</h3><p>Oczywiście chroniony adres musi być w pełni modyfikowalny przy pomocy CSS, zatem odpadają dziwne rozwiązania oparte na obrazkach zamiast znaku <code
class="b">@</code>. Chciałem też uniknąć dużego zagnieżdżania znaczników, jak w proponowanym przez niektórych rozwiązaniu:</p><div
class="wp_syntax"><div
class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;mailto:info@example.com&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;n&quot;</span>&gt;</span>info<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;at&quot;</span>&gt;</span>@<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;d&quot;</span>&gt;</span>example.com<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div><p>Czy modyfikacji powyższego, poprzez zamianę kolejności znaczników i taką modyfikację CSS, aby elementy zostały ustawione w odpowiedniej kolejności:</p><div
class="wp_syntax"><div
class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;mailto:info@example.com&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;at&quot;</span>&gt;</span>@<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;n&quot;</span>&gt;</span>info<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;d&quot;</span>&gt;</span>example.com<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div><h3>Prostota w stosowaniu</h3><p>Wraz z wzrostem bezpieczeństwa zwykle rośnie też poziom skomplikowania, co niestety, przekłada się na utrudnienia w stosowaniu. Niestety te rozwiązanie nie zadziała w powiązaniu ze standardowymi edytorami WYSIWYG. Oczywiście nic nie stoi na przeszkodzie, aby dopisać odpowiednie modyfikacje.</p><p>W obecnej wersji wstawienie zabezpieczonego adresu email sprowadza się w zasadzie do dwóch zadań: wpisanie znacznika z adresem oraz podpięcia pluginu (oczywiście pamiętając do dołączeniu biblioteki jQuery):</p><div
class="wp_syntax"><div
class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> data-user<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;admin&quot;</span> data-domain<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;example.com&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;protect-emails&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">filter</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.protect-emails'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">protectEmails</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div><p>Chcąc uniezależnić się od JavaScript lub zachować jedynie podstawową funkcjonalność, należy też załączyć odpowiedni fragment CSS (domyślnie plugin dodaje go sam):</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.protect-emails</span><span style="color: #3333ff;">:after </span><span style="color: #00AA00;">&#123;</span>  <span style="color: #000000; font-weight: bold;">content</span><span style="color: #00AA00;">:</span> attr<span style="color: #00AA00;">&#40;</span>data-user<span style="color: #00AA00;">&#41;</span> <span style="color: #ff0000;">'@'</span> attr<span style="color: #00AA00;">&#40;</span>data-domain<span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div><h2>Zasada działania</h2><p>Pierwsza część rozwiązania skupia się na zaprezentowaniu adresu użytkownikowi, nawet jeśli JavaScript jest wyłączony. Dzieje się to za pomocą prostego zabiegu wykorzystującego CSS, a dokładnie właściwości <code
class="b">content</code> wspartej wykorzystaniem <code
class="b">attr</code></p><p>Dzięki ustawieniu odpowiedniego ostylowania, element html, który domyślnie nic nie wyświetla, pokazuje użytkownikowi poprawnie wyglądający email:</p><div
class="wp_syntax"><div
class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> data-user<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;admin&quot;</span> data-domain<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;example.com&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;protect-emails&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.protect-emails</span><span style="color: #3333ff;">:after </span><span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">content</span><span style="color: #00AA00;">:</span> attr<span style="color: #00AA00;">&#40;</span>data-user<span style="color: #00AA00;">&#41;</span> <span style="color: #ff0000;">'@'</span> attr<span style="color: #00AA00;">&#40;</span>data-domain<span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div><p><strong>Przykład 1:</strong></p><p><iframe
style="width: 100%; height: 80px" src="http://jsfiddle.net/vokiel/xHJ8d/1/embedded/result,html,css/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p><p>Kolejnym elementem jest dodanie &#8222;klikalności&#8221;. Jest to już rozwiązanie oparte na JavaScript. Nie ma tu czego opisywać, po prostu dla wybranej akcji <code
class="b">hover</code> czy <code
class="b">click</code> skrypt podmienia znacznik <code
class="b">span</code>.</p><p><strong>Przykład 2:</strong></p><p><iframe
style="width: 100%; height: 80px" src="http://jsfiddle.net/vokiel/Sj6kB/embedded/result,js,html,css/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p><h2>Korzyści</h2><ul
class="nice-list"><li>Niewątpliwie największą korzyścią jest ukrycie adresu email przed botami, przynajmniej do czasu, stworzenia dedykowanego rozwiązania <img
src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Nawet jeśli takie powstanie, wtyczkę można łatwo przerobić pod własne unikalne rozwiążanie.</li><li>Zachowuje się pierwotną funkcjonalność.</li><li>Adres jest czytelny dla użytkowników nawet w przypadku wyłączonego JavaScript. Można go skopiować, wkleić w programie pocztowym, nie trzeba przepisywać <code
class="b">[at]</code> na <code
class="b">@</code></li><li>Dwuetapowe zabezpieczenie może być wykorzystane tylko w części, zapewniając podstawowy poziom ochrony.</li></ul><div
class="source_demo_container"> <a
rel="nofollow" target="_blank" rel="nofollow" target="_blank" href="https://github.com/vokiel/protectEmails#referrer=blog.vokiel.com" class="source" title="Źródła">Źródła</a></div> <img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/HdB3ClpWFEw" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://blog.vokiel.com/protectemails-jquery-plugin/feed</wfw:commentRss> <slash:comments>8</slash:comments> <feedburner:origLink>http://blog.vokiel.com/protectemails-jquery-plugin</feedburner:origLink></item> <item><title>Meet.js Summit 2012 Relacja</title><link>http://feedproxy.google.com/~r/BlogVokielCom/~3/KjUGvJHuqGA/meet-js-summit-2012-relacja</link> <comments>http://blog.vokiel.com/meet-js-summit-2012-relacja#comments</comments> <pubDate>Sat, 21 Jan 2012 16:22:33 +0000</pubDate> <dc:creator>Vokiel</dc:creator> <category><![CDATA[JavaScript]]></category> <category><![CDATA[CSS]]></category> <category><![CDATA[event]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[konferencja]]></category> <category><![CDATA[planetaphp]]></category> <guid isPermaLink="false">http://blog.vokiel.com/?p=1016</guid> <description><![CDATA[Poznań, 14 stycznia 2012 r – konferencja meet.js summit, która była niejako podsumowaniem lokalnych spotkań meet.js. Są to niekomercyjne meetup’y front-endowców, na których prezentowane są prelekcje na tematy webowe (front-endowe), jts HTML, JS, CSS.]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.vokiel.com/wp-content/uploads/2012/01/summit.meet_.js_logo.jpg" alt="meet.js summit logo"  width="279" height="121" class="alignright size-full wp-image-1017" /></p><p>Poznań, 14 stycznia 2012 r &#8211; konferencja <a
rel="nofollow" target="_blank" href="http://summit.meetjs.pl/#referrer=blog.vokiel.com" title="meet.js Summit" target="_blank">meet.js summit</a>, choć minął już tydzień od tego wydarzenia, ja wciąż jestem pod wrażeniem. Konferencja była niejako podsumowaniem lokalnych spotkań <strong><a
rel="nofollow" target="_blank" href="http://meetjs.pl/#referrer=blog.vokiel.com" title="meet.js" target="_blank">meet.js</a></strong>. Są to niekomercyjne meetup&#8217;y front-endowców, na których prezentowane są prelekcje na tematy webowe (front-endowe), jts HTML, JS, CSS.</p><p><span
id="more-1016"></span></p><h2>Organizacja</h2><p>Konferencję zorganizowali <a
rel="nofollow" target="_blank" href="http://ferrante.pl/frontend/javascript/meet-js-summit-2012/#referrer=blog.vokiel.com" title="meet.js summit 2012" target="_blank">Damian Wielgosik</a> wraz z <a
rel="nofollow" target="_blank" href="http://poznan.gtug.pl/#referrer=blog.vokiel.com" title="GTUG Poznań" target="_blank">GTUG Poznań</a> oraz <a
rel="nofollow" target="_blank" href="http://startup-it.pl/#referrer=blog.vokiel.com" title="Startup-It.pl" target="_blank">Startup-It.pl</a>. Obsługa uczestników  przebiegała szybko i sprawnie, technicy pod ręką, wszyscy chętni do pomocy. Chylę czoła za jakość organizacji tego darmowego(!) eventu.</p><p><strong>Miejsce</strong>: Centrum Wykładowe Politechnki Poznańskiej &#8211; duży, przestronny, nowoczesny budynek, sale wykładowe, sporo wolnego miejsca na korytarzach. Dzięki temu prezentacje na były łatwiejsze w odbiorze, a duża przestrzeń na korytarzach spokojnie pomieściła te ponad 250 osób. Nawet podczas przerw kawowych czy lunchu.</p><p><strong>Gadżety</strong>: dużym zaskoczeniem była duża ilość gadżetów i nagród. Sponsorzy spisali się świetnie. Były naklejki meet.js i Front-Trends, smycze od Mozilli oraz Allegro Group, zniżki 10€ na konferencję Front-Trends 2012. Poza tym do zgarnięcia były kubki i koszulki Google, naklejki HTML5, koszulki Mozilli, Nodejitsu i HTML5, pendrive&#8217;y i smycze Nokii. Każdy dostał koszulkę, przy tym wartym wspomnienia jest, że można było zaprojektować własną lub zaproponować tekst do chmurki z komiksu. Wykazując się taką inwencją brało się udział w konkursie, w którym główną nagrodą był iPod!</p><p><img
src="http://blog.vokiel.com/wp-content/uploads/2012/01/meetjs_tshirts_650x228.jpg" alt="" title="meetjs t-shirts" width="650" height="228" class="aligncenter size-full wp-image-1026" /></p><p>To nie koniec, były ciastka, a do nich kawa i/lub herbata (woda dla unikających używek <img
src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). Był też lunch (3 dania do wyboru), tak jak reszta &#8211; darmowy. Po całodniowej konferencji nastąpiło zasłużone afterparty (dzięki Cognifide), na którym każdy z uczestników otrzymał kupony do wykorzystania w barze.</p><h2>Przebieg i prezentacje</h2><p>Całość rozpoczęła się od 10 rano (rejestracja od 9) a zakończyła następnego dnia w godzinach porannych w Alcatraz Club. Prezentacje były przeplatane z przerwami kawowymi oraz lunch&#8217;em. Był zatem czas na zmianę sali oraz przygotowanie dawki kofeiny.</p><p>Z racji dużej liczby prezentacji (18) całość została podzielona na 2 ścieżki. Osobiście nie przepadam za takimi rozwiązaniami bo czasem jest bardzo trudno się zdecydować, którą prelekcję wybrać. Z tego względu nie uczestniczyłem we wszystkich w których bym chciał. Na szczęście całość wystąpień była nagrywana, zatem jest szansa, że zobaczę te, które niestety ominąłem.</p><p>Prelekcje były różne, na różnym poziomie przygotowania merytorycznego i technicznego oraz językowego (wszystkie po angielsku). Niektórzy wypadli świetnie, inni nieco gorzej.</p><p>Po tygodniu, mocno w pamięci zostały prezentacje, m.in:</p><ul><li><strong>Marek Stępień</strong>: The Web is Open. Let&#8217;s keep it that way &#8211; ciekawie o inicjatywie Open Web</li><li><strong>Andrzej Mazur</strong>: CSS4 and the future of CSS &#8211; o nowinkach w przyszłych specyfikacjach CSS</li><li><strong>Kamil Trebunia</strong>: Game design patterns &#8211; live coding (oparty na revertach commitów), plus świetne komentarze <em>Now we have more time to enjoy the children dying.</em>, <em>Dying is something you can subscribe to</em></li><li><strong>Lukas Nowacki</strong>: Team building and development practices &#8211; o ulepszaniu programowania w stylu Tarantino jak przystało na prawdziwych <em>reservoir devs</em></li><li><strong>Aleksander Dąbrowski</strong>: Write once &#8211; use twice (Back &#038; Front) &#8211; o nie duplikowaniu, o nieduplikowaniu kodu</li><li><strong>Zef Hemel</strong>: Avoiding JavaScript Pitfalls Through Tree Hugging &#8211; o przytulaniu się do drzewa</li><li><strong>Bartosz Szopka</strong>: CSS 3D Transforms &#8211; za pomocą CSS 3D transforms &#8211; impress.js jest na prawdę <em>impressive</em></li><li><strong>Patrick H. Lauke</strong>: HTML5 multimedia &#8211; browser-native video, audio and canvas &#8211; o audio i viedeo  z niesamowitymi demami z wykorzystaniem kamery internetowej, elementu video i <a
href="http://blog.vokiel.com/kategoria/javascript" title="JavaScript">JavaScript</a></li></ul><h2>Podsumowanie</h2><p><a
href="http://blog.vokiel.com/wp-content/uploads/2012/01/meetjs_comic_1200x925.jpg"><img
src="http://blog.vokiel.com/wp-content/uploads/2012/01/meetjs_comic_1200x925-300x231.jpg" alt="" title="meetjs t-shirt comic" width="300" height="231" class="alignright size-medium wp-image-1028" /></a></p><p>Bardzo szybko zebrane prezentacje są do obejrzenia na profilu <a
rel="nofollow" target="_blank" href="https://plus.google.com/u/0/110191013153077917985/posts/5U4XmoQkQeR#referrer=blog.vokiel.com" title="All #meetjs summit slides gathered in one place" target="_blank">G+ GTUG&#8217;a</a>, z niecierpliwością czekam na nagrania.</p><p>Świetna impreza, miła atmosfera, sporo znajomych osób. Oczywiście była reprezentacja <a
rel="nofollow" target="_blank" href="http://forum.kohanaphp.pl#referrer=blog.vokiel.com" title="FORUM Polskiego Supportu KOHANA Framework" target="_blank">forum.kohanaphp.pl</a> &#8211; pzdr <a
rel="nofollow" target="_blank" href="http://mck.blip.pl/#referrer=blog.vokiel.com" title="mck" target="_blank">@mck</a>, <a
rel="nofollow" target="_blank" href="https://twitter.com/supernrm#referrer=blog.vokiel.com" title="supernrm" target="_blank">@nrm</a>). Był też <a
rel="nofollow" target="_blank" href="http://chemikpil.pl/#referrer=blog.vokiel.com" title="chemikpil" target="_blank">@chemikpl</a>, którego poznałem osobiście na ostatnim <a
rel="nofollow" target="_blank" href="http://blog.vokiel.com/wordcamp-poznan-2011-relacja" title="WordCamp Poznań 2011 – relacja">WordCamp&#8217;ie</a> i inni. Kolejny raz pojawiły się okazje do osobistego poznania tych, których kojarzyło się z neta, pozdr <a
href="http://wookieb.pl/#referrer=blog.vokiel.com" title="Łukasz Kużyński" target="_blank">@wokiebpl</a>, <a
rel="nofollow" target="_blank" href="http://blog.rbenkel.me/#referrer=blog.vokiel.com" title="Radosław Benkel" target="_blank">@singlespl</a> oraz <a
rel="nofollow" target="_blank" href="http://blog.end3r.com/187/relacja-z-meet-js-summit-z-punktu-widzenia-prelegenta/#referrer=blog.vokiel.com" title="Andrzej Mazur" target="_blank">@end3r</a>.</p><p>Inne relacje: <a
rel="nofollow" target="_blank" href="http://blog.end3r.com/187/relacja-z-meet-js-summit-z-punktu-widzenia-prelegenta/#referrer=blog.vokiel.com" title="Relacja z meet.js Summit z punktu widzenia prelegenta" target="_blank">end3r</a>, <a
rel="nofollow" target="_blank" href="http://ferrante.pl/frontend/javascript/meet-js-summit-2012/#referrer=blog.vokiel.com" title="meet.js summit 2012" target="_blank">ferrante</a>, <a
rel="nofollow" target="_blank" href="http://rubysfera.pl/2012/01/summit-meetjs-relacja/#referrer=blog.vokiel.com" title="Meetjs Summit – relacja" target="_blank">pavelloz</a>, <a
rel="nofollow" target="_blank" href="http://michalbe.blogspot.com/2012/01/meetjs-summit.html#referrer=blog.vokiel.com" title="MeetJS Summit" target="_blank">michalbe</a>, <a
rel="nofollow" target="_blank" href="http://jportal.pl/relacja-z-meetjs-summit-w-poznaniu.html#referrer=blog.vokiel.com" title="Relacja z meetJS summit w Poznaniu" target="_blank">jPortal.pl</a>, <a
rel="nofollow" target="_blank" href="http://chemikpil.pl/meet-js-summit-moja-relacja/#referrer=blog.vokiel.com" title="Meet.js Summit – moja relacja" target="_blank">ChemikPIL</a></p><p>Przygotowanie na najwyższym poziomie, pomimo iż cała impreza była darmowa. Jeszcze raz, wielkie brawa.</p> <img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/KjUGvJHuqGA" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://blog.vokiel.com/meet-js-summit-2012-relacja/feed</wfw:commentRss> <slash:comments>2</slash:comments> <feedburner:origLink>http://blog.vokiel.com/meet-js-summit-2012-relacja</feedburner:origLink></item> <item><title>WordCamp Poznań 2011 – relacja</title><link>http://feedproxy.google.com/~r/BlogVokielCom/~3/yN0e8UbkAcc/wordcamp-poznan-2011-relacja</link> <comments>http://blog.vokiel.com/wordcamp-poznan-2011-relacja#comments</comments> <pubDate>Mon, 12 Dec 2011 11:53:13 +0000</pubDate> <dc:creator>Vokiel</dc:creator> <category><![CDATA[WordPress]]></category> <category><![CDATA[css3]]></category> <category><![CDATA[event]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[konferencja]]></category> <category><![CDATA[wtyczki]]></category> <guid isPermaLink="false">http://blog.vokiel.com/?p=995</guid> <description><![CDATA[W dniach 9-10 grudnia w Poznaniu odbyła się kolejna konferencja z serii WordCamp. Tym razem, uczestniczyłem w konferencji jako prelegent.]]></description> <content:encoded><![CDATA[<div
id="attachment_996" class="wp-caption alignright" style="width: 210px"><a
rel="nofollow" target="_blank" href="http://2011.poznan.wordcamp.org/prelegenci/#robert-mikolajuk"><img
src="http://blog.vokiel.com/wp-content/uploads/2011/12/bylem-speakerem.jpg" alt="" title="WordCamp Poznań 2011" width="200" height="200" class="size-full wp-image-996" /></a><p
class="wp-caption-text">WordCamp Poznań 2011</p></div><p>W dniach 9-10 grudnia w Poznaniu odbyła się kolejna konferencja z serii <strong>WordCamp</strong>. Jak sama nazwa wskazuje jest to konferencja poświęcona WordPressowi. WordCampy są organizowane na całym świecie przez użytkowników WordPressa i dla użytkowników WordPressa. Poznańska edycja była organizowana przy aprobacie <a
rel="nofollow" target="_blank" href="http://central.wordcamp.org/#referrer=blog.vokiel.com" title="WordCamp Central">WordCamp Central</a> co niosło ze sobą kilka korzyści, ale też ogrom więcej pracy, z czym dzielnie poradził sobie <a
rel="nofollow" target="_blank" href="https://twitter.com/ludwiczakpawel#referrer=blog.vokiel.com">Paweł</a>. Grono zainteresowanych było bardzo duże. Tematy prelekcji zróżnicowane, każdy mógł znaleźć coś dla siebie.</p><p>Tym razem, uczestniczyłem w konferencji jako prelegent. W długiej, nudnej, mocno technicznej prezentacji opowiedziałem o tworzeniu wtyczek: <a
rel="nofollow" target="_blank" href="http://2011.poznan.wordcamp.org/session/tworzenie-wtyczek/#referrer=blog.vokiel.com">Tworzenie wtyczek &#8211; oszczędzaj swój czas</a> <small>(o tym w dalszej części)</small>.</p><p> <span
id="more-995"></span></p><h2>Organizacja</h2></p><p>Organizacyjnie event przygotowany był świetnie. Biorąc pod uwagę cenę wejściówki (40zł) poziom przerósł moje oczekiwania. Był pakiet dla każdego uczestnika, poza tym kawa, herbata, ciastka, woda i soki. Oczywiście nie zabrakło niespodzianek &#8211; pizza każdego dnia, RedBulle i middle-party w klubie Charyzma &#8211; gdzie Paweł przekazał uczestnikom multum kuponów na alko w barze.</p><p>Technicznie też było dobrze, jeden projektor trochę niedomagał, ale były dwa, więc to nie był żaden problem, nagłośnienie w porządku, baterie w mikrofonach wymieniane na bieżąco. Jako, że całość odbywała się na uczelnianej sali wykładowej warunki do prezentacji były bardzo dobre.</p><p>Nie obyło się bez losowania nagród w postaci książek, zniżek (99%), licencji na wtyczki.</p><h2>Przebieg</h2><p>Impreza rozpoczęła się właściwie w czwartek od preparty, dzięki której mogliśmy się dobrze zintegrować. <a
rel="nofollow" target="_blank" href="http://www.brotherspub.pl/#referrer=blog.vokiel.com">The Brothers Pub</a> było idealnym wyborem, niepowtarzalny klimat, niesamowita Orzechówka (Jurek Ty to potrafisz namówić <img
src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ), a te ciastka&#8230;</p><p>Następnego dnia wystartowaliśmy z prezentacjami. Ich przebieg możecie prześledzić w <a
rel="nofollow" target="_blank" href="http://2011.poznan.wordcamp.org/agenda/#referrer=blog.vokiel.com">Agendzie</a>. Prelekcje były różne, na różnym poziomie, skierowane do różnych odbiorców, na pewno każdy znalazł taką, która go zainteresowała.</p><p>Przerwy po każdym wykładzie dawały szansę omówienia tematu na świeżo, dopytania się o szczegóły, wymiany poglądów.</p><p>Po zakończeniu pierwszego dnia przyszedł czas na relaks i zabawę w świetnym gronie w klubie <a
rel="nofollow" target="_blank" href="http://www.charyzma.poznan.pl/#referrer=blog.vokiel.com" class="broken_link">Charyzma</a>. Nauczeni doświadczeniem, nie mogliśmy zakończyć wieczoru bez Orzechówki.</p><p>Następnego dnia, pomimo tego, że zaplanowaną godzina rozpoczęcia była 10, z racji bardzo udanego wieczoru nie była możliwa do zrealizowania. Na szczęście większość dała radę dotrzeć na 10:30, zatem udało się rozpocząć bez większych opóźnień.</p><h2>Prezentacje</h2><p>Wśród wielu interesujących prezentacji kilka szczególnie zwróciło moją uwagę. Ciekawa prezentacja <a
rel="nofollow" target="_blank" href="http://arek.bibliotekarz.com#referrer=blog.vokiel.com">Arka </a> <strong>Informacja Rulez!</strong>, która natchnęła mnie kilkoma pomysłami na wtyczki (jeśli jeszcze nie istnieją). Bardzo podobała mi się prezentacja <a
rel="nofollow" target="_blank" href="http://chemikpil.pl/#referrer=blog.vokiel.com">Michała</a> o błędach <abbr
title="Hyper-Text Markup Language v5">HTML5</abbr>, wyróżniała się profesjonalnym przygotowaniem i przeprowadzeniem, przy okazji dała mi motywację, aby wreszcie przepisać swojego bloga na html5. Ogromny zestaw wtyczek przedstawiła <a
rel="nofollow" target="_blank" href="http://seonaobcasach.pl/wordcamp-2011-relacja/#referrer=blog.vokiel.com">Magda</a> w swojej prezentacji o optymalizacji i pozycjonowaniu (czekam na slajdy). Na koniec dnia praktyczne informacje przedstawione w dwóch prezentacjach: o szablonach-dzieciach oraz o frameworkach w WordPress dały wiedzę o tym jak pracować wydajniej i szybciej.</p><p>Drugiego dnia najbardziej do gustu przypadła mi prezentacja <a
rel="nofollow" target="_blank" href="http://paulpela.com/#referrer=blog.vokiel.com">Pawła </a>o zarabianiu na WordPressie. Dużo praktycznej, popartej doświadczeniem wiedzy o pracy freelancera i młodego przedsiębiorcy. Świetnie przeprowadzona, bardzo motywująca. <a
rel="nofollow" target="_blank" href="http://godmode.biz/#referrer=blog.vokiel.com">Bartek</a> przypomniał o tym, że strona oparta na WordPress to nie tylko unikalny front-end, ale także mocno kastomizowany panel administracyjny. Dobrym dopełnieniem mojej prezentacji było wystąpienie <a
rel="nofollow" target="_blank" href="http://optart.pl/#referrer=blog.vokiel.com">Konrada</a> o lukach bezpieczeństwa.</p><h2>Moje wystąpnie</h2><p><a
href="http://blog.vokiel.com/wp-content/uploads/2011/12/identyfikator.jpg"><img
src="http://blog.vokiel.com/wp-content/uploads/2011/12/identyfikator-300x228.jpg" alt="" title="wordcamp-identyfikator" width="300" height="228" class="alignright size-medium wp-image-1001" /></a></p><p>Tematem mojej prezentacji było tworzenie wtyczek. W planie prezentacji był krótki wstęp o samym WordPress, o tym, że to właśnie system wtyczek jest jedną z głównych przyczyn jego funkcjonalności. Następnie pokazałem czym są wtyczki oraz na czym się opierają. Przed stworzeniem pierwszej wtyczki zaprezentowałem kilka ważnych rzeczy z zakresu organizacji pracy nad wtyczkami, zasad tworzenia, kilka zdań o podstawowych błędach. Dalej, pokazałem jak tworzyć wtyczki od podstaw, przechodząc przez najprostszą aktywność, aż do bardziej zaawansowanych integracji wtyczki z WordPressem. Pokazałem jak zaszczepić wtyczkę w kilku miejscach admin-panelu (kokpit, adminbar, menu, contextual help). Pokazałem jak obsłużyć bazę danych oraz system ustawień. Na koniec, po połączeniu wszystkich elementów, powstała dedykowana konferencji wtyczka.</p><p>Mam nadzieję, że prezentacja była ciekawa, interesująca. Czekam na komentarze, opinie, propozycje usprawnień.</p><p>Oczywiście udostępniam całą prezentację wraz z poszczególnymi etapami tworzenia wtyczki. Samą prezentację najlepiej przeglądać korzystając z przeglądarki wspierającej CSS3, w innych działanie może nie być do końca takie, jak powinno.</p><div
class="source_demo_container"> <a
rel="nofollow" target="_blank" href="/dema/wcpoz2011/wcpoz2011.zip" class="source" title="Źródła">Źródła</a><a
rel="nofollow" target="_blank" href="/dema/wcpoz2011/index.html" class="demo" title="Prezentacja">Prezentacja</a></div> <img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/yN0e8UbkAcc" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://blog.vokiel.com/wordcamp-poznan-2011-relacja/feed</wfw:commentRss> <slash:comments>12</slash:comments> <feedburner:origLink>http://blog.vokiel.com/wordcamp-poznan-2011-relacja</feedburner:origLink></item> <item><title>Klasa PHP rozwiązująca problem przynależności punktu do wielokąta</title><link>http://feedproxy.google.com/~r/BlogVokielCom/~3/jdzU1Dk7bTM/klasa-php-rozwiazujaca-problem-przynaleznosci-punktu-do-wielokata</link> <comments>http://blog.vokiel.com/klasa-php-rozwiazujaca-problem-przynaleznosci-punktu-do-wielokata#comments</comments> <pubDate>Mon, 12 Sep 2011 18:55:45 +0000</pubDate> <dc:creator>Vokiel</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[class]]></category> <category><![CDATA[geofencing]]></category> <category><![CDATA[planetaphp]]></category> <guid isPermaLink="false">http://blog.vokiel.com/?p=965</guid> <description><![CDATA[W poprzednim wpisie: Problem przynależności punktu do obszaru wielokąta omówiłem sposoby na sprawdzenie, czy dany punkt należy do obszaru wielokąta rozpiętego na punktach. W tym wpisie przedstawię gotowe rozwiązanie zaimplementowane w PHP.]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.vokiel.com/wp-content/uploads/2011/09/polygon_classphp-150x150.png" alt="Polygon.class.php" title="Polygon.class.php" width="150" height="150" class="alignright size-thumbnail wp-image-972" /><br
/> W poprzednim wpisie: <a
rel="nofollow" target="_blank" href="/problem-przynaleznosci-punktu-do-obszaru-wielokata">Problem przynależności punktu do obszaru wielokąta</a> omówiłem sposoby na sprawdzenie, czy dany punkt należy do obszaru wielokąta rozpiętego na punktach. W tym wpisie przedstawię gotowe rozwiązanie zaimplementowane w PHP.<br
/> Problem nie jest zbyt rozległy, zatem rozwiązaniem będzie tylko jedna klasa, oraz krótki przykład pokazujący jak z niej korzystać. Do tego jakieś małe demo.<br
/> <span
id="more-965"></span></p><div
class="source_demo_container"> <a
rel="nofollow" target="_blank" href="/dema/geofencing/inPolygon.class.php" class="source" title="Źródła">Źródła</a><a
rel="nofollow" target="_blank" href="/dema/geofencing/" class="demo" title="Demo">Demo</a></div><h2>Test przecięć</h2><p>Do wykonania testu przecięć potrzebna będzie tablica ze współrzędnymi badanego punktu, oraz tablica współrzędnych (podanych w kolejności) wierzchołków wielokąta. Tablice te przekażemy w konstruktorze.<br
/> Ważną rzeczą jest sprawdzenie czy ostatni i pierwszy element tablicy wierzchołków jest taki sam, czyli czy figura się zamyka. Jeśli nie to w konstruktorze uzupełniamy tablicę kopię pierwszego elementu.</p><p>Kolejnym etapem jest sprawdzenie czy punkt należy do do jednego z boków wielokąta.<br
/> Jeśli powyższe sprawdzenie się nie powiedzie rozpoczynamy właściwą część, tj. sprawdzenie przecięć. W tym celu tworzymy półprostą, tutaj równoległą do osi OX, rozpoczynającą się w sprawdzanym przez nas punkcie, a kończącą się w dowolnym punkcie poza ostatnim punktem wielokąta (najbardziej wysuniętym w kierunku grotu osi OX).</p><p>Po utworzeniu półprostej przechodzimy do właściwego badania przecięć. W pierwszej kolejności pod młotek idzie sprawdzenie zawierania się półprostej w jednym z boków wielokąta (rys. 3, rys. 4 <a
rel="nofollow" target="_blank" href="/problem-przynaleznosci-punktu-do-obszaru-wielokata">w poprzednim wpisie</a>). Aby to sprawdzić musimy przetestować czy kolejne 2 punkty wielokąta należą do tej półprostej. Jeśli tak się zdarzy to sprawdzamy, z którym przypadkiem mamy do czynienia (czy punkty leżą po tej samej, czy po przeciwnych stronach półprostej). Jeśli po przeciwnej &#8211; zwiększamy licznik przecięć.</p><p>Jeśli półprosta nie zawiera się w boku wielokąta trzeba sprawdzić czy przypadkiem nie przecina jego wierzchołka. Aby to osiągnąć sprawdzamy czy wierzchołek zawiera się w półprostej a zarazem czy poprzedni i następny już nie. Jeśli sprawdzanie się powiedzie to pozostaje rozpoznać, z którą wersją mamy do czynienia (rys. 5, rys. 6 <a
rel="nofollow" target="_blank" href="/problem-przynaleznosci-punktu-do-obszaru-wielokata">w poprzednim wpisie</a>). W zależności od wyniku, albo zwiększamy licznik przecięć, albo nie. Jeśli natomiast warunek zawierania się wierzchołka nie zostanie spełniony sprawdzamy czy bok wielokąta przecina półprostą, a zarazem poprzedni wierzchołek jej nie przecina, jak również następny.</p><h2>inPolygon.class.php</h2><div
class="wp_syntax"><table><tr><td
class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
</pre></td><td
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * @author Robert *Vokiel* Mikołajuk vokiel@vokiel.com http://blog.vokiel.com
 * @copyright (c) 2011 Robert Mikołajuk
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> inPolygon <span style="color: #009900;">&#123;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * @var	array	$point	Współrzędne prawdzanego punktu
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$point</span><span style="color: #339933;">;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * @var	array	$raypoint	Punkt końcowy półprostej od $this-&gt;point równoległej do osi OX
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$raypoint</span><span style="color: #339933;">;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * @var	array	$polygon	Tablica współrzędnych punktów
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$polygon</span><span style="color: #339933;">;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * @var	int	$crosses	Liczba przecięć odcinków
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$crosses</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 *
	 * @param array $point
	 * @param array $polygon
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$point</span><span style="color: #339933;">,</span><span style="color: #000088;">$polygon</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$point</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'x'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'y'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$polygon</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// jeśli ostatni element nie jest tożsamy z pierwszym, dodajemy go na końcu tablicy</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #990000;">array_push</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Sprawdzenie czy punkt zawiera się w obszarze
	 * @return bool
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> check<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// sprawdzenie czy punkt nie należy do jednego z boków wielokąta</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span>count<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setRaypoint</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">edgeCross</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">crosses</span> <span style="color: #339933;">%</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Wyznaczenie punktów półprostej równoległej do osi OX
	 * Współrzędna X punktu P1 musi być większa od największej wpsółrzędnej X wśród wszystkich wierzchołków wielokąta
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> setRaypoint<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span>count<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Wyliczenie ilości przecięć półprostej przez odcinki boków wielokąta
	 * Półprosta zostaje przeprowadzona od badanego punktu w prawo,
	 * aż za najbardziej wysunięty w prawo punkt wielokąta
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> edgeCross<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// wstawienie na koniec tablicy punktów wielokąta drugiego wierzchołka - dla ułatwienia obliczeń</span>
		<span style="color: #990000;">array_push</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// Prosta P-P1 zawiera się w boku wielokąta W($i,$i+1) </span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
				<span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">// Punkt wcześniejszy wielokątea i dalszy leżą po przeciwnej stronie prostej P-P1 - ilość przecięć: 1</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span>
					<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">crosses</span><span style="color: #339933;">++;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// Prosta P-P1 nie zawiera się w boku wielokąta</span>
				<span style="color: #666666; font-style: italic;">// Prosta P-P1 zawiera wierzchołek W($i)</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
					<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
					<span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">// Sprawdzenie położenia wierzhołków sąsiadujących z wierzchołkiem W($i)</span>
					<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'x'</span><span style="color: #339933;">=&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'y'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span>
						<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'x'</span><span style="color: #339933;">=&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'y'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
					<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
						<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">crosses</span><span style="color: #339933;">++;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">// Sprawdzenie czy prosta P-P1 przecina bok wilokąta W($i,$i+1)</span>
					<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">edgeCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
						<span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
							<span style="color: #009900;">&#40;</span>
								<span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
								<span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span>
							<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>
								<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'x'</span><span style="color: #339933;">=&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'y'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span>
								<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'x'</span><span style="color: #339933;">=&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'y'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
							<span style="color: #009900;">&#41;</span>
						<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span>
					<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
						<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">crosses</span><span style="color: #339933;">++;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 *
	 * Sprawdzenie czy $check_point należy do odcinka ($start_point|$stop_point)
	 * @param array $start_point	Punkt startowy odcinka
	 * @param array $stop_point 	Punkt końcowy odcinka
	 * @param array $check_point	Sprawdzany punkt
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> pointCrossEdge<span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point</span><span style="color: #339933;">,</span><span style="color: #000088;">$check_point</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$stop_point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$check_point</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;&amp;</span>
			<span style="color: #990000;">min</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span>
			<span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #990000;">max</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
			<span style="color: #990000;">min</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span>
			<span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #990000;">max</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Sprawdzenie czy odcinki $start_point_1-$stop_point_1 i $start_point_2-$stop_point_2 przecinają się
	 * @param array $start_point_1	Punkt startowy pierwszego odcinka
	 * @param array $stop_point_1	Punkt końcowy pierwszego odcinka
	 * @param array $start_point_2	Punkt startowy drugiego odcinka
	 * @param array $stop_point_2	Punkt końcowy drugiego odcinka
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> edgeCrossEdge<span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$start_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$start_point_2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$start_point_1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$start_point_2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$start_point_1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Wyznacznik macierzy kwadratowej stopnia 3
	 * @param array $start_point
	 * @param array $stop_point
	 * @param array $check_point
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> det<span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point</span><span style="color: #339933;">,</span><span style="color: #000088;">$check_point</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">/* druga metoda
		return ($start_point['x'] * $stop_point['y'] + $stop_point['x'] * $check_point['y'] + $check_point['x'] * $start_point['y'] - $check_point['x'] * $stop_point['y'] - $start_point['x'] * $check_point['y'] - $stop_point['x'] * $start_point['y']);
		*/</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Określenie znaku liczby
	 * @param int $x	Liczba
	 * @return int $x
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> sng<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$x</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$x</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">// end of inPolygon class</span></pre></td></tr></table></div><p>Na koniec przydałoby się napisać jakieś demo. Wkrótce się pojawi.</p> <img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/jdzU1Dk7bTM" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://blog.vokiel.com/klasa-php-rozwiazujaca-problem-przynaleznosci-punktu-do-wielokata/feed</wfw:commentRss> <slash:comments>4</slash:comments> <feedburner:origLink>http://blog.vokiel.com/klasa-php-rozwiazujaca-problem-przynaleznosci-punktu-do-wielokata</feedburner:origLink></item> <item><title>Problem przynależności punktu do obszaru wielokąta</title><link>http://feedproxy.google.com/~r/BlogVokielCom/~3/Ur5J4PwYFYM/problem-przynaleznosci-punktu-do-obszaru-wielokata</link> <comments>http://blog.vokiel.com/problem-przynaleznosci-punktu-do-obszaru-wielokata#comments</comments> <pubDate>Mon, 12 Sep 2011 18:16:50 +0000</pubDate> <dc:creator>Vokiel</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[geofencing]]></category> <category><![CDATA[planetaphp]]></category> <guid isPermaLink="false">http://blog.vokiel.com/?p=883</guid> <description><![CDATA[We wpisie postaram się przedstawić sposób na rozwiązanie problemu przynależności punktu do obszaru wielokąta (opisanego przez zbiór wierzchołków).]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.vokiel.com/wp-content/uploads/2011/09/polygon-150x150.png" alt="Wielokąt wklęsły" title="Polygon" width="150" height="150" class="alignright size-thumbnail wp-image-891" /><br
/> W życiu programisty pojawiają się sytuacje, gdy programowanie styka się bardzo blisko z matematyką, w tym przypadku z geometrią. We wpisie postaram się przedstawić sposób na rozwiązanie problemu przynależności punktu do obszaru wielokąta (opisanego przez zbiór wierzchołków).<br
/> <span
id="more-883"></span></p><h2>Geofencing</h2><p>Ostatnio mam dość mało czasu na pisanie na blogu. Jest to związane przede wszystkim z lenistwem, a w drugiej mierze z mojego udziału w jednym, ciekawym projekcie. Z owym projektem wiąże się dzisiejszy wpis. W aplikacji tej zaplanowaliśmy ciekawą funkcjonalność: geofencing, czyli:</p><blockquote><p>Geofencing is a term utilized primarily in the corporate world that refers to the practice of limiting mobile employees to a specific geographic location by tracking their whereabouts via the technology of a global positioning system (GPS).</p></blockquote><p>W telegraficznym skrócie polega to na wyznaczeniu bezpiecznego obszaru, po którym może poruszać się urządzenie z zainstalowanym modułem <abbr
title="Global Positioning System">GPS</abbr>.</p><p>Zastosowań jest wiele, począwszy od śledzenia pracowników, po zabezpieczenia przesyłek. Przy wszystkich zastosowaniach pojawia się ta sama potrzeba sprawdzenia, czy raportowany z urządzenia GPS punkt znajduje się w obrębie zdefiniowanego obszaru, czy jest już poza nim. Możliwości sprawdzenia przynależności punktu do wielokąta jest wiele.</p><h2>Przynależność do figury prostej</h2><p>W najprostszym przypadku prostokąta sprowadza się do prostego, matematycznego porównania współrzędnych wierzchołków i sprawdzanego punktu. Nie wymaga skomplikowanych obliczeń, tym bardziej geometrycznych. Niestety sposób mało przydatny w realnym zastosowaniu. Kazać użytkownikom rysować prostokąty wzdłuż trasy Warszawa &#8211; Moskwa może kwalifikować się na nagrodę <strong>Worst UX</strong>. Dzielenie narysowanego skomplikowanego wielokąta na małe prostokąty, następnie sprawdzanie przynależności punktu do każdego z nich też nie wydaje się optymalnym rozwiązaniem.</p><h2>Metody dla dowolnego wielokąta</h2><p>Przeszukując otchłanie Internetu można napotkać rozważania nad różnymi metodami na rozwiązanie tego zagadnienia. Kilka z nich zebrał Eric Haines w artykule <a
rel="nofollow" target="_blank" href="http://erich.realtimerendering.com/ptinpoly/#referrer=blog.vokiel.com" title="Point in Polygon Strategies">Point in Polygon Strategies</a>.<br
/><div
id="attachment_894" class="wp-caption alignright" style="width: 160px"><img
src="http://blog.vokiel.com/wp-content/uploads/2011/09/suma_katow-150x150.png" alt="Metoda sumy kątów" title="suma_katow" width="150" height="150" class="size-thumbnail wp-image-894" /><p
class="wp-caption-text">źródło: erich.realtimerendering.com</p></div></p><h3>Suma kątów</h3><p>Ta metoda polega na zliczeniu sumy kątów liczonych od sprawdzanego punktu do poszczególnych wierzchołków z bokiem wychodzącym z tego wierzchołka. Jeśli suma tych kątów będzie bliska zeru to punkt będzie poza wielokątem, w przeciwnym wypadku będzie do niego należał. Niestety z powodu wykorzystania funkcji trygonometrycznych, konieczności wyznaczenia prostej od każdego wierzchołka do szukanego punktu i wyliczenia dla nich kątów, jest to metoda bardzo powolna.</p><p>&nbsp;</p><h3>Metoda trójkątów</h3><div
id="attachment_895" class="wp-caption alignleft" style="width: 160px"><img
src="http://blog.vokiel.com/wp-content/uploads/2011/09/test_trojkatow-150x150.png" alt="Test trójkątów" title="test_trojkatow" width="150" height="150" class="size-thumbnail wp-image-895" /><p
class="wp-caption-text">źródło: erich.realtimerendering.com</p></div><p>Kolejna, dość obciążająca metoda, polega na podzieleniu wielokąta na trójkąty składowe. Następnie sprawdza się dla każdego z tak utworzonych trójkątów, czy punkt leży w jego obrębie. Jeśli mamy do czynienia z wielokątem wypukłym pierwsze trafienie automatycznie przerywa proces sprawdzania. W celu przyśpieszenia algorytmu można posortować utworzone trójkąty względem wielkości powierzchni lub długości boków. Zwiększy to szansę na wcześniejsze trafienie dopasowania, zmniejszając przy tym liczbę powtórzeń pętli.<br
/> Dla wielokątów niewypukłych należy przejść przez wszystkie trójkąty, przy tym zliczyć trafienia. Jeśli ich liczba jest nieparzysta, oznacza to, że punkt zawiera się w obrębie figury.</p><div
id="attachment_905" class="wp-caption alignright" style="width: 160px"><a
rel="nofollow" target="_blank" href="http://commons.wikimedia.org/wiki/File:BSP_tree-example.svg#referrer=blog.vokiel.com"><img
src="http://blog.vokiel.com/wp-content/uploads/2011/09/bsp_tree-150x150.png" alt="" title="bsp_tree" width="150" height="150" class="size-thumbnail wp-image-905" /></a><p
class="wp-caption-text">CC-BY-SA-3.0,2.5,2.0,1.0; GNU by Wojciech mula</p></div><p>&nbsp;</p><h3>BSP-tree</h3><p>Za pomocą tej metody można opisywać wielokąty i szybko stwierdzać przynależność punktu. Proces tworzenia jest niestety dość wolny, zatem powinno się je stosować, gdy występuje sprawdzanie wielu punktów do jednego wielokąta.<br
/> Korzystając z tej metody bada się, po której stronie linii na której leży odcinek zapisany w węźle znajduje się testowany punkt. W zależności od tego sprawdza się lewe, bądź prawe poddrzewo. Badanie rozpoczyna się od korzenia. Procedura kończy się wraz z natknięciem się na puste wskazanie.</p><h2>Test przecięć</h2><p><div
class="wp-caption alignright" style="width: 230px"><div
id="przeciecia_canvas" style="position: relative; height: 190px; width: 210px; border: 1px solid red; margin: 10px;" class="alignright"></div><p><p
class="wp-caption-text">Rys. 1</p></div> Test przecięć był moim pierwszym (w zasadzie jedynym) pomysłem, który zrodził się w głowie w drodze do domu (jak zwykle jak jest pomysł, to nie ma go czym, jak i gdzie zapisać <img
src='http://blog.vokiel.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> ). Jak tylko dotarłem do domu przelałem idee na papier &#8211; ołówek i notes to ciągle najlepszy sposób na projektowanie;). W trakcie obmyślania sposobu pojawiło się kilka wątpliwości w specyficznych sytuacjach, bardziej skomplikowanych modelach. Po konsultacji z jednym z <a
rel="nofollow" target="_blank" href="http://anadoxin.org/blog/#referrer=blog.vokiel.com" title="0xcafebabe per aspera ad astra">najlepszych programistów</a> jakich znam, miałem zaplanowaną całość rozwiązania. Powstała przy tym seria rysunków na <a
rel="nofollow" target="_blank" href="http://draw.to/D4D8c78#referrer=blog.vokiel.com">draw.to</a> <img
src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> Jak zauważył Antonone, moje twierdzenie o <a
rel="nofollow" target="_blank" href="http://pl.wikipedia.org/wiki/Krzywa_Jordana#Twierdzenie_Jordana-Sch.C3.B6nfliesa">Krzywej Jordana</a> zostało już opisane.</p><p>W związku z tym postanowiłem sprawdzić czy istnieje już gotowe rozwiązanie w PHP. Takowego nie znalazłem, ale pojawiło się kilka artykułów, które pomogły mi zweryfikować moją metodę.</p><div
class="wp-caption alignright" style="width: 230px"><div
id="wielokat_wypukly" style="position: relative; height: 170px; width: 210px; border: 1px solid red; margin: 10px;" class="alignright"></div><p><p
class="wp-caption-text">Rys. 2</p></div><h3 title="Figurą wypukłą nazywamy taką figurę, w której każde dwa punkty wyznaczają odcinek zawarty w tej figurze.">Wielokąt wypukły</h3><p>Jeśli mamy do czynienia z wielokątem wypukłym jest troszeczkę łatwiej. Wystarczy poprowadzić półprostą ze sprawdzanego punktu w wybranym kierunku do punktu położonego poza ostatnim, najdalej wysuniętym w tym kierunku, wierzchołkiem wielokąta. Następnie wystarczy policzyć ilość przecięć półprostej z bokami figury (rys. 2). Jeśli liczba ta będzie nieparzysta &#8211; punkt znajduje się wewnątrz wielokąta, jeśli parzysta lub jest równa 0 &#8211; punkt znajduje się poza wielokątem.</p><h3>Dowolny wielokąt</h3><p>W przypadku dowolnego wielokąta trzeba liczyć się z pojawieniem się figury wklęsłej (najprawdopodobniej takie będą pojawiały się najczęściej). Tutaj postępowanie jest trochę inne.</p><p>W pierwszej kolejności dobrze jest sprawdzić, czy sprawdzany punkt należy do jednego z boków lub wierzchołków figury. Jeśli nie, to należy poprowadzić półprostą, równoległa do którejś osi (np OX), poprowadzonej ze sprawdzanego punktu, do punktu położonego poza ostatnim, najdalej wysuniętym w kierunku grotu osi, wierzchołkiem wielokąta. Sprawdzany punkt będzie leżał wewnątrz wielokąta, jeśli przeprowadzona z niego półprosta przecina jego boki nieparzystą ilość razy.</p><p>Przy wielokątach wklęsłych należy rozpatrzyć kilka szczególnych przypadków:</p><h3>Półprosta zawiera się w jednym z boków wielokąta</h3><p><div
class="wp-caption alignright" style="width: 200px"><div
id="polprosta_1" style="position: relative; border: 1px solid red; width: 180px; height: 150px; margin: 10px;" class="alignright"></div><p><p
class="wp-caption-text">Rys. 3</p></div><br
/> Może zdarzyć się, że przeprowadzona ze sprawdzanego punktu półprosta będzie przechodziła przez jeden z boków wielokąta (rys. obok). Przy sprawdzaniu zawierania się półprostej w odcinkach nastąpi wielokrotne mylne przyporządkowanie: półprosta przetnie odcinek A-B, B-C, C-D. Po głębszym zastanowieniu widzimy, że zliczanie tych przecięć nie ma sensu. Figura w tej sytuacji może dążyć do połączenia wierzchołków ponad wytyczoną półprostą lub przecinając ją. Jeśli połączy się ponad (tak jakbyśmy połączyli wierzchołki A-D) to szukany punkt będzie poza figurą. Jeśli połączy się pod, to punkt będzie w środku figury jednak będzie musiało nastąpić jeszcze przynajmniej jedno przecięcie półprostej z bokiem wielokąta.<br
/> Zatem w przypadku, gdy linie łączące się z odcinkiem, przez który przechodzi półprosta będą po jej jednej stronie liczba zliczonych przecięć będzie wynosiła zero.<div
class="wp-caption alignright" style="width: 200px"><div
id="polprosta_2" style="position: relative; border: 1px solid red; width: 180px; height: 150px; margin: 10px;"></div><p><p
class="wp-caption-text">Rys. 4</p></div></p><p>&nbsp;</p><p>W drugiej sytuacji (rys. obok), gdy linie przez które przechodzi półprosta będą po jej przeciwnych stronach zliczamy takie przecięcia jako jedno.<br
/> Tutaj podobnie jak powyżej, jeśli wierzchołki dążą do połączenia obejmując sprawdzany punkt w obręb wielokąta (w naszym przypadku po lewej stronie sprawdzanego punktu), to otrzymujemy nieparzystą liczbę przecięć. Jeśli natomiast złączą się poza punktem (w naszym przypadku po stronie grotu osi OX), to nastąpi przynajmniej jeszcze jedno przecięcie, zatem suma przecięć będzie parzysta &#8211; punkt poza wielokątem.</p><p>&nbsp;</p><h3>Półprosta przechodzi przez wierzchołek wielokąta</h3><p><div
class="wp-caption alignright" style="width: 200px"><div
id="polprosta_wierzcholek_1" style="position: relative; border: 1px solid red; width: 180px; height: 150px; margin: 10px; clear:right;"></div><p><p
class="wp-caption-text">Rys. 5</p></div><br
/> W ostatniej ewentualności półprosta przecina wierzchołek wielokąta. Podobnie jak wcześniej są dwie, możliwe do wystąpienia sytuacje. Pozostałe punkty boków wychodzących z przecinanego wierzchołka znajdują się po jej przeciwnych stronach (rys. 5) lub znajdują się po tej samej stronie (rys. 6).<div
class="wp-caption alignleft" style="width: 200px"><div
id="polprosta_wierzcholek_2" style="position: relative; border: 1px solid red; width: 180px; height: 150px; margin: 10px;"></div><p><p
class="wp-caption-text">Rys. 6</p></div><br
/> W pierwszym przypadku liczymy jedno przecięcie pomimo, że punkt przechodzi przez dwa boki (A-B oraz B-C).<br
/> W drugim przypadku nie zaliczamy żadnego przecięcia.</p><div
class="clear">&nbsp;</div><h2>Implementacja</h2><p>Kiedy mamy już wszystko przemyślane, można przystąpić do implementacji rozwiązania w PHP. Jako, że ten wpis jest już i tak bardzo długi, rozwiązanie przeniosłem do kolejnego: <a
rel="nofollow" target="_blank" href="/klasa-php-rozwiazujaca-problem-przynaleznosci-punktu-do-wielokata" title="Klasa PHP rozwiązująca problem przynależności punktu do wielokąta">Klasa PHP rozwiązująca problem przynależności punktu do wielokąta</a>.</p><p><br
/></p> <img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/Ur5J4PwYFYM" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://blog.vokiel.com/problem-przynaleznosci-punktu-do-obszaru-wielokata/feed</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://blog.vokiel.com/problem-przynaleznosci-punktu-do-obszaru-wielokata</feedburner:origLink></item> <item><title>PHPCon PL – Druga Edycja</title><link>http://feedproxy.google.com/~r/BlogVokielCom/~3/LTIN74AtkDY/phpcon-pl-druga-edycja</link> <comments>http://blog.vokiel.com/phpcon-pl-druga-edycja#comments</comments> <pubDate>Sat, 28 May 2011 10:31:12 +0000</pubDate> <dc:creator>Vokiel</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[conference]]></category> <category><![CDATA[phpcon]]></category> <category><![CDATA[pl]]></category> <guid isPermaLink="false">http://blog.vokiel.com/?p=873</guid> <description><![CDATA[Ostatnimi czasy uczestniczyłem głównie w spotkaniach o JavaScript (Falsy Values, zaawansowany js), Front-Endowych (Front-Trends), konferencjach dotyczących bezpieczeństwa (ConFidence). Dla równowagi front-endu z back-endem wypadałoby wybrać się wreszcie na coś związanego z PHP. Na przeciw moim potrzebom wyszli organizatorzy PHPCon. PHPCon Poland PHPCon Poland to ogólnopolskie spotkanie konferencyjne programistów i entuzjastów języka PHP, organizowane siłami wolontariuszy [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://blog.vokiel.com/wp-content/uploads/2011/05/phpcon-logo.png"><img
src="http://blog.vokiel.com/wp-content/uploads/2011/05/phpcon-logo.png" alt="phpcon-logo" title="phpcon-logo" width="173" height="44" class="alignright size-full wp-image-875" /></a><br
/> Ostatnimi czasy uczestniczyłem głównie w spotkaniach o JavaScript (<a
rel="nofollow" target="_blank" href="http://blog.vokiel.com/falsy-values-conference-the-day-after?lang=en">Falsy Values</a>, <a
href="http://ferrante.pl/frontend/javascript/szkolenie-z-zaawansowanego-javascript-w-warszawie/#referrer=blog.vokiel.com" title="Szkolenie z zaawansowanego JavaScriptu w Warszawie">zaawansowany js</a>), Front-Endowych (<a
href="http://blog.vokiel.com/front-trends-2010-conference-review?lang=en">Front-Trends</a>), konferencjach dotyczących bezpieczeństwa (<a
href="http://blog.vokiel.com/confidence-2010-it-security-event-relacja">ConFidence</a>). Dla równowagi front-endu z back-endem wypadałoby wybrać się wreszcie na coś związanego z PHP. Na przeciw moim potrzebom wyszli organizatorzy PHPCon.<br
/> <span
id="more-873"></span></p><h2>PHPCon Poland</h2><p>PHPCon Poland to ogólnopolskie spotkanie konferencyjne programistów i entuzjastów języka PHP, organizowane siłami wolontariuszy internetowych z całego kraju pod egidą zarządu stowarzyszenia <a
rel="nofollow" target="_blank" href="http://www.linux.org.pl/#referrer=blog.vokiel.com">Polska Grupa Użytkowników Linuxa (PLUG)</a>. Jej celem jest integracja środowisk osób związanych z PHP oraz środowiska biznesowego zainteresowanego praktycznym wykorzystaniem tego języka w projektach komercyjnych.</p><p>PHPCon PL to świetna okazja, by nawiązać nowe kontakty, wymienić doświadczenia i pomysły na przyszłość. Impreza ta jest skierowana zarówno dla profesjonalistów, jak i osób, które dopiero od jakiegoś czasu zajmują się PHP. Dzięki zróżnicowanej agendzie, konferencja daje możliwość ugruntowania lub poszerzenia swojej wiedzy w wybranych tematach.</p><p>PHPCon PL ma tak jak co roku charakter niekomercyjnego spotkania sympatyków PLUG. Dla osób, które z różnych przyczyn potrzebują faktury, odbywa się – już zupełnie komercyjnie – spotkanie o tej samej nazwie, w tym samym miejscu i czasie, ale organizowane i fakturowane przez firmę obsługującą klientów biznesowych.</p><h2>PHPCon Poland 2011</h2><p>Przygotowania do PHPCon ruszyły pełną parą. To już druga edycja konferencji PHPCon PL. Na <a
rel="nofollow" target="_blank" href="http://matipl.pl/2010/05/27/phpcon-poland-2010-jak-bylo/#referrer=blog.vokiel.com">blogu Mateusza Kamińskiego</a> oraz u <a
rel="nofollow" target="_blank" href="http://eriz.pcinside.pl/weblog/phpcon-2010-subiektywnym-okiem-226.html#referrer=blog.vokiel.com">Przemka &#8222;eRiza&#8221; Pawliczuka</a> oraz u <a
rel="nofollow" target="_blank" href="http://www.zyxist.com/pokaz.php/phpcon_2010_poland#referrer=blog.vokiel.com">Tomka &#8222;ZyXa&#8221; Jędrzejewskiego</a> możecie poczytać <a
rel="nofollow" target="_blank" href="http://www.phpcon.pl/2010/#referrer=blog.vokiel.com">jak było w roku 2010</a>.</p><p>Co nam przyniesie tegoroczna edycja? Przede wszystkim warto wspomnieć o gościu specjalnym, którym w tym roku jest <a
rel="nofollow" target="_blank" href="http://www.lornajane.net/#referrer=blog.vokiel.com">Lorna ‘LornaJane’ Mitchell</a>. LornaJane jest znaną konsultantką PHP, webdeveloperką, publikatorką i prelegentką z Leeds w UK.</p><h3>Czas i miejsce</h3><p>PHPCon 2011 odbędzie się w dniach 21 &#8211; 23 października w miejscowości Mąchocice Kapitulne (rejon Gór Świętokrzyskich). Miejscem wystąpień będzie położony niedaleko Kielc <a
rel="nofollow" target="_blank" href="http://www.hotelprzedwiosnie.pl/#referrer=blog.vokiel.com">Hotel Przedwiośnie ***</a>.<br
/> Zapisy uczestników zostaną otwarte po 15 lipca.</p><h3>Call For Papers</h3><p>Do 15 lipca zbierane są propozycje wystąpień. W związku z tym, organizatorzy zachęcają wszystkich, którzy mają ciekawy temat do zaprezentowania, do zgłoszenia swojej propozycji. Najciekawsze są oczywiście tematy nietuzinkowe, trudne do znalezienia w podręcznikach czy internecie. Są już pierwsze zgłoszenia z zagranicy, zatem można się spodziewać, że w tym roku poziom merytoryczny będzie na pewno wyższy, niż w roku ubiegłym.<br
/> CFP można nadsyłać korzystając z formularza propozycji prelekcji na stronie <a
rel="nofollow" target="_blank" href="http://www.phpcon.pl/2011/pl/aglista#referrer=blog.vokiel.com">http://www.phpcon.pl/2011/pl/aglista</a></p><p>Do tych co wybierają się na PHP Con 2011 &#8211; do zobaczenia w październiku!</p> <img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/LTIN74AtkDY" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://blog.vokiel.com/phpcon-pl-druga-edycja/feed</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://blog.vokiel.com/phpcon-pl-druga-edycja</feedburner:origLink></item> <item><title>Falsy Values Conference – The Day After</title><link>http://feedproxy.google.com/~r/BlogVokielCom/~3/ecuFJzqI2Ns/falsy-values-conference-the-day-after</link> <comments>http://blog.vokiel.com/falsy-values-conference-the-day-after#comments</comments> <pubDate>Sat, 21 May 2011 23:32:09 +0000</pubDate> <dc:creator>Vokiel</dc:creator> <category><![CDATA[JavaScript]]></category> <category><![CDATA[conference]]></category> <category><![CDATA[css3]]></category> <category><![CDATA[event]]></category> <guid isPermaLink="false">http://blog.vokiel.com/?p=836</guid> <description><![CDATA[Falsy Values === A True JavaScript Event took place in Warsaw, Poland. Again Paweł Czerski and Damian Wielgosik prepared high-level front-end conference.]]></description> <content:encoded><![CDATA[<p>Ten wpis jest dostępny wyłącznie w języku: <a
href="http://blog.vokiel.com/feed?lang=en">English</a>.</p> <img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/ecuFJzqI2Ns" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://blog.vokiel.com/falsy-values-conference-the-day-after/feed</wfw:commentRss> <slash:comments>4</slash:comments> <feedburner:origLink>http://blog.vokiel.com/falsy-values-conference-the-day-after</feedburner:origLink></item> <item><title>Najważniejsze selektory CSS2</title><link>http://feedproxy.google.com/~r/BlogVokielCom/~3/lOWkAvCSUPM/najwazniejsze-selektory-css2</link> <comments>http://blog.vokiel.com/najwazniejsze-selektory-css2#comments</comments> <pubDate>Sun, 30 Jan 2011 19:52:51 +0000</pubDate> <dc:creator>Vokiel</dc:creator> <category><![CDATA[CSS]]></category> <category><![CDATA[css selectors]]></category> <category><![CDATA[selektory]]></category> <guid isPermaLink="false">http://blog.vokiel.com/?p=772</guid> <description><![CDATA[Pisząc aplikacje internetowe najczęściej opieramy się na podstawowych, często występujących selektorach CSS. Są to głównie selektory id, atrybutu class oraz potomka, plus pseudo-selektory, np :hover. Pliki .css w wielu projektach są pisane dość zachowawczo. Warto zatem zapoznać się z większą liczbą możliwości, które czasami mogą usprawnić pisanie reguł, zmniejszyć objętość kodu, ograniczyć ilość reguł.]]></description> <content:encoded><![CDATA[<div
id="attachment_777" class="wp-caption alignright" style="width: 210px"><img
class="size-full wp-image-777" title="css-is-awesome" src="http://blog.vokiel.com/wp-content/uploads/2010/11/css-is-awesome1.jpg" alt="" width="200" height="194" /><p
class="wp-caption-text">CSS Is Awesome by Steven Frank (http://stevenf.tumblr.com/)</p></div><p>Pisząc aplikacje internetowe najczęściej opieramy się na podstawowych, często występujących selektorach <abbr
title="Cascading Style Sheets">CSS</abbr>. Są to głównie selektory <strong>id</strong>, atrybutu <strong>class</strong> oraz potomka, plus pseudo-selektory, np <strong>:hover</strong>. Pliki .css w wielu projektach są pisane dość zachowawczo. Warto zatem zapoznać się z większą liczbą możliwości, które czasami mogą usprawnić pisanie reguł, ograniczych ich ilość, zmniejszyć objętość kodu.</p><p><span
id="more-772"></span></p><h2>Najczęściej stosowane selektory</h2><ol
class="nice-list"><li><a
rel="nofollow" target="_blank" title="Selektor uniwersalny" href="#selektor-uniwersalny">Uniwersalny</a></li><li><a
rel="nofollow" target="_blank" title="Selektor typu" href="#selektor-typu">Typu</a></li><li><a
rel="nofollow" target="_blank" title="Selektor identyfikatora" href="#selektor-identyfikatora">Identyfikatora</a></li><li><a
rel="nofollow" target="_blank" title="Selektor klasy" href="#selektor-klasy">Klasy</a></li></ol><h2>Łączniki, selektory atrybutów</h2><ol
class="nice-list"><li><a
rel="nofollow" target="_blank" title="Selektor potomka" href="#selektor-potomka">Potomek</a></li><li><a
rel="nofollow" target="_blank" title="Selektor dziecka" href="#selektor-dziecka">Dziecko</a></li><li><a
rel="nofollow" target="_blank" title="Selektor rodzeństwa" href="#selektor-rodzenstwa">Rodzeństwo</a></li><li><a
rel="nofollow" target="_blank" title="Selektor atrybutu" href="#selektor-atrybutu">Selektor atrybutu</a></li></ol><h2>Pseudo-klasy, pseudo-elementy</h2><ol
class="nice-list"><li><a
rel="nofollow" target="_blank" title="Pseudo-klasa :first-child" href="#pseudo-klasa-first-child">Pseudo-klasa :first-child</a></li><li><a
rel="nofollow" target="_blank" title="Pseudo-klasy linków" href="#pseudo-klasy-linkow">Pseudo-klasy linków :link i :visited</a></li><li><a
rel="nofollow" target="_blank" title="Dynamiczne pseudo-klasy" href="#dynamiczne-pseudo-klasy">Dynamiczne pseudo-klasy :hover, :acitve, :focus</a></li><li><a
rel="nofollow" target="_blank" title="Pseudo-klasy języka" href="#pseudo-klasy-jezyka">Pseudo-klasy języka :lang</a></li><li><a
rel="nofollow" target="_blank" title="Pseudo-elementy" href="#pseudo-elementy">Pseudo-elementy :first-line, :first-letter, :before i :after</a></li></ol><h2>Najczęściej stosowane selektory</h2><p><a
id="selektor-uniwersalny" name="selektor-uniwersalny"></a></p><h3>Uniwersalny</h3><p>Selektor uniwersalny pasuje do wszystkich elementów (każdego typu), zastosowany najprostszy metaznak <code
class="b">*</code> (asterisk) oznaczający dowolne dopasowanie.</p><p>Jeśli selektor uniwersalny jest jednym z kilku składników wyrażenia, to można go pominąć. <code
class="b">*.mojaklasa</code> będzie równoważne z <code
class="b">.mojaklasa</code>.</p><p>Obecnie stosuje się go najczęściej w przypadku dyrektyw resetujących <strong>Reset CSS</strong>.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;"><span style="color: #00AA00;">*</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;strong&gt;Ten element zostanie dopasowany&lt;/strong&gt;
&lt;div&gt;Ten element też zostanie dopasowany&lt;/div&gt;</pre></div></div><p><a
id="selektor-typu" name="selektor-typu"></a></p><h3>Typu</h3><p>Selektor typu dopasowuje elementy drzewa DOM po nazwie. Wybiera wszystkie elementy danego typu w całym drzewie dokumnetu.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">div <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">solid</span> <span style="color: #993333;">silver</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;div&gt;Ten element zostanie dopasowany&lt;/div&gt;
&lt;strong&gt;Ten element nie zostanie dopasowany&lt;/strong&gt;</pre></div></div><p><a
id="selektor-identyfikatora" name="selektor-identyfikatora"></a></p><h3>Identyfikatora</h3><p>Selektor identyfikatora poprzedza się znakiem <code
class="b">#</code>. Pobiera on element o id równym podanemu ciągowi znaków po #. Z definicji w dokumencie może występować tylko jeden element o danym id. Zatem selektor identyfikatora pobiera tylko jeden element.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#identyfikator</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;strong id=&quot;identyfikator&quot;&gt;Ten element zostanie dopasowany&lt;/strong&gt;
&lt;div&gt;Ten element nie zostanie dopasowany&lt;/div&gt;</pre></div></div><p><a
id="selektor-klasy" name="selektor-klasy"></a></p><h3>Klasy</h3><p>Selektor klasy w przeciwieństwie do selektora identyfikatora nie musi być unikalny, zatem swoim zasięgiem może obejmować więcej niż jeden element. Dopasowuje elementy na podstawie atrybutu class. Selektor poprzedza się znakiem <code
class="b">.</code> Jest niezależny od typu czy identyfikatora.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.klasa</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;strong class=&quot;klasa&quot;&gt;Ten element zostanie dopasowany&lt;/strong&gt;
&lt;div&gt;Ten element nie zostanie dopasowany&lt;/div&gt;</pre></div></div><p>Wartym uwagi jest fakt łączenia kilku selektorów klasy dla jednego elementu. Działanie to ma na celu wyłuskanie tylko tych elementów, które zawierają wszystkie z podanych klas.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.zolty</span><span style="color: #6666ff;">.niebieski</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">green</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;strong class=&quot;zolty niebieski&quot;&gt;Ten element zostanie dopasowany&lt;/strong&gt;
&lt;strong class=&quot;zolty&quot;&gt;Ten element nie zostanie dopasowany&lt;/strong&gt;
&lt;strong class=&quot;niebieski&quot;&gt;Ten element nie zostanie dopasowany&lt;/strong&gt;</pre></div></div><h2>Łączniki, selektory atrybutów</h2><p>Wszystkie poniższe selektory z wyjątkiem ostatniego są przez niektórych określane łącznikami, czyli selektorami powstałymi poprzez połączenie ze sobą dwóch lub więcej selektorów podstawowych.</p><p>Łączenie następuje poprzez zastosowanie znaków białych (spacje) znaku <code
class="b">&amp;gt;</code> oraz <code
class="b">+</code>.</p><p><a
id="selektor-potomka" name="selektor-potomka"></a></p><h3>Potomek</h3><p>Selektor potomka jest bardzo często stosowany. Zdarza się, że zastosowany selektor potomka jest uznawany po prostu za następujące po sobie selektory typu. Selektor ten oddziela selektory typu znakiem białym, pobiera elementy, które są potomkami elemenu pasującego do poprzedniego selektora. Jest przy tym niezależny od klas i identyfikatorów, zatem przy jego pomocy można ostylować wiele elementów bez dodawania zbytecznych atrybutów. Oczywiście istnieje możliwość łączenia selektorów typu wraz z selektorami klas i identyfikatorów.</p><p>Poniższy przykład dopasuje element <code
class="b">p</code> będący potomkiem elementu <code
class="b">div</code>.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">div p <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#ff0000</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;div&gt;
&nbsp;
Ten element zostanie dopasowany
&lt;ul&gt;
	&lt;li&gt;
&nbsp;
Ten element też zostanie dopasowany&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</pre></div></div><p><a
id="selektor-dziecka" name="selektor-dziecka"></a></p><h3>Dziecko</h3><p>Selektor dziecka bywa często niedoceniany lub mylony z selektorem potomka. Różnica wbrew pozorom jest znacząca: selektor dziecka odnosi się tylko do bezpośredniego potomka. Znakiem stosowanym w tym selektorze jest <code
class="b">&amp;gt;</code>.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">div &amp;gt<span style="color: #00AA00;">;</span> p <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#ff0000</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;div&gt;
&nbsp;
Ten element zostanie dopasowany
&lt;ul&gt;
	&lt;li&gt;
&nbsp;
Ten element nie zostanie dopasowany&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</pre></div></div><p><a
id="selektor-rodzenstwa" name="selektor-rodzenstwa"></a></p><h3>Rodzeństwo</h3><p>Selektor rodzeństwa lub inaczej zwany selektorem sąsiednim tworzony jest poprzez zastosowanie znaku <code
class="b">+</code> jako łącznika. Dopasowuje on element, który jest rodzeństwem pierwszego podanego elementu (oba mają tego samego rodzica), pierwszy z nich występuje przed drugim. Stosuje się go jako pseudo-klasę, którą można by nazwać <code
class="b">:second-child</code></p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">li <span style="color: #00AA00;">+</span> li <span style="color: #00AA00;">&#123;</span>coloer<span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#ff0000</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;div&gt;
&lt;ul&gt;
	&lt;li&gt;Ten element nie zostanie dopasowany&lt;/li&gt;
	&lt;li&gt;Ten element zostanie dopasowany&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</pre></div></div><p><a
id="selektor-atrybutu" name="selektor-atrybutu"></a></p><h3>Selektor atrybutu</h3><p>Selektor atrybuty jest zbliżony do selektora identyfikatora i klasy, z tego powodu znajduje się w tej grupie. Dopasowuje on elementy na podstawie wartości wybranych atrybutów lub po prostu ich występowania. Możliwości dopasowania są 4.</p><p>Dopasowuje elementy, które posiadają dany atrybut, bez znaczenia jego zawartości:</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">a<span style="color: #00AA00;">&#91;</span>href<span style="color: #00AA00;">&#93;</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">text-decoration</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">underline</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;a href=&quot;http://blog.vokiel.com&quot;&gt;Ten element zostanie dopasowany&lt;/a&gt;
&lt;a id=&quot;tennie&quot;&gt;Ten element nie zostanie dopasowany&lt;/a&gt;</pre></div></div><p>Dopasowuje elementy, które posiadają dany atrybut, a jego wartość jest zgodna z określoną:</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">a<span style="color: #00AA00;">&#91;</span>rel<span style="color: #00AA00;">=</span>follow<span style="color: #00AA00;">&#93;</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">text-decoration</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">underline</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;a rel=&quot;follow&quot; href=&quot;http://blog.vokiel.com&quot;&gt;Ten element zostanie dopasowany&lt;/a&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;http://google.pl&quot;&gt;Ten element nie zostanie dopasowany&lt;/a&gt;</pre></div></div><p>Dopasowuje elementy, które posiadają dany atrybut, a jedną z jego wartości oddzielonych spacjami jest ta podana. Różni się od <code
class="b">=</code> tym, że nie sprawdza dokładnego dopasowania całej wartości atrybutu, a wyszukuje w wartościach oddzielonych spacjami:</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">a<span style="color: #00AA00;">&#91;</span>rel~<span style="color: #00AA00;">=</span>copyleft<span style="color: #00AA00;">&#93;</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">text-decoration</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">underline</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;a rel=&quot;copyright copyleft copyeditor&quot; href=&quot;http://blog.vokiel.com&quot;&gt;Ten element zostanie dopasowany&lt;/a&gt;
&lt;a rel=&quot;copyright&quot; href=&quot;http://google.pl&quot;&gt;Ten element nie zostanie dopasowany&lt;/a&gt;</pre></div></div><p>Dopasowuje elementy, które posiadają dany atrybut, a jego wartość jest listą wartości rozdzielonych znakiem minus. Lista ta rozpoczyna się podaną wartością. Stosuje się do dopasowania kodów języka, określonych w atrybucie lang (zobacz <a
rel="nofollow" target="_blank" title="Pseudo-klasa :lang" href="#pseudo-klasy-jezyka">:lang</a>.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">p<span style="color: #00AA00;">&#91;</span>lang|<span style="color: #00AA00;">=</span>en<span style="color: #00AA00;">&#93;</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">text-decoration</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">underline</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">Ten element zostanie dopasowany
&nbsp;
Ten element zostanie dopasowany
&nbsp;
Ten element zostanie dopasowany
&nbsp;
Ten element nie zostanie dopasowany</pre></div></div><h2>Pseudo-klasy, pseudo-elementy</h2><p>Jak sama nazwa wskazuje pseudo-klasy i pseudo-elementy są pesudo selektorami. Nie dopasowują elementów na podstawie nazwy, atrybutów czy też zawartości. Ich dopasowanie odbywa się niejawnie. Mają one za zadanie dać możliwość wyboru elementów, bez konieczności opakowywanie ich w dodatkowe atrybuty.</p><p><a
id="pseudo-klasa-first-child" name="pseudo-klasa-first-child"></a></p><h3>Pseudo-klasa :first-child</h3><p>Dopasowuje element, który jest pierwszym dzieckiem innego elementu. Zastosowań tej pseudo-klasy może być bardzo wiele. Często mając różnego rodzaju listy chcemy wyszczególnić pierwszy element, tworząc menu na liście zdarza się, że pierwszy element ma być delikatnie inaczej ostylowany, czy pierwszy paragraf w tekście.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">li<span style="color: #3333ff;">:first-child </span><span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">border-left</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">solid</span> <span style="color: #993333;">silver</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;ul&gt;
	&lt;li&gt;Ten element zostanie dopasowany&lt;/li&gt;
	&lt;li&gt;Ten element nie zostanie dopasowany&lt;/li&gt;
&lt;/ul&gt;</pre></div></div><p>Wraz z CSS3 doszły nowe pseudo-elementy: <code
class="b">:last-child</code> oraz <code
class="b">:nth-child</code></p><p><a
id="pseudo-klasy-linkow" name="pseudo-klasy-linkow"></a></p><h3>Pseudo-klasy linków :link i :visited</h3><p>Do tej kategorii zalicza się dwie pseudo-klasy: <code
class="b">:link</code> oraz <code
class="b">:visited</code>. Ich ostylowanie zależy od przeglądarki, pierwszy z nich oznacza linki, które jeszcze nie zostały odwiedzone przez klienta, drugi oznacza te, które już klient odwiedził.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;"><span style="color: #3333ff;">:link </span><span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#blue</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;"><span style="color: #3333ff;">:visited </span><span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#navy</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><p><a
id="dynamiczne-pseudo-klasy" name="dynamiczne-pseudo-klasy"></a></p><h3>Dynamiczne pseudo-klasy :hover, :acitve, :focus</h3><p>Dynamiczne pseudo-klasy, jak sama nazwa wskazuje, są nadawane dynamiczne podczas wykrywania interakcji z użytkownikiem. Obsługują takie akcje jak: najechanie kursorem myszy na element <code
class="b">:hover</code>, aktywność danego elementu &#8211; w przypadku użycia myszki oznazcza, że przycisk został naciśnięty ale jeszcze nie zwolniony. Ostani z trójki: <code
class="b">:focus</code> obowiązuje dla aktywnego elementu, czyli np pola formularza, w którym aktualnie znajduje się kursor myszy oczekujący na wpisywane przez użytkownika znaki.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">a<span style="color: #3333ff;">:hover</span><span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">text-decoration</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">underline</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;a href=&quot;http://blog.vokiel.com&quot;&gt;Ten element zostanie podkreślony po najechaniu na niego kursorem myszki.&lt;/a&gt;</pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">a<span style="color: #3333ff;">:active</span><span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;pre lang=&quot;html&quot;&gt;&lt;a href=&quot;http://blog.vokiel.com&quot;&gt;Ten element zostanie pogrubiony po wciśnięciu klawisza myszki (do czasu zwolnienia).&lt;/a&gt;</pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">input<span style="color: #3333ff;">:focus</span><span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#ff0000</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;input type=&quot;text&quot; value=&quot;Tło zrobi się czerwone po umieszczeniu kursora w jego wnętrzu&quot; /&gt;</pre></div></div><p><a
id="pseudo-klasy-jezyka" name="pseudo-klasy-jezyka"></a></p><h3>Pseudo-klasy języka :lang</h3><p>Tą pseudo-klasą oznacza się elementy zawierające tekst w innym języku. Umożliwa inne ostylowanie elementów w zależności od języka. Często stosuje się do ustawienia cudzysłowów. Dopasowanie odbywa się podobnie jak w przypadku selektora atrybuty użytego z tyldą (nie tylko dokładne dopasowanie, ale także wyszukanie w ciągu). Identyfikator języka nie musi być poprawną nazwą języka, ale musi być wypełniony.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;"><span style="color: #00AA00;">:</span>lang<span style="color: #00AA00;">&#40;</span>fr<span style="color: #00AA00;">&#41;</span> &amp;gt<span style="color: #00AA00;">;</span> p <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">quotes</span><span style="color: #00AA00;">:</span> <span style="color: #ff0000;">'« '</span> <span style="color: #ff0000;">' »'</span> <span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;"><span style="color: #00AA00;">:</span>lang<span style="color: #00AA00;">&#40;</span>de<span style="color: #00AA00;">&#41;</span> &amp;gt<span style="color: #00AA00;">;</span> p <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">quotes</span><span style="color: #00AA00;">:</span> <span style="color: #ff0000;">'»'</span> <span style="color: #ff0000;">'«'</span> <span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\2</span>039'</span> <span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\2</span>03A'</span> <span style="color: #00AA00;">&#125;</span></pre></div></div><p><a
id="pseudo-elementy" name="pseudo-elementy"></a></p><h3>Pseudo-elementy :first-line, :first-letter, :before i :after</h3><p>Pseudo-elementy zachowują się jak zwykłe znaczniki CSS &#8211; dają możliwość ostylowania części zawartosci elementów na podstawie właściwości, których określenie następuje dynamicznie. Pierwszy z nich <code
class="b">:first-line</code> odnosi się do zawartości pierwszej linii danego paragrafu. Ważną informacją w tym miejscu jest lista ograniczeń, ten pseudo-element może zmieniać tylko niektóre parametry: <code
class="b">font-, color-, background-, word-spacing, letter-spacing, text-decoration, vertical-align, text-transform, line-height</code>.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">p<span style="color: #3333ff;">:first-line </span><span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">Ta pierwsza linia będzie pogrubiona,
następne już nie, bo nie zostaną objęte
znacznikiem :first-line</pre></div></div><p>Jeśli pierwszy wiersz miałby zostać rozbity na kilka linii, a chcielibyśmy aby całe pierwsze zdanie było inaczej ostylowane możemy posiłkować się dodaniem pseudo-atrybutu w kodzie, dla danego elementu:</p><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">Ta pierwsza linia będzie pogrubiona,
aż do tego miejsca, następne już nie bo nie zostaną
objęte znacznikiem :first-line</pre></div></div><p>Należy przy tym uważać na znaki rozpoczynające nowe linie. Przykładowo w kodzie poniżej, żadne znaki nie zostaną odmiennie ostylowane, ponieważ pierwsza linia nie ma zawartości:</p><p>Nic tu nie zostanie odmiennie ostylowane,<br
/> tym bardziej następne linie.</p><p>Kolejny <code
class="b">:first-letter</code> działa analogicznie do poprzedniego, z tą różnicą, że daje możliwość ostylowania pierwszej litery zamiast pierwszej linii. Stosowanie tego pseudo-elementu zostało ogranioczne do elementów blokowych (block, list-item, table-cell, table-catpion, inline-block). Dodatkowo istnieje podobne ograniczenie jak w przypadku first-line: zmiany ostylowania mogą obejmować: <code
class="b">font-, word-spacing, letter-spacing, text-decoration, vertical-align, text-transform, line-height, float, margin-, padding-, border-, color-, background-</code></p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">p<span style="color: #3333ff;">:first-letter </span><span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">26px</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">Tylko pierwsza literka T z tego paragrafu będzie powiększona do rozmiru 26px.</pre></div></div><p>Pseudo-selektory <code
class="b">:before</code> i <code
class="b">:after</code> są używane do wstawiania wygenerowanej treści  przed lub za wybrany element.</p><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">blockquote<span style="color: #3333ff;">:before </span><span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">content</span><span style="color: #00AA00;">:</span> <span style="color: #ff0000;">&quot;Cytat:&quot;</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;blockquote&gt;
Ten cały cytat zostanie poprzedzony słowem &quot;Cytat:&quot;.&lt;/blockquote&gt;</pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="css" style="font-family:monospace;">a<span style="color: #00AA00;">&#91;</span>href~<span style="color: #00AA00;">=</span>http<span style="color: #00AA00;">&#93;</span><span style="color: #3333ff;">:after </span><span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;outgoing.png&quot;</span><span style="color: #00AA00;">&#41;</span> <span style="color: #993333;">no-repeat</span> <span style="color: #993333;">center</span> <span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;a href=&quot;http://blog.vokiel.com&quot;&gt;Ten link dostanie ikonkę na końcu&lt;/a&gt;
&lt;a href=&quot;#selektor-uniwersalny&quot;&gt;Ten już nie&lt;/a&gt;</pre></div></div> <img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/lOWkAvCSUPM" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://blog.vokiel.com/najwazniejsze-selektory-css2/feed</wfw:commentRss> <slash:comments>4</slash:comments> <feedburner:origLink>http://blog.vokiel.com/najwazniejsze-selektory-css2</feedburner:origLink></item> <media:rating>nonadult</media:rating></channel> </rss>

