<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	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/"
	>

<channel>
	<title>czoper.devlog</title>
	<atom:link href="http://przemyslawczatrowski.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://przemyslawczatrowski.com</link>
	<description>.NET, CAD/CAM</description>
	<lastBuildDate>Mon, 28 Feb 2011 11:25:09 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.24</generator>
<site xmlns="com-wordpress:feed-additions:1">10404781</site>	<item>
		<title>mgr inż. PC :)</title>
		<link>http://przemyslawczatrowski.com/2011/01/31/mgr-inz-pc/</link>
		<comments>http://przemyslawczatrowski.com/2011/01/31/mgr-inz-pc/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 23:00:02 +0000</pubDate>
		<dc:creator><![CDATA[czoper]]></dc:creator>
				<category><![CDATA[Studia]]></category>
		<category><![CDATA[ogólne]]></category>
		<category><![CDATA[wydarzenia]]></category>

		<guid isPermaLink="false">http://przemyslawczatrowski.com/?p=707</guid>
		<description><![CDATA[Taka okazja nie zdarza się codziennie, co więcej – nie zdarza się więcej niż raz w życiu. W związku z tym jest mi tym przyjemniej dzielić się nią ze światem Dzisiaj około godziny 9.30 zakończyłem kolejny etap edukacji i z wynikiem celującym uzyskałem tytuł magistra inżyniera informatyki, specjalizacja Projektowanie systemów CAD/CAM.]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Taka okazja nie zdarza się codziennie, co więcej – nie zdarza się więcej niż raz w życiu. W związku z tym jest mi tym przyjemniej dzielić się nią ze światem <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="http://przemyslawczatrowski.com/wp-content/uploads/2011/01/wlEmoticon-winkingsmile.png" alt="Puszczam oczko" /></p>
<p style="text-align: justify;"><a href="http://przemyslawczatrowski.com/wp-content/uploads/2011/01/biret.jpg" rel="lightbox[707]" title="biret"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border: 0px;" title="biret" src="http://przemyslawczatrowski.com/wp-content/uploads/2011/01/biret_thumb.jpg" border="0" alt="biret" width="102" height="69" align="left" /></a>Dzisiaj około godziny 9.30 zakończyłem kolejny etap edukacji i z wynikiem celującym uzyskałem tytuł magistra inżyniera informatyki, specjalizacja <em>Projektowanie systemów CAD/CAM</em>.</p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemyslawczatrowski.com%2F2011%2F01%2F31%2Fmgr-inz-pc%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowtransparency="true"></iframe><!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://przemyslawczatrowski.com/2011/01/31/mgr-inz-pc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<post-id xmlns="com-wordpress:feed-additions:1">707</post-id>	</item>
		<item>
		<title>Refleksje [2010] i plany [2011]</title>
		<link>http://przemyslawczatrowski.com/2011/01/11/refleksje-2010-i-plany-2011/</link>
		<comments>http://przemyslawczatrowski.com/2011/01/11/refleksje-2010-i-plany-2011/#respond</comments>
		<pubDate>Tue, 11 Jan 2011 14:21:34 +0000</pubDate>
		<dc:creator><![CDATA[czoper]]></dc:creator>
				<category><![CDATA[Inne]]></category>
		<category><![CDATA[ogólne]]></category>
		<category><![CDATA[przemyślenia]]></category>
		<category><![CDATA[wydarzenia]]></category>

		<guid isPermaLink="false">http://przemyslawczatrowski.com/?p=693</guid>
		<description><![CDATA[Rok 2010 skończył się już paręnaście dni temu, czas na podsumowanie. Zwykle czas refleksji przypada na koniec roku, wraz z rozliczaniem się ze sobą z realizacji powziętych postanowień. Mnie osobiście zawsze łapie to w okresie intensywnego obijania się między Świętami Bożego Narodzenia, a&#8230; nie, nie Wielkanocą (chociaż tak długa laba brzmi zachęcająco) tylko Sylwestrem. Wtedy [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Rok 2010 skończył się już paręnaście dni temu, czas na podsumowanie.</p>
<p style="text-align: justify;">Zwykle czas refleksji przypada na koniec roku, wraz z rozliczaniem się ze sobą z realizacji powziętych postanowień. Mnie osobiście zawsze łapie to w okresie intensywnego obijania się między Świętami Bożego Narodzenia, a&#8230; nie, nie Wielkanocą (chociaż tak długa laba brzmi zachęcająco) tylko Sylwestrem. Wtedy to stawiam sobie dwa pytania: <em>&#8222;Cóż to naobiecywałem sobie na ten (kończący się właśnie) rok?&#8221;</em> oraz <em>&#8222;Czego by tu sobie na ten nowy naobiecywać?&#8221;</em> Biję się zatem w piersi i zaczynam przyznawanie się..</p>
<h2>[2010]</h2>
<ul>
<li style="text-align: justify;">Przede wszystkim, poradziłem sobie na studiach magisterskich. Obrona co prawda jeszcze przede mną (o tym w dziale [2011]), ale z perspektywy czasu na szybko podjęta decyzja o wyborze &#8222;Projektowania systemów CAD/CAM&#8221; jako specjalizacji była trafiona idealnie.</li>
<li style="text-align: justify;">Ciągle utrzymana praca zawodowa, przynosząca satysfakcję w dziedzinach nieco oderwanych od głównego kierunku studiów, ale wciąż interesująca <img src="https://s.w.org/images/core/emoji/2.2.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
<li style="text-align: justify;">Jeżeli chodzi o devloga, to jestem w miarę zadowolony, co nie znaczy, że nie może być lepiej. Przede wszystkim częstotliwość wpisów powinna być znacznie większa &#8211; w roku 2010 opublikowałem ich równo 40, co daje średnią 1 notki na ~9 dni. Inne statystyki są równie obiecujące (dostarczono przez Google Analytics): prawie 7000 odsłon, średnio ponad 2 min spędzone na stronie. Największą popularnością cieszyły się następujące posty (pierwsza piątka w kolejności):
<ul>
<li><a href="http://przemyslawczatrowski.com/2010/04/17/skala-szarosci-i-sepia/" target="_blank">Skala szarości i sepia</a></li>
<li><a href="http://przemyslawczatrowski.com/2010/03/27/c-eksport-danych-do-pliku-xls/" target="_blank">C#: Eksport danych do pliku XLS</a></li>
<li><a href="http://przemyslawczatrowski.com/2010/09/08/osadzanie-xna-4-0-w-windows-forms/" target="_blank">Osadzanie XNA w Windows Forms</a></li>
<li><a href="http://przemyslawczatrowski.com/2010/09/11/xna-kamera-fpp/" target="_blank">XNA &#8211; Kamera FPP</a></li>
<li><a href="http://przemyslawczatrowski.com/2010/04/01/ilmerge-dolaczanie-zewnetrznych-bibliotek/" target="_blank">ILMerge &#8211; dołączanie zewnętrznych bibliotek</a>.</li>
</ul>
</li>
<li style="text-align: justify;">Wziąłem udział w konkursie Maćka Aniserowicza <a title="Daj się poznać" href="http://przemyslawczatrowski.com/category/daj-sie-poznac/" target="_blank">&#8222;Daj się poznać&#8221;</a>. Niestety, projekt umarł jak zwierzątko w tamagotchi, ponieważ czas pożerała praca magisterska (była w tym lepsza niż wszelkie <em>-Ville</em> razem wzięte). Plusem jest, że kilka rzeczy rozwijanych na potrzeby konkursu przemyciłem do magisterki.</li>
<li style="text-align: justify;">Życie pozazawodowe / pozauczelniane / pozaprogramistyczne. Pozwiedzałem (UK), pożeglowałem (suwalszczyzna), porowerowałem (Warszawa), poodwiedzałem koncerty (tu i tam <img src="https://s.w.org/images/core/emoji/2.2.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ). Rok pod tym względem można uznać za udany.</li>
</ul>
<h2>[2011]</h2>
<p style="text-align: justify;">Nowa dekada zaczęła się (mogę to z ręką na sercu powiedzieć) z hukiem ponieważ.. <strong>ZARĘCZYŁEM SIĘ</strong> <img src="https://s.w.org/images/core/emoji/2.2.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Szczęśliwą (mam nadzieję <img src="https://s.w.org/images/core/emoji/2.2.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ) Narzeczoną została pewna <a title="moja Narzeczona :)" href="http://programistka.eu/" target="_blank">Programistka</a>. Ślub co prawda planowany jest na rok 2012, ale przygotowania wypada zacząć nieco wcześniej, więc może być gorąco.</p>
<p>Z postanowień noworocznych:</p>
<ul>
<li style="text-align: justify;">do posiadanego tytułu inżyniera zdobyć kolejny <em>achievement </em>w postaci tytułu magistra. Szansa na to przyjdzie z końcem stycznia.</li>
<li style="text-align: justify;">regularniej przelewać swoje myśli w słowa i zapisywać je w postaci notek.</li>
<li style="text-align: justify;">w związku z powyższym przydałoby się zacząć rozwój jakiegoś pobocznego projektu. Wstępne szkice już są, mam nadzieję, że chęci i umiejętności starczy, żeby doprowadzić to do jakiejś grywalnej (słowo kluczowe w tej zagadce) postaci.</li>
</ul>
<p style="text-align: justify;">Oby ten rok był jednocześnie najlepszym z dotychczasowych i tylko tłem dla kolejnych!</p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemyslawczatrowski.com%2F2011%2F01%2F11%2Frefleksje-2010-i-plany-2011%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowtransparency="true"></iframe><!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://przemyslawczatrowski.com/2011/01/11/refleksje-2010-i-plany-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<post-id xmlns="com-wordpress:feed-additions:1">693</post-id>	</item>
		<item>
		<title>IT Academic Day na Politechnice Warszawskiej</title>
		<link>http://przemyslawczatrowski.com/2010/12/10/it-academic-day-na-politechnice-warszawskiej/</link>
		<comments>http://przemyslawczatrowski.com/2010/12/10/it-academic-day-na-politechnice-warszawskiej/#respond</comments>
		<pubDate>Fri, 10 Dec 2010 22:45:53 +0000</pubDate>
		<dc:creator><![CDATA[czoper]]></dc:creator>
				<category><![CDATA[Inne]]></category>
		<category><![CDATA[ITADPW]]></category>
		<category><![CDATA[wydarzenia]]></category>

		<guid isPermaLink="false">http://przemyslawczatrowski.com/2010/12/10/it-academic-day-na-politechnice-warszawskiej/</guid>
		<description><![CDATA[7 grudnia miałem okazję uczestniczyć w konferencji IT Academic Day na Politechnice Warszawskiej. Chciałbym się podzielić wrażeniami i spostrzeżeniami z tego wydarzenia. Początek i otwarcie Na miejsce przybyłem chwilę przed czasem, miałem więc okazję zobaczyć jak organizatorzy rozkładają przed Małą Aulą Politechniki ekrany, do których miały być podpięte XBOX’y. Wszystko byłoby fajnie, gdyby nie fakt, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p align="justify">7 grudnia miałem okazję uczestniczyć w konferencji IT Academic Day na Politechnice Warszawskiej. Chciałbym się podzielić wrażeniami i spostrzeżeniami z tego wydarzenia.</p>
<p>  <span id="more-689"></span>  </p>
<h3>Początek i otwarcie</h3>
<p align="justify">Na miejsce przybyłem chwilę przed czasem, miałem więc okazję zobaczyć jak organizatorzy rozkładają przed Małą Aulą Politechniki ekrany, do których miały być podpięte XBOX’y. Wszystko byłoby fajnie, gdyby nie fakt, że.. była 8.45. Szybkie spojrzenie w agendę, tak. Planowane rozpoczęcie o 9.00. Rejestracja była pokazem wyższości O( logN ) nad O( N ) – zarówno lista zarejestrowanych uczestników, jak drukowanych dla każdego imiennych zaświadczeń o udziale w konferencji były nieposortowane alfabetycznie [sic!]. Na szczęście byłem trzeci, więc dość krótko przyszło mi stać w kolejce. Rozpoczęcie chwilę się opóźniło, ale na szczęście nie wpłynęło to na długość kolejnych prelekcji, o których poniżej.</p>
<p>&#160;</p>
<h3>Prelekcje</h3>
<h4>“Pasja programisty .NET z Xbox 360 &amp; Kinect” Marcin Iwanowski (<em>Microsoft</em>)</h4>
<p>&#160;</p>
<p align="justify">Prezentacja ciekawa, ale oprócz zaprezentowania na żywo gier na Kinect mało porywająca. Dużo banałów (<em>“kto wie co to jest? Otóż, to jest gamepad.”</em>). Marcin w trakcie zapowiedział, że później przejdzie do znacznie trudniejszej – technicznej części prezentacji. Zaświeciły mi się oczy, bo liczyłem na jakieś szczegółowe / tajne / Wikileaks’owe <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Puszczam oczko" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/12/wlEmoticon-winkingsmile.png" /> informacje o hardware oraz algorytmach użytych w Kinect. Wstępem do tego był odrębny dokument (nawet nie pamiętam tytułu, czy był przytoczony też nie) – opisy rzeczy, które przed chwilą wymieniłem. Został on jednak przewinięty z szybkością animacji 1080p na netbook’u (czyli jakieś 6-7 slajdów na sekundę), a “trudne rzeczy” zostały sprowadzone do stwierdzeń (tu fragment prezentacji):</p>
<blockquote>
<ol>
<li>kinect próbkuje odległości </li>
<li>kinect rozpoznaje części ciała </li>
<li>kinect odgaduje pozycję ciała (używając algorytmu uczącego z wczytanymi wcześniej danymi) </li>
<li>i to wszystko 30 razy na sekundę </li>
</ol>
</blockquote>
<p>&#160;</p>
<p>Miałem dużo większe oczekiwania.</p>
<p>&#160;</p>
<h4>“Eksploruj Windows Phone 7 z XNA”, Rafał Czupryński (<em>Microsoft</em>)</h4>
<p>&#160;</p>
<p align="justify">Prezentację prowadził człowiek pracujący w Microsoft. Miało to swoje dobre i złe strony. Do dobrych oczywiście należy to, że na co dzień w ramach pracy zawodowej (a nie tylko hobby / dorywczo) zajmuje się najnowszymi technologiami oraz ich rozprzestrzenianiem. Zła strona – każdy opowiadający o produktach swojej firmy, chcąc nie chcąc brzmi jak chodząca reklama <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Puszczam oczko" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/12/wlEmoticon-winkingsmile.png" /> a w przypadku ludzi z Microsoftu – jak blok reklam w trakcie piątkowego wieczoru na Polsacie.</p>
<p align="justify">Niemniej jednak prelekcja była przyjemna, Rafał w przystępny sposób opowiedział o nowym systemie, wymienił też kilka nowinek, o których nie słyszałem wcześniej pomimo udziału w online’owym szkoleniu prowadzonym przez Roba Milesa i Andy’ego Wigley’a. <font color="#000000">Rob został oczywiście wspomniany jako jeden z największych autorytetów w dziedzinie XNA, jako przykład została zaprezentowana gra “Cheese Lander” – to już drugi raz, kiedy miałem okazję zobaczyć ten kod w ramach prelekcji (dwóch różnych osób, z czego jedna z nich była autorem aplikacji). Pomimo ciekawego tematu (w końcu Windows Phone 7 to poważny kandydat do zamieszania na rynku smartphone’ów) oraz interesujących przykładów zabrakło wg. mnie najważniejszego. Prelegent jako urządzenia “pokazowego” (czyli prezentowania położenia urządzenia w trybie Portrait i Landscape oraz np. symulacji multitouch) używał.. HTC HD2 z Windows Mobile 6.5 [sic!]</font></p>
<p align="justify">Plusami były też obszerne informacje na temat Marketplace, dostępu do tegoż i możliwości zarabiania.</p>
<p align="justify">Sesja zdecydowanie na plus, między innymi ze względu na wygraną książkę <a title="&quot;Projektowanie gier&quot;" href="http://helion.pl/ksiazki/projektowanie_gier_podstawy_wydanie_ii_ernest_adams,prgpo2.htm" target="_blank">“Projektowanie gier” Ernesta Adamsa</a> <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Uśmiech" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/12/wlEmoticon-smile.png" /></p>
<p>&#160;</p>
<h4>“Jak szybko i efektywnie dobrać się do bazy danych”, Mariusz Matysek (<em>zaloz-sie.pl</em>)</h4>
<p>&#160;</p>
<p align="justify">Spóźniłem się nieco na tą prelekcję ze względu na spotkanie (bardzo owocne) z promotorem pracy magisterskiej oraz (niestety wręcz przeciwnie – bezowocną) wizytę w dziekanacie. Nie straciłem jednak wiele.</p>
<p>Prelegent zaprezentował porównanie najpopularniejszych ORM’ów:</p>
<ul>
<li>ADO.NET </li>
<li>LINQ TO SQL </li>
<li>Entity Framework </li>
<li>NHibernate (+Fluent NHibernate) </li>
</ul>
<p align="justify">Prezentacji każdej z nich towarzyszył przykład – aplikacja ASP.NET MVC z zastosowanym danym framework’iem do dostania się do bazy. Niestety, zbyt wiele kodu nie uświadczyłem. Jako, że w agendzie napisano “próba wyłonienia najbardziej efektywnej technologii dostępu do bazy danych” liczyłem na jakieś wyniki testów porównawczych (czasówki dotyczące 1000000-krotnego INSERT-u, SELECT-a z wrednym JOIN-em, etc.), jednak takich nie było. Szkoda.</p>
<p>&#160;</p>
<h4>“Expression Blend – ekspresowe konstruowanie zaawansowanych graficznie interfejsów użytkownika”, Wojciech Kuroczycki (<em>Wydział Elektryczny PW</em>)</h4>
<p>&#160;</p>
<p align="justify">Narzędzie i prezentacja – TAK! Prelegent – NIE! <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Puszczam oczko" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/12/wlEmoticon-winkingsmile.png" /> No dobra, może zbyt surowo tu oceniam, ale po prelekcji oczekuję, że prowadzący nie będzie co drugie zdanie wtrącał “dobra, to jedziemy dalej z tym koksem”</p>
<p align="justify">Do rzeczy: narzędzie jest potężne. W 1.5 godziny od podstaw stworzony został interfejs użytkownika dla aplikacji nie mającej większego sensu, natomiast wyglądającej na tyle ładnie, że wersję pudełkową za symboliczne 99.99 pln sprzedałby średnio rozgarnięty domokrążca. Animacje, ułożenie elementów na formie, przezroczystość, rotacje, bindowanie danych do kontrolek, szablony wyświetlanych tekstów, możliwość stworzenia prostych kolekcji danych do przetestowania GUI “na sucho”. Bajka. Cytując prowadzącego (i wycinając “dobra” <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Puszczam oczko" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/12/wlEmoticon-winkingsmile.png" /> ): </p>
<blockquote>
<p align="justify"><font color="#000000">Spokojnie można w tym wyklikać programy na zaliczenie na 1, 2, 3 i.. na 4 rok PW też mi się udało <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Puszczam oczko" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/12/wlEmoticon-winkingsmile.png" /></font></p>
</blockquote>
<p>&#160;</p>
<p>Sesja in plus.</p>
<p>&#160;</p>
<h4>“Wizja współpracy ze studentami i Uczelniami Wyższymi”, Rafał Czupryński (<em>Microsoft</em>)</h4>
<p>&#160;</p>
<p align="justify">Prelekcji nie widziałem. Ale za to chińczyk zamiast niej wypadł bardzo smakowicie <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Uśmiech" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/12/wlEmoticon-smile.png" /></p>
<p>&#160;</p>
<h4>“Rzeczywistość tworzenia gier w XNA – od dokumentu po produkcję” Andrzej Piotrowski (<em>Grupa UPPoznan.net</em>)</h4>
<p>&#160;</p>
<p align="justify">Na tą prelekcję miałem największą chrapkę. Proces produkcji gier to to, czego nie da się nauczyć na uczelni. A przynajmniej nie pisania Design-Doc’ów, a także tego co dzieje się w fazie wydawania gry. Odpowiedzi jednak nie uzyskałem. Zostało zaprezentowanych kilka(naście) gier napisanych używając XNA przez prelegenta lub innych ludzi.</p>
<p align="justify">Do jednej z gier autor Andrzej pokazał Design-Doc, jednak nie wchodził w szczegóły – zabrakło tego, co w takim dokumencie powinno się znaleźć, jakie inne dokumenty powstają jeszcze PRZED rozpoczęciem kodowania. No i najbardziej zabrakło opisu samego wypuszczania gry na rynek.</p>
<p align="justify">Niemniej jednak, kilka z zaprezentowanych tytułów dosyć mogło dosyć mocno zainspirować, pokazało, że nawet prosty (acz kreatywny) pomysł może niewielkim nakładem sił przeobrazić się w grywalną produkcję.</p>
<p align="justify">Sesja in plus (ale to przez to, że zgarnąłem kolejną książkę – tym razem <a title="&quot;ASP.NET Programowanie&quot;" href="http://helion.pl/ksiazki/asp_net_programowanie_jesse_liberty_dan_hurwitz,aspnep.htm" target="_blank">&quot;ASP.NET Programowanie&quot; Jessy Liberty, Dan Hurwitz</a>&#160;<img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Uśmiech" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/12/wlEmoticon-smile.png" /> )</p>
<p>&#160;</p>
<h3>Podsumowanie</h3>
<p>&#160;</p>
<p align="justify">Chwała chłopakom z politechnicznych grup .NET za zorganizowanie konferencji, wybranie na temat przewodni właśnie programowania gier i ściągnięcia niezłych sponsorów, dzięki którym w konkursie Kinect’a do wygrania był Xbox 360. Do następnego razu.</p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemyslawczatrowski.com%2F2010%2F12%2F10%2Fit-academic-day-na-politechnice-warszawskiej%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowtransparency="true"></iframe><!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://przemyslawczatrowski.com/2010/12/10/it-academic-day-na-politechnice-warszawskiej/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<post-id xmlns="com-wordpress:feed-additions:1">689</post-id>	</item>
		<item>
		<title>Używanie Parallel Extensions z .NET 4.0</title>
		<link>http://przemyslawczatrowski.com/2010/11/22/uzywanie-parallel-extensions-z-net-4-0/</link>
		<comments>http://przemyslawczatrowski.com/2010/11/22/uzywanie-parallel-extensions-z-net-4-0/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 00:06:08 +0000</pubDate>
		<dc:creator><![CDATA[czoper]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[algorytmy]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Parallel Extensions]]></category>

		<guid isPermaLink="false">http://przemyslawczatrowski.com/?p=668</guid>
		<description><![CDATA[W trakcie rozwijania algorytmów na potrzeby pracy magisterskiej pojawiło się zapotrzebowanie na zdecydowane przyspieszenie jednego z nich. Algorytm polegał na liczeniu pewnych własności dla każdego punktu regularnej siatki. Zrównoleglenie było naturalnym rozwiązaniem, ponieważ elementy nie zależały od siebie nawzajem. Zdecydowałem się na użycie Parallel Extensions (Wiki, MSDN) ze względu na prostotę. Przedstawię szkielet rozwiązania, które [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">W trakcie rozwijania algorytmów na potrzeby pracy magisterskiej pojawiło się zapotrzebowanie na zdecydowane przyspieszenie jednego z nich. Algorytm polegał na liczeniu pewnych własności dla każdego punktu regularnej siatki. Zrównoleglenie było naturalnym rozwiązaniem, ponieważ elementy nie zależały od siebie nawzajem. Zdecydowałem się na użycie <code>Parallel Extensions</code> (<a href="http://en.wikipedia.org/wiki/Parallel_Extensions" target="_blank">Wiki</a>, <a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.aspx" target="_blank">MSDN</a>) ze względu na prostotę.</p>
<p style="text-align: justify;">Przedstawię szkielet rozwiązania, które może zostać zastosowane praktycznie dla dowolnego problemu o podobnej charakterystyce, może zostać łatwo rozszerzone dla wyższych wymiarów.</p>
<p><span id="more-668"></span></p>
<h2>Problem</h2>
<p style="text-align: justify;">Policzyć pewną właściwość (niech będzie to rezultat wywołania funkcji<br />
<code>int ComputeSmth(int x, int y, int z)</code>) dla każdego elementu trójwymiarowej tablicy<br />
<code>int[,,] tab</code>. Rozmiary tablicy są znane i wynoszą odpowiednio <code>[SizeX, SizeY, SizeZ]</code>.</p>
<h2>Wersja liniowa</h2>
<p>Zamieszczam dla kompletu, żeby było wszystko <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/11/wlEmoticon-winkingsmile.png" alt="Puszczam oczko" /></p>
<pre class="brush: csharp; title: ; notranslate">
for (int i = 0; i &lt; SizeX; ++i)
    for (int j = 0; j &lt; SizeY; ++j)
        for (int k = 0; k &amp;lt; SizeZ; ++k)
            tab[i, j, k] = ComputeSmth(i, j, k);
</pre>
<h2>Zrównoleglanie – krok pierwszy</h2>
<p style="text-align: justify;">Użycie <code>Parallel.For</code> wymaga podania trzech argumentów: zakresu przedziału pętli <code>[fromInclusive, toExclusive)</code>, czyli pętla wykona się dla (powiedzmy)<br />
<code>i = fromInclusive; i &gt; toExclusive</code>. Trzecim argumentem jest delegat wykonywany w każdej iteracji, który jest obiektem <code>Action</code>. Na początku wprowadzimy potrójną pętlę równoległą, oto kod:</p>
<pre class="brush: csharp; title: ; notranslate">
Parallel.For(0, SizeX, i =&gt;
{
    Parallel.For(0, SizeY, j =&gt;
    {
        Parallel.For(0, SizeZ, k =&gt;
        {
            tab[i, j, k] = ComputeSmth(i, j, k);
        });
    });
});
</pre>
<p style="text-align: justify;">Taki kod wydał mi się jednak brzydki, więc postanowiłem pójść o krok dalej.</p>
<h2>Zrównoleglenie – krok drugi</h2>
<p style="text-align: justify;">Skorzystałem z własności, że każdą tablicę trójwymiarową można traktować jak jednowymiarową, wystarczy odpowiednio przeliczyć indeksy (działa również dla wyższych wymiarów, ale akurat potrzebowałem wersji 3D). Na szybko powstały dwie metody:</p>
<pre class="brush: csharp; title: ; notranslate">
private static int Calculate3Dto1D(int x, int y, int z, int sizeX, int sizeY, int sizeZ)
{
    return z * (sizeX * sizeY) + y * sizeX + x;
}

private static void Calculate1Dto3D(int k, int sizeX, int sizeY, int sizeZ, out int x, out int y, out int z)
{
    z = k / (sizeX * sizeY);
    int tmp = k % (sizeX * sizeY);
    y = tmp / sizeX;
    x = tmp % sizeX;
}
</pre>
<p style="text-align: justify;">Kod jest raczej prosty, przeliczanie indeksu jednowymiarowego na trójwymiarowy najlepiej rozrysować sobie na kartce – to mój najlepszy (w parze z ołówkiem) doradca ds. algorytmów <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/11/wlEmoticon-winkingsmile.png" alt="Puszczam oczko" /> Obie metody są symetryczne – jedna służy do przeliczania współrzędnych z 3D do 1D, druga odwrotnie (nazwy są samoopisujące się), w dalszej części będziemy używać tylko jednej z nich, ale obie lepiej oddają ideę tej metody. Poza tym zdziwić może nieużywanie w ciele metod parametru <code>sizeZ</code>. Tak naprawdę do przeliczania potrzebne są nam tylko dwa pierwsze wymiary kostki, ale dla jasności kodu (w wersji produkcyjnej można spokojnie usunąć ten parametr) zostawiłem go w obu metodach.</p>
<p style="text-align: justify;">Kiedy wiemy już jak przeliczać indeksy, można uzyskać pożądany efekt przy użyciu tylko jednego wywołania metody <code>Parallel.For</code>. Kod źródłowy:</p>
<pre class="brush: csharp; title: ; notranslate">
const int n = SizeX * SizeY * SizeZ;
Parallel.For(0, n, i =&gt;
{
    int x, y, z;
    Calculate1Dto3D(i, SizeX, SizeY, SizeZ, out x, out y, out z);
    tab[x, y, z] = ComputeSmth(x, y, z);
});
</pre>
<h2>Podsumowanie</h2>
<p style="text-align: justify;">Nie zagłębiałem się jeszcze we właściwości tych klas i nie wiem jak w teorii wypada wydajność i rozłożenie wątków przy zagnieżdżonych wywołaniach <code>Parallel.For</code>, jednak testy pokazują, że najlepiej radzi sobie wersja ostatnia (czasy w formacie Min:Sec:Milisec).</p>
<p><a href="http://przemyslawczatrowski.com/wp-content/uploads/2010/11/test.png" rel="lightbox[668]" title="test"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="test" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/11/test_thumb.png" border="0" alt="test" width="685" height="450" /></a></p>
<p style="text-align: justify;">Poza samą różnicą w czasie działania wersji równoległych, najbardziej cieszy mnie przyspieszenie osiągnięte w stosunku do wersji początkowej.</p>
<p style="text-align: justify;">Mam nadzieję, że zachęciłem do zapoznania się z możliwościami nowego C# i korzyściami z tego płynącymi.</p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemyslawczatrowski.com%2F2010%2F11%2F22%2Fuzywanie-parallel-extensions-z-net-4-0%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowtransparency="true"></iframe><!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://przemyslawczatrowski.com/2010/11/22/uzywanie-parallel-extensions-z-net-4-0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<post-id xmlns="com-wordpress:feed-additions:1">668</post-id>	</item>
		<item>
		<title>&#8222;Daj się poznać&#8221; &#8211; podsumowanie</title>
		<link>http://przemyslawczatrowski.com/2010/11/15/daj-sie-poznac-podsumowanie/</link>
		<comments>http://przemyslawczatrowski.com/2010/11/15/daj-sie-poznac-podsumowanie/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 12:23:57 +0000</pubDate>
		<dc:creator><![CDATA[czoper]]></dc:creator>
				<category><![CDATA[Daj się poznać]]></category>
		<category><![CDATA[Theme Festival]]></category>
		<category><![CDATA[DajSięPoznać]]></category>
		<category><![CDATA[przemyślenia]]></category>

		<guid isPermaLink="false">http://przemyslawczatrowski.com/?p=657</guid>
		<description><![CDATA[Dziś 15.11, a więc oficjalny koniec konkursu &#8222;Daj się poznać&#8221;. Mówiąc krótko &#8211; nie udało się. Czemu? Konkurs zbiegł się w czasie z pisaniem pracy magisterskiej oraz ponadtygodniowym wyjazdem za granicę. Pewnie lepsze zarządzanie czasem pozwoliłoby doprowadzić projekt do stanu względnej używalności, ale teraz nie ma co się nad tym zastanawiać. Z czego jestem zadowolony: [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Dziś 15.11, a więc oficjalny koniec konkursu <a title="Daj się poznać" href="http://www.maciejaniserowicz.com/page/Konkurs-daj-sie-poznac.aspx" target="_blank">&#8222;Daj się poznać&#8221;</a>. Mówiąc krótko &#8211; nie udało się. Czemu? Konkurs zbiegł się w czasie z pisaniem pracy magisterskiej oraz ponadtygodniowym wyjazdem za granicę. Pewnie lepsze zarządzanie czasem pozwoliłoby doprowadzić projekt do stanu względnej używalności, ale teraz nie ma co się nad tym zastanawiać.</p>
<p>Z czego jestem zadowolony:</p>
<ul>
<li style="text-align: justify;">przez dłuższy czas byłem zmobilizowany do blogowania, czego skutkiem jest kilka popełnionych postów więcej (i mam nadzieję, że ta tendencja się utrzyma, jeżeli nie wzrośnie),</li>
<li style="text-align: justify;">podczas researchu tematów opisywanych w ramach konkursu, sporą część z nich przemyciłem do pracy magisterskiej,</li>
<li style="text-align: justify;">ruch na blogu znacznie się poprawił, do średnio 40-50 unikalnych wizyt dziennie,</li>
<li style="text-align: justify;">9 postów zostało &#8222;wydotnetomaniakowanych&#8221;,</li>
<li style="text-align: justify;">czytając inne blogi dowiedziałem się wielu ciekawych rzeczy &#8211; wg mnie wszyscy wykonali kawał dobrej roboty.</li>
</ul>
<p>Posty związane z konkursem:</p>
<ol>
<li><a href="http://przemyslawczatrowski.com/2010/08/17/daj-sie-poznac-63-uczestnik/" target="_blank">&#8222;Daj się poznać&#8221; &#8211; 63. uczestnik</a> (<em>41 odwiedzin</em>)</li>
<li><a href="http://przemyslawczatrowski.com/2010/09/08/osadzanie-xna-4-0-w-windows-forms/" target="_blank">Osadzanie XNA 4.0 w Windows Forms</a> (<em>360 odwiedzin</em>)</li>
<li><a href="http://przemyslawczatrowski.com/2010/09/11/xna-kamera-fpp/" target="_blank">[XNA] Kamera FPP</a> (<em>267 odwiedzin</em>)</li>
<li><a href="http://przemyslawczatrowski.com/2010/09/16/deus-ex-adfectus-machina-menedzer-stanow/" target="_blank">Deus ex adfectus machina &#8211; menedżer stanów</a> (<em>96 odwiedzin</em>)</li>
<li><a href="http://przemyslawczatrowski.com/2010/09/17/pomysly-pomysly-pomysly/" target="_blank">Pomysły, pomysły, pomysły..</a> (<em>44 odwiedzin</em>)</li>
<li><a href="http://przemyslawczatrowski.com/2010/09/25/themefestival-na-wybiegu-czyli-modele/" target="_blank">ThemeFestival na wybiegu, czyli modele</a> (<em>34 odwiedzin</em>)</li>
<li><a href="http://przemyslawczatrowski.com/2010/09/26/okielznac-mysz-w-xna-wf/" target="_blank">Okiełznać mysz w XNA + WF</a> (<em>111 odwiedzin</em>)</li>
<li><a href="http://przemyslawczatrowski.com/2010/10/02/xna-picking-czyli-zaznaczanie-modeli/" target="_blank">[XNA] Picking, czyli zaznaczanie modeli</a> (<em>102 odwiedzin</em>)</li>
<li><a href="http://przemyslawczatrowski.com/2010/10/02/vs2010-ankhsvn/" target="_blank">VS2010 + AnkhSVN</a> (<em>185 odwiedzin</em>)</li>
<li><a href="http://przemyslawczatrowski.com/2010/10/07/graf-sceny/" target="_blank">Graf sceny</a> (<em>129 odwiedzin</em>)</li>
<li><a href="http://przemyslawczatrowski.com/2010/10/09/xna-rysowanie-bez-modelu/" target="_blank">[XNA] Rysowanie bez modelu</a> (<em>67 odwiedzin</em>)</li>
</ol>
<p style="text-align: justify;">Projekt <em>ThemeFestival</em> nie umarł, został raczej przesunięty na bliżej nieokreśloną przyszłość i inną platformę sprzętową (z zachowaniem tych samych technologii).</p>
<p style="text-align: justify;">Wszystkim zakwalifikowanym do dalszego etapu konkursu życzę powodzenia i gratuluję <img src="https://s.w.org/images/core/emoji/2.2.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemyslawczatrowski.com%2F2010%2F11%2F15%2Fdaj-sie-poznac-podsumowanie%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowtransparency="true"></iframe><!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://przemyslawczatrowski.com/2010/11/15/daj-sie-poznac-podsumowanie/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<post-id xmlns="com-wordpress:feed-additions:1">657</post-id>	</item>
		<item>
		<title>[XNA] Rysowanie bez modelu</title>
		<link>http://przemyslawczatrowski.com/2010/10/09/xna-rysowanie-bez-modelu/</link>
		<comments>http://przemyslawczatrowski.com/2010/10/09/xna-rysowanie-bez-modelu/#comments</comments>
		<pubDate>Sat, 09 Oct 2010 21:00:19 +0000</pubDate>
		<dc:creator><![CDATA[czoper]]></dc:creator>
				<category><![CDATA[Daj się poznać]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Theme Festival]]></category>
		<category><![CDATA[DajSięPoznać]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://przemyslawczatrowski.com/?p=652</guid>
		<description><![CDATA[W przeważającej większości content gry stanowią modele przygotowane przez grafików. Bez gotowego pliku z siatką też da się coś na ekranie wyświetlić. Do dzieła. Wierzchołki Pierwszą rzeczą, na którą należy się zdecydować, to format wierzchołka. Biblioteka XNA dostarcza 4 typy, ale definiowanie własnych nie stanowi większego problemu. Te typy to (nazwy odpowiadają polom definiującym pojedynczy [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>W przeważającej większości content gry stanowią modele przygotowane przez grafików. Bez gotowego pliku z siatką też da się coś na ekranie wyświetlić. Do dzieła.</p>
<p><span id="more-652"></span></p>
<h2>Wierzchołki</h2>
<p>Pierwszą rzeczą, na którą należy się zdecydować, to format wierzchołka. Biblioteka XNA dostarcza 4 typy, ale definiowanie własnych nie stanowi większego problemu.</p>
<p>Te typy to (nazwy odpowiadają polom definiującym pojedynczy wierzchołek):</p>
<ul>
<li><code>VertexPositionColor</code></li>
<li><code>VertexPositionTexture</code></li>
<li><code>VertexPositionColorTexture</code></li>
<li><code>VertexPositionNormalTexture</code></li>
</ul>
<p>Zabrakło mi w tym zestawie typu wierzchołka przechowującego pozycję, wektor normalny oraz kolor (bez współrzędnych tekstury), poniżej klasa opisująca właśnie taki typ:</p>
<pre class="brush: csharp; title: ; notranslate">
public struct VertexPositionNormalColor : IVertexType
{
    public Vector3 Position;
    public Color Color;
    public Vector3 Normal;

    public VertexPositionNormalColor(Vector3 position, Vector3 normal, Color color)
    {
        Position = position;
        Normal  = normal;
        Color = color;
    }

    public static int SizeInBytes = (3 + 3 + 1) * 4; // 3 floats for Position + 3 floats for Normal + 4 bytes for Color

    public static VertexElement[] VertexElements = new[]
    {
        new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
        new VertexElement(sizeof(float) * 3, VertexElementFormat.Color, VertexElementUsage.Color, 0),
        new VertexElement(sizeof(float) * 4, VertexElementFormat.Vector3, VertexElementUsage.Normal, 0),
    };

    public VertexDeclaration VertexDeclaration
    {
        get { return new VertexDeclaration(VertexElements); }
    }
}
</pre>
<p>Różne sposoby rysowania prymitywów graficznych (punkty, linie, trójkąty) opisuje <a title="Drawing points, lines and triangles." href="http://msdn.microsoft.com/en-US/library/bb196414(v=XNAGameStudio.40).aspx" target="_blank">świetny artykuł na MSDN</a>.</p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemyslawczatrowski.com%2F2010%2F10%2F09%2Fxna-rysowanie-bez-modelu%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowtransparency="true"></iframe><!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://przemyslawczatrowski.com/2010/10/09/xna-rysowanie-bez-modelu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<post-id xmlns="com-wordpress:feed-additions:1">652</post-id>	</item>
		<item>
		<title>Graf sceny</title>
		<link>http://przemyslawczatrowski.com/2010/10/07/graf-sceny/</link>
		<comments>http://przemyslawczatrowski.com/2010/10/07/graf-sceny/#comments</comments>
		<pubDate>Thu, 07 Oct 2010 22:32:20 +0000</pubDate>
		<dc:creator><![CDATA[czoper]]></dc:creator>
				<category><![CDATA[Daj się poznać]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Theme Festival]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[DajSięPoznać]]></category>
		<category><![CDATA[SceneGraph]]></category>
		<category><![CDATA[struktury danych]]></category>

		<guid isPermaLink="false">http://przemyslawczatrowski.com/?p=640</guid>
		<description><![CDATA[Kolejną ze struktur danych, jakie przydadzą się podczas tworzenia gry, jest graf sceny. Graf sceny będzie grafem dość specyficznym (acyklicznym i spójnym), co w teorii sprowadzi go do drzewa. Zielonym do.. dołu. Drzewa w informatyce rosną w dół. Korzeń znajduje się u szczytu, kolejne gałęzie, węzły (wierzchołki posiadające dzieci) i liście (wierzchołki, nie posiadające dzieci) [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Kolejną ze struktur danych, jakie przydadzą się podczas tworzenia gry, jest graf sceny. Graf sceny będzie grafem dość specyficznym (acyklicznym i spójnym), co w teorii sprowadzi go do <a title="drzewo (informatyka)" href="http://pl.wikipedia.org/wiki/Drzewo_(informatyka)" target="_blank">drzewa</a>.</p>
<p><span id="more-640"></span></p>
<h2>Zielonym do.. dołu.</h2>
<p style="text-align: justify;">Drzewa w informatyce rosną w dół. Korzeń znajduje się u szczytu, kolejne gałęzie, węzły (wierzchołki posiadające dzieci) i liście (wierzchołki, nie posiadające dzieci) są umieszczane niżej.</p>
<p style="text-align: justify;"><img class="aligncenter" title="Drzewo" src="http://upload.wikimedia.org/wikipedia/commons/6/67/Sorted_binary_tree.svg" alt="" width="283" height="226" />Przykładowe drzewo binarne (takie, w którym każdy wierzchołek może mieć co najwyżej dwoje dzieci) jest przedstawione na rysunku (źródło: Wikipedia).</p>
<h2>Koncepcja</h2>
<p style="text-align: justify;">Drzewo (bądź graf sceny, będę używał tych określeń zamiennie) posłuży do zorganizowania hierarchii sceny. Każdy z wierzchołków będzie obiektem klasy dziedziczącej po abstrakcyjnej klasie <code>GraphNode</code>.</p>
<p style="text-align: justify;">Będzie ona przechowywać macierz świata dla danego wierzchołka, listę jego dzieci, oraz informację o rodzicu. Pozwoli również na uaktualnienie stanu wierzchołka oraz narysowanie jego zawartości (przy obu metodach skorzystamy z polimorfizmu).</p>
<h2>Węzeł (wierzchołek)</h2>
<p>Klasa węzła przedstawia się następująco:</p>
<pre class="brush: csharp; title: ; notranslate">
public class GraphNode
{
    #region Variables
    private readonly Dictionary&lt;string, GraphNode&gt; children;
    protected Matrix world;
    protected GraphNode parent;
    protected bool Visible;
    public string Name { get; set; }
    public GraphNode Parent { get { return parent; } }
    #endregion

    public GraphNode this[string name]
    {
        get
        {
            if (children.ContainsKey(name))
                return children[name];

            foreach (GraphNode node in children.Values)
            {
                GraphNode res = node[name];
                if (res != null)
                    return res;
            }
            return null;
        }
    }

    public GraphNode()
    {
        parent = null;
        children = new Dictionary&lt;string, GraphNode&gt;();
        world = Matrix.Identity;
        Visible = true;
    }

    public void AddChild(GraphNode child)
    {
        child.parent = this;
        if (children.ContainsKey(child.Name))
            return;
        children.Add(child.Name, child);
    }

    public void RemoveChild(GraphNode child)
    {
        children.Remove(child.Name);
    }

    public virtual void Update(GameTime gameTime)
    {
        foreach (GraphNode child in children.Values)
            child.Update(gameTime);
    }

    public virtual void Draw(GameTime gameTime, Matrix _world)
    {
        foreach (GraphNode child in children.Values)
        {
            if (!child.Visible)
                continue;

            child.Draw(gameTime, _world);
        }
    }
}
</pre>
<p>Kilka wyjaśnień na temat zorganizowania klasy:</p>
<ul>
<li style="text-align: justify;">Każdy węzeł ma swoją nazwę, pozwoli to na odwoływanie się do konkretnego węzła przez odwołanie tylko do korzenia.</li>
<li style="text-align: justify;">Ze względu na poprzedni punkt, można użyć słownika do przechowywania listy dzieci &#8211; to implikuje metody do dodawania i usuwania dzieci.</li>
<li style="text-align: justify;">Rodzic (pole <code>parent</code>) jest równe <code>null</code> tylko dla korzenia drzewa.</li>
<li style="text-align: justify;">metody <code>Draw</code> oraz <code>Update</code> są oznaczone jako <code>virtual</code> &#8211; będziemy je nadpisywać w klasach pochodnych.</li>
</ul>
<p>Klasy pochodne będą reprezentować model oraz transformację względem rodzica. Pozwoli to na intuicyjne poruszanie się po grafie.</p>
<h2>Węzeł reprezentujący model</h2>
<p>Klasa ta jest mało złożona:</p>
<pre class="brush: csharp; title: ; notranslate">
public class ModelNode : GraphNode
{
    #region Variables
    private MyModel geometry;
    #endregion

    public MyModel Geometry
    {
        get { return geometry; }
        set { geometry = value; }
    }

    public ModelNode(MyModel geometry)
    {
        this.geometry = geometry;
    }

    public override void Draw(GameTime gameTime, Matrix _world, Matrix view, Matrix projection)
    {
        geometry.Draw(_world, view, projection);
        base.Draw(gameTime, _world, view, projection);
    }
}
</pre>
<p style="text-align: justify;">Nadpisaliśmy tu tylko metodę odpowiedzialną za odrysowanie siatki.</p>
<h2>Węzeł reprezentujący transformację</h2>
<p style="text-align: justify;">Kod mówi sam za siebie &#8211; uaktualniana jest macierz świata.</p>
<pre class="brush: csharp; title: ; notranslate">
public class TransformationNode : GraphNode
{
    public TransformationNode(Matrix transformation)
    {
        world = transformation;
    }

    public void Apply(Matrix transformation)
    {
        world *= transformation;
    }

    public Quaternion Rotation
    {
        get
        {
            Quaternion rotation;
            Vector3 scale;
            Vector3 translation;
            world.Decompose(out scale, out rotation, out translation);
            return rotation;
        }
    }

    public Vector3 Translation
    {
        get
        {
            Quaternion rotation;
            Vector3 scale;
            Vector3 translation;
            world.Decompose(out scale, out rotation, out translation);
            return translation;
        }
    }

    public Matrix Transformation
    {
        get { return world; }
        set { world = value; }
    }

    public override void Draw(GameTime gameTime, Matrix _world, Matrix view, Matrix projection)
    {
        Matrix tmp = _world * world;
        base.Draw(gameTime, tmp, view, projection);
    }
}
</pre>
<h2>Przykład zastosowania</h2>
<p style="text-align: justify;">Modelowym przykładem zastosowania grafu sceny jest Układ Słoneczny. Planety krążą wokół Słońca (każda z różną prędkością), dodatkowo każda z nich obraca się wokół własnej osi (każda z nich z różną prędkością), dodatkowo wokół nich krążą satelity (księżyce), które również się obracają.. ufff&#8230; sporo tego -&gt; uporządkujmy to. Najpierw rysunek powered by MS Paint:</p>
<p><a href="http://przemyslawczatrowski.com/wp-content/uploads/2010/10/SolarSystem.png" rel="lightbox[640]" title="SolarSystem"><img class="aligncenter size-full wp-image-641" title="SolarSystem" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/10/SolarSystem.png" alt="" width="465" height="479" srcset="http://przemyslawczatrowski.com/wp-content/uploads/2010/10/SolarSystem.png 465w, http://przemyslawczatrowski.com/wp-content/uploads/2010/10/SolarSystem-291x300.png 291w" sizes="(max-width: 465px) 100vw, 465px" /></a></p>
<p style="text-align: justify;">Prostokąty reprezentują węzły zawierające model do narysowania, okręgi &#8211; transformacje. Poszczególne transformacje przedstawiają się następująco (&#8222;I&#8221; to przekształcenie identycznościowe &#8211; macierz jednostkowa) :</p>
<ol>
<li style="text-align: justify;">Rotacja wokół osi Z (skierowanej w górę układu współrzędnych) &#8211; rotacja Marsa wokół własnej osi.</li>
<li style="text-align: justify;">Translacja wzdłuż osi X o odległość Marsa od Słońca.</li>
<li style="text-align: justify;">Rotacja wokół osi Z &#8211; rotacja Marsa wokół Słońca.</li>
<li style="text-align: justify;">Rotacja wokół osi Z (skierowanej w górę układu współrzędnych) &#8211; rotacja Ziemi wokół własnej osi.</li>
<li style="text-align: justify;">Translacja wzdłuż osi X o odległość Ziemi od Słońca.</li>
<li style="text-align: justify;">Rotacja wokół osi Z &#8211; rotacja Ziemi wokół Słońca.</li>
<li>itd. itd. itd.</li>
</ol>
<p>Jak będzie wyglądało rysowanie sceny?</p>
<ol>
<li style="text-align: justify;">Zaczynamy od korzenia (transformacja: macierz jednostkowa)</li>
<li style="text-align: justify;">Wywołujemy <code>Draw</code> dla pierwszego dziecka (niech będzie to transformacja 1); macierz świata = rotacja wokół Z</li>
<li style="text-align: justify;">Wywołujemy <code>Draw</code> dla pierwszego (i, jak się okazuje, jedynego) dziecka węzła z 2) &#8211; macierz świata = rotacja wokół Z * translacja</li>
<li style="text-align: justify;">Wywołujemy <code>Draw</code> dalej dla dziecka; macierz świata = rotacja wokół Z * translacja * rotacja wokół Z</li>
<li style="text-align: justify;">Wywołujemy <code>Draw</code> dla modelu Marsa, ustawiamy odpowiednią macierz świata (ustawiającą model planety w dobre położenie) i rysujemy model, <em>voila</em>!</li>
<li style="text-align: justify;">Wracamy z przechodzeniem drzewa do korzenia (ponieważ węzeł z modelem Marsa jest liściem); macierz świata = macierz jednostkowa</li>
<li style="text-align: justify;">Wywołujemy <code>Draw</code> dla kolejnego dziecka (transformacja 4); macierz świata = rotacja Ziemi wokół osi Z</li>
<li>itd. itd.</li>
</ol>
<p style="text-align: justify;">Jako, że transformacje są przechowywane względem rodzica (analogia do budowy modelu), transformujemy je do układu globalnego przez kolejne mnożenia macierzy. W ten sposób możemy intuicyjnie zbudować nawet dość skomplikowaną scenę.</p>
<h2>Podsumowanie i możliwości rozszerzeń</h2>
<p style="text-align: justify;">Przedstawiony graf sceny służy jedynie do odpowiedniego rozmieszczenia obiektów na potrzeby rysowania. Jako rozszerzenie można zamknąć scenę w jakąś strukturę danych do hierarchicznego podziału przestrzeni (np. Octree) aby usprawnić liczenie kolizji między obiektami, lub łatwo eliminować je z rysowania przeprowadzając wstępne testy widoczności obiektu. Ale to już materiał na jedno z innych spotkań.</p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemyslawczatrowski.com%2F2010%2F10%2F07%2Fgraf-sceny%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowtransparency="true"></iframe><!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://przemyslawczatrowski.com/2010/10/07/graf-sceny/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<post-id xmlns="com-wordpress:feed-additions:1">640</post-id>	</item>
		<item>
		<title>VS2010 + AnkhSVN</title>
		<link>http://przemyslawczatrowski.com/2010/10/02/vs2010-ankhsvn/</link>
		<comments>http://przemyslawczatrowski.com/2010/10/02/vs2010-ankhsvn/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 21:59:15 +0000</pubDate>
		<dc:creator><![CDATA[czoper]]></dc:creator>
				<category><![CDATA[Aplikacje]]></category>
		<category><![CDATA[Daj się poznać]]></category>
		<category><![CDATA[Theme Festival]]></category>
		<category><![CDATA[AnkhSVN]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://przemyslawczatrowski.com/?p=636</guid>
		<description><![CDATA[Korzystając jeszcze z Visual Studio 2008 bez problemu zintegrowałem z nim wtyczkę AnkhSVN, pozwalającą na obsługę tego systemu kontroli wersji bezpośrednio z poziomu IDE. Jednak po przeniesieniu się na Visual Studio 2010 i tradycyjnej instalacji wtyczki, nie dało się z niej skorzystać. Otóż VS 2010 posiada wbudowane narzędzie do wersjonowania kodu, bug trackingu itp. &#8211; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Korzystając jeszcze z Visual Studio 2008 bez problemu zintegrowałem z nim wtyczkę <a href="http://ankhsvn.open.collab.net/" target="_blank">AnkhSVN</a>, pozwalającą na obsługę tego systemu kontroli wersji bezpośrednio z poziomu IDE.</p>
<p>Jednak po przeniesieniu się na Visual Studio 2010 i tradycyjnej instalacji wtyczki, nie dało się z niej skorzystać. Otóż VS 2010 posiada wbudowane narzędzie do wersjonowania kodu, bug trackingu itp. &#8211; <a href="http://en.wikipedia.org/wiki/Team_Foundation_Server" target="_blank">Team Foundation Server</a>.</p>
<p>Aby zacząć korzystać z AnkhSVN, należy w opcjach <em>Source Control</em> ustawić korzystanie z opensource&#8217;owej wtyczki:</p>
<p><a href="http://przemyslawczatrowski.com/wp-content/uploads/2010/10/SourceControlSelection.png" rel="lightbox[636]" title="Source Control Selection"><img class="aligncenter size-medium wp-image-637" title="Source Control Selection" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/10/SourceControlSelection-300x202.png" alt="" width="300" height="202" srcset="http://przemyslawczatrowski.com/wp-content/uploads/2010/10/SourceControlSelection-300x202.png 300w, http://przemyslawczatrowski.com/wp-content/uploads/2010/10/SourceControlSelection.png 867w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemyslawczatrowski.com%2F2010%2F10%2F02%2Fvs2010-ankhsvn%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowtransparency="true"></iframe><!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://przemyslawczatrowski.com/2010/10/02/vs2010-ankhsvn/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	<post-id xmlns="com-wordpress:feed-additions:1">636</post-id>	</item>
		<item>
		<title>[XNA] Picking, czyli zaznaczanie modeli</title>
		<link>http://przemyslawczatrowski.com/2010/10/02/xna-picking-czyli-zaznaczanie-modeli/</link>
		<comments>http://przemyslawczatrowski.com/2010/10/02/xna-picking-czyli-zaznaczanie-modeli/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 15:46:16 +0000</pubDate>
		<dc:creator><![CDATA[czoper]]></dc:creator>
				<category><![CDATA[Daj się poznać]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Theme Festival]]></category>
		<category><![CDATA[DajSięPoznać]]></category>
		<category><![CDATA[Picking]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://przemyslawczatrowski.com/?p=618</guid>
		<description><![CDATA[Tak, jak wspominałem w ostatnim wpisie, kontynuujemy dzisiaj zmagania z interakcją Gracza z modelami znajdującymi się na scenie. Najpierw zamkniemy każdy z nich w &#8222;bańce&#8221;, którą następnie będziemy nękać promieniami (ang. rays) i domagać się odpowiedzi na najważniejsze z pytań: &#8222;Było przecięcie, czy nie?&#8221; (co najlepsze, odpowiedzią może być 42 :)). Zaznaczanie, czyli kolizja Zaznaczanie [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Tak, jak wspominałem w ostatnim wpisie, kontynuujemy dzisiaj zmagania z interakcją Gracza z modelami znajdującymi się na scenie. Najpierw zamkniemy każdy z nich w &#8222;bańce&#8221;, którą następnie będziemy nękać promieniami (ang. <em>rays</em>) i domagać się odpowiedzi na najważniejsze z pytań: &#8222;Było przecięcie, czy nie?&#8221; (co najlepsze, odpowiedzią może być <a href="http://pl.wikipedia.org/wiki/Wielkie_Pytanie_o_%C5%BBycie,_Wszech%C5%9Bwiat_i_ca%C5%82%C4%85_reszt%C4%99" target="_blank">42</a> :)).</p>
<p style="text-align: justify;"><span id="more-618"></span></p>
<h2>Zaznaczanie, czyli kolizja</h2>
<p style="text-align: justify;">Zaznaczanie można zrealizować na kilka sposobów. Można np. rysować każdy z obiektów sceny obiekty unikalnym kolorem do bufora. Potem po pobraniu koloru z interesującego nas miejsca możemy stwierdzić który obiekt został &#8222;trafiony&#8221;. Tu jednak skupimy się na innym podejściu.</p>
<p style="text-align: justify;">Ideą będzie <em>raycasting</em>, czyli rzucanie promienia. Nasza kamera ma dwie interesujące nas właściwości: położenie i kierunek patrzenia. Chcemy stworzyć promień, który wychodzi z punktu położenia kamery, podąża wzdłuż wektora kierunku patrzenia i sprawdza kolizje z kolejnymi obiektami na scenie. W zależności od potrzeb, będzie nas interesował tylko pierwszy obiekt &#8222;uderzony&#8221; przez promień lub też cała ich kolekcja. Jednak to już bardziej odległa sprawa, na razie zacznijmy od tego, od czego zaczynać się powinno, czyli od początku.</p>
<h2>Tworzenie promienia</h2>
<p style="text-align: justify;">XNA (jak zwykle) załatwia większą część pracy za nas, dostarczając nieocenionej metody <code>Vector3 Viewport.Unproject(Vector3 source, Matrix projection, Matrix view, Matrix world);</code> Odwraca ona ciąg przekształceń, który przechodzi każdy punkt sceny; ten ciąg to:</p>
<ol>
<li> przemnożenie przez macierz świata (przekształcenie do przestrzeni świata)</li>
<li>przemnożenie przez macierz widoku (przekształcenie do przestrzeni kamery)</li>
<li>przemnożenie przez macierz projekcji (rzutowanie na ekran).</li>
</ol>
<p style="text-align: justify;">W przypadku <code>Unproject</code>, podając punkt na ekranie (we współrzędnych ekranowych) otrzymujemy wektor w przestrzeni świata, krótko mówiąc jest to zamiana współrzędnych 2D na 3D. Aby wyznaczyć kierunek potrzebujemy dwóch takich punktów (trzeba jednocześnie wiedzieć, który z nich jest &#8222;bliżej&#8221; a który &#8222;dalej&#8221; jeszcze przed przekształceniem. Stwórzmy więc takie wektory, wyłuskajmy z nich ich pozycje 3D i stwórzmy wektor kierunku patrzenia kamery.</p>
<pre class="brush: csharp; title: ; notranslate">
private Ray CalculateCursorRay(float X, float Y, Matrix world, Matrix view, Matrix projection)
{
    Vector3 nearSource = new Vector3(X, Y, 0f);
    Vector3 farSource = new Vector3(X, Y, 1f);

    Vector3 nearPoint = GraphicsDevice.Viewport.Unproject(nearSource, projection, view, world);
    Vector3 farPoint = GraphicsDevice.Viewport.Unproject(farSource, projection, view, world);

    Vector3 direction = farPoint - nearPoint;
    direction.Normalize();

    return new Ray(nearPoint, direction);
}
</pre>
<p>Klasa <code>Ray</code>, obiektem której jest wynik działania powyższej metody, jest również częścią biblioteki XNA.</p>
<h2>Model w kuli, czyli <code>BoundingSphere</code></h2>
<p style="text-align: justify;">Po załadowaniu modelu z pliku (przy użyciu <code>Content.Load()</code>) dla każdej siatki (<em>mesh&#8217;a</em>) liczona jest tzw. <code>BoundingSphere</code>. Jak sama nazwa klasy wskazuje, przechowuje ona sferę otaczającą całą siatkę. Jest to podstawowy etap optymalizacji zagadnienia zaznaczania.</p>
<p style="text-align: justify;">Dla każdej siatki sfera otaczająca przechowywana jest w tzw. <em>Mesh space</em> (pozycja względem odpowiedniej siatki), czyli należy przekształcić jej środek i promień przez odpowiednią kość (and. <em>bone</em>, więcej o tym w <a href="http://przemyslawczatrowski.com/2010/09/25/themefestival-na-wybiegu-czyli-modele/" target="_blank">notce o modelach</a>). Rozbudujmy klasę MyModel o metodę za to odpowiedzialną:</p>
<pre class="brush: csharp; title: ; notranslate">
private static BoundingSphere TransformBoundingSphere(BoundingSphere sphere, Matrix transform)
{
    BoundingSphere transformedSphere;
    Vector3 scale3 = new Vector3(sphere.Radius, sphere.Radius, sphere.Radius);

    // transform, do not include translation
    scale3 = Vector3.TransformNormal(scale3, transform);

    // choose maximal scale to fit whole mesh inside sphere
    transformedSphere.Radius = Math.Max(scale3.X, Math.Max(scale3.Y, scale3.Z));
    transformedSphere.Center = Vector3.Transform(sphere.Center, transform);
    return transformedSphere;
}
</pre>
<p style="text-align: justify;">Skoro przekształcenia <code>BoundingSphere</code> mamy gotowe, możemy zająć się <em>clue</em> całego przedsięwzięcia, czyli faktycznym sprawdzeniem kolizji promienia z kulą otaczającą.</p>
<h2>Kolizje, przecięcia..</h2>
<p>Podsumujmy fakty:</p>
<ul>
<li>mamy dane promienia lecącego przez scenę wzdłuż kierunku patrzenia kamery</li>
<li>mamy dane kul otaczających każdą siatkę każdego modelu</li>
</ul>
<p style="text-align: justify;">Jedyne co musimy zrobić to policzyć ich kolizje, policzenie przecięcia promienia (czyli de facto półprostej w przestrzeni 3D) ze sferą nie jest zadaniem specjalnie skomplikowanym, jednak i to XNA rozwiązało za nas, dostarczając narzędzia. Uogólnimy trochę liczenie przecięć tworząc metodę zwracającą informację o kolizji promienia z modelem. Oto ona (umieszczona w klasie MyModel)</p>
<pre class="brush: csharp; title: ; notranslate">
public bool Insersects(Ray ray, Matrix world)
{
    // check every mesh of MyModel
    foreach (ModelMesh mesh in model.Meshes)
    {
        // get transformation from Mesh space to world space
        Matrix w = bones[mesh.ParentBone.Index] * world;

        // get BoundingSphere in world space coordinates
        BoundingSphere sphere = TransformBoundingSphere(mesh.BoundingSphere, w);

        // use Intersects method
        if (sphere.Intersects(ray) != null)
        return true;
    }

    // no mesh intersects
    return false;
}
</pre>
<p style="text-align: justify;">Zastosowaliśmy metodę <code>Intersects()</code> zwracającą <em>nullable float</em> (o typach <em>nullable</em> pisałem <a href="http://przemyslawczatrowski.com/2010/05/25/short-tip-07-c-i-po-raz-kolejny/" target="_blank">tu</a>). Jeżeli wynik metody nie jest <code>null</code>-em, zawiera odległość od początku promienia do punktu przecięcia, ta informacja jednak nie jest nam potrzebna.</p>
<h2>Uwagi</h2>
<p style="text-align: justify;">Powyższa metoda jest dobra na początek, jednak przy dalszych zastosowaniach może być niewystarczająca. Dlaczego? Z powodu mniejszej, niż wymagana dokładności. Otóż, jeżeli metoda <code>Intersects()</code> zwróci <code>false</code> to wiemy na pewno, że do kolizji nie doszło. Natomiast nie możemy być pewni, czy rzeczywiście trafiliśmy w siatkę, jeżeli <code>Intersects()</code> zwróci <code>true</code>. W tym przypadku jest to dobry początek do dalszych obliczeń.</p>
<p style="text-align: justify;">Receptami na ten problem mogą być: złożenie modelu z większej ilości małych siatek lub zastosowanie algorytmów do aproksymacji siatek kulami (postaram się przynajmniej jeden taki opisać).</p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemyslawczatrowski.com%2F2010%2F10%2F02%2Fxna-picking-czyli-zaznaczanie-modeli%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowtransparency="true"></iframe><!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://przemyslawczatrowski.com/2010/10/02/xna-picking-czyli-zaznaczanie-modeli/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<post-id xmlns="com-wordpress:feed-additions:1">618</post-id>	</item>
		<item>
		<title>Okiełznać mysz w XNA + WF</title>
		<link>http://przemyslawczatrowski.com/2010/09/26/okielznac-mysz-w-xna-wf/</link>
		<comments>http://przemyslawczatrowski.com/2010/09/26/okielznac-mysz-w-xna-wf/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 22:58:58 +0000</pubDate>
		<dc:creator><![CDATA[czoper]]></dc:creator>
				<category><![CDATA[Daj się poznać]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Theme Festival]]></category>
		<category><![CDATA[Mouse]]></category>
		<category><![CDATA[Windows Forms]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://przemyslawczatrowski.com/?p=605</guid>
		<description><![CDATA[Podstawowym elementem zaznaczania jest ustalenie pozycji myszy na ekranie. Przy pracy nad tą funkcjonalnością pewien delikatny niuans sprawił, że zajęło to zdecydowanie dłużej, niż zakładałem. Mysz w XNA Dobranie się do pozycji myszy w czystym XNA jest niezmiernie łatwo. Służy do tego obiekt klasy MouseState, który wypełniamy bieżącymi informacjami fragmentem kodu: Po wykonaniu takiej operacji [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Podstawowym elementem zaznaczania jest ustalenie pozycji myszy na ekranie. Przy pracy nad tą funkcjonalnością pewien delikatny niuans sprawił, że zajęło to zdecydowanie dłużej, niż zakładałem.</p>
<p><span id="more-605"></span></p>
<h2>Mysz w XNA</h2>
<p style="text-align: justify;">Dobranie się do pozycji myszy w czystym XNA jest niezmiernie łatwo. Służy do tego obiekt klasy <code>MouseState</code>, który wypełniamy bieżącymi informacjami fragmentem kodu:</p>
<pre class="brush: csharp; title: ; notranslate">
MouseState mouseState = Mouse.GetState();
</pre>
<p style="text-align: justify;">Po wykonaniu takiej operacji obiekt <code>mouseState</code> zawiera aktualną pozycję myszy (pola X oraz Y), stan przycisków (lewy, prawy, środkowy &#8211; stany wciśnięty lub nie) oraz np. wartość rolki (Scroll). Sprawdzenie tego będzie proste:</p>
<ul>
<li>do klasy dodajemy pole <code>Vector2 position;</code></li>
<li>w metodzie <code>Update()</code> pobieramy pozycję myszy i zapamiętujemy ją w <code>position</code></li>
<li>w metodzie <code>Draw()</code> rysujemy w miejscu wskazanym przez <code>position</code> krzyż oznaczający kursor: <a href="http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor.png" rel="lightbox[605]" title="cursor"><img class="alignnone size-full wp-image-606" title="cursor" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor.png" alt="" width="32" height="32" /></a>. Skorzystamy tu z informacji z poprzedniego wpisu do załadowania tekstury.</li>
</ul>
<p>w metodzie <code>LoadContent()</code></p>
<pre class="brush: csharp; title: ; notranslate">
cursor = Content.Load&lt;Texture2D&gt;(&quot;Textures\\cursor&quot;);
</pre>
<p>w metodzie <code>Update()</code></p>
<pre class="brush: csharp; title: ; notranslate">
private Vector2 position;

protected override void Update(GameTime gameTime)
{
    MouseState ms = Mouse.GetState();
    position = new Vector2(ms.X, ms.Y);
}
</pre>
<p>metoda <code>Draw()</code></p>
<pre class="brush: csharp; title: ; notranslate">
protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);

    spriteBatch.Begin();
    Vector2 textureCenter = new Vector2(cursor.Width / 2.0f, cursor.Height / 2.0f);
    spriteBatch.Draw(cursor, position, null, Color.White, 0.0f, textureCenter, 1.0f, SpriteEffects.None, 0.0f);
    spriteBatch.End();

    base.Draw(gameTime);
}
</pre>
<p style="text-align: justify;">Efekt zastosowania powyższego kodu widać na obrazku poniżej (UWAGA, jest to kod TYLKO dla XNA, bez umieszczania renderingu na formie Windows Forms)</p>
<p><a href="http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor1.png" rel="lightbox[605]" title="Kursor 1"><img class="aligncenter size-medium wp-image-607" title="Kursor 1" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor1-300x216.png" alt="Kursor 1" width="300" height="216" srcset="http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor1-300x216.png 300w, http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor1.png 766w" sizes="(max-width: 300px) 100vw, 300px" /></a>Jako, że ani PrintScreen ani Fraps nie rejestrują kursora myszy przy robieniu screenshot&#8217;a będę go zaznaczał czerwoną kropką.</p>
<p>Ten sam kod zastosujmy przy użyciu Windows Forms &#8211; rendering odbywa się na formie, pozycja kursora odczytywana jest przez <code>Mouse.GetState();</code></p>
<blockquote><p><a href="http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor2.png" rel="lightbox[605]" title="Kursor 2"><img class="aligncenter size-medium wp-image-608" title="Kursor 2" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor2-300x177.png" alt="Kursor 2" width="300" height="177" srcset="http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor2-300x177.png 300w, http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor2.png 978w" sizes="(max-width: 300px) 100vw, 300px" /></a>Houston, we have a problem..</p></blockquote>
<h2>Mysz z Windows Forms</h2>
<p>Rozwiązaniem okazało się użycie pozycji myszy pobranej z Windows Forms, z przetransformowaniem jej do współrzędnych okna. Stworzyłem drugą teksturę (czerwony krzyżyk), aby wyświetlić ją w miejscu obliczonym drugim sposobem i do porównania wyników, kod poniżej:</p>
<p>w metodzie <code>LoadContent()</code></p>
<pre class="brush: csharp; title: ; notranslate">
redCursor = Content.Load&lt;Texture2D&gt;(&quot;Textures\\cursor2&quot;);
</pre>
<p>w metodzie <code>Update()</code></p>
<pre class="brush: csharp; title: ; notranslate">
private Vector2 position;
private Vector2 wfPosition;

protected override void Update(GameTime gameTime)
{
    MouseState ms = Mouse.GetState();
    position = new Vector2(ms.X, ms.Y);

    System.Drawing.Point mousePos = form.PointToClient(Form.MousePosition);
    wfPosition = new Vector2(mousePos.X, mousePos.Y);
}
</pre>
<p>metoda <code>Draw()</code></p>
<pre class="brush: csharp; title: ; notranslate">
protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);

    spriteBatch.Begin();
    Vector2 textureCenter = new Vector2(cursor.Width / 2.0f, cursor.Height / 2.0f);
    spriteBatch.Draw(cursor, position, null, Color.White, 0.0f, textureCenter, 1.0f, SpriteEffects.None, 0.0f);
    spriteBatch.Draw(redCursor, wfPosition, null, Color.White, 0.0f, new Vector2(redCursor.Width, redCursor.Height), 1.0f, SpriteEffects.None, 0.0f);
    spriteBatch.End();

    base.Draw(gameTime);
}
</pre>
<p>Efekt poniżej:</p>
<p><a href="http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor3.png" rel="lightbox[605]" title="Kursor 3"><img class="aligncenter size-medium wp-image-609" title="Kursor 3" src="http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor3-300x177.png" alt="Kursor 3" width="300" height="177" srcset="http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor3-300x177.png 300w, http://przemyslawczatrowski.com/wp-content/uploads/2010/09/cursor3.png 978w" sizes="(max-width: 300px) 100vw, 300px" /></a>Jeżeli dokładnie nie widać czerwonej kropki &#8211; jest ona w okolicach środka czerwonego krzyża <img src="https://s.w.org/images/core/emoji/2.2.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h2>Podsumowanie</h2>
<p>Przy zaznaczaniu będzie trzeba zastosować podejście łączone &#8211; pozycję myszy pobierać przy użyciu Windows Forms (<code>Form.MousePosition + Form.PointToClient()</code>) natomiast informacje o wciśnięciu przycisku z obiektu <code>MouseState</code>.</p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fprzemyslawczatrowski.com%2F2010%2F09%2F26%2Fokielznac-mysz-w-xna-wf%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowtransparency="true"></iframe><!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://przemyslawczatrowski.com/2010/09/26/okielznac-mysz-w-xna-wf/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<post-id xmlns="com-wordpress:feed-additions:1">605</post-id>	</item>
	</channel>
</rss>
