<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3577160343134399871</id><updated>2012-02-16T09:55:37.101-08:00</updated><category term='Tvorba webu'/><category term='JavaScript'/><category term='matika'/><category term='programming'/><category term='AS3'/><title type='text'>Ivánkův blog</title><subtitle type='html'>Budu zde publikovat školní a další práce, které by mohly být užitečné pro ostatní.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-5357786396125955124</id><published>2011-09-23T07:22:00.000-07:00</published><updated>2011-11-30T15:05:46.962-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Nejlepší programovací jazyk pro začátečníky</title><content type='html'>&lt;p&gt;Tento problém trápí spoustu začátečníků. Ti mohou na internetu najít různé, více čí méně správné odpovědi. V tomto článku bych rád shrnul celou tuto problematiku.&lt;/p&gt;

&lt;a name='more'&gt;&lt;/a&gt;
&lt;p&gt;V tomto článku bych velmi nerad vnucoval ostatním svůj pohled na programování. Naopak budu rád, když se k němu &lt;b&gt;v komentářích vyjádříte&lt;/b&gt;, já to zvážím a článek patřičně upravím :) Chtěl bych, aby tento článek reprezentoval názor odborné většiny a aby ti zkušenější programátoři sem mohli s důvěrou odkázat své mladší kolegy, které trápí stejná otázka.&lt;/p&gt;

&lt;h2&gt;Který programovací jazyk je nejlepší?&lt;/h2&gt;

&lt;p&gt;To je stejné jako se ptát, &lt;b&gt;které auto je nejlepší?&lt;/b&gt;. Obě tyto věci, auta i programovací jazyky, jsou nástroje, které používáme za nějakým účelem. Každé auto se hodí na něco jiného. Pokud chceme převážet náklady, dáme přednost dodávce či kamionu před osobním autem. Ferrari je skvělé, když máme rádi rychlou jízdu, ovšem když pracujeme v zemědělství, spíš použijeme traktor. Rovněž záleží na osobních prioritách. Někdo upřednostňuje rychlost, jiný zase komfort nebo bezpečnost.&lt;/p&gt;

&lt;img src="http://www.whitefang.com/wp-content/uploads/2010/03/Programming-Languages.jpg" /&gt;

&lt;h2&gt;Který jazyk toho umí nejvíc?&lt;/h2&gt;

&lt;h3&gt;Model počítače&lt;/h3&gt;

&lt;p&gt;Ve 30. letech 20. století britský matematik &lt;a href="http://cs.wikipedia.org/wiki/Alan_Turing"&gt;Alan Turing&lt;/a&gt; zkoumal, co všechno lze a co naopak nelze čistě mechanickou prací "vypočítat". Přišel s myšlenkou tzv. &lt;a href="http://cs.wikipedia.org/wiki/Turing%C5%AFv_stroj"&gt;Turingova stroje&lt;/a&gt;. Je to matematický model počítače a lze na něm zkoumat, co všechno může nějaký stroj umět. Tímto Turing už před 70 lety přesně stanovil možnosti a hranice nejen současných, ale i budoucích počítačů.&lt;/p&gt;

&lt;h3&gt;Programovací jazyk&lt;/h3&gt;

&lt;p&gt;Programovací jazyk je prostředek, jak sdělit počítači, co po něm chceme. V našem jazyku by mělo jít vyjádřit všechno, co na daném počítači lze provést. To jest všechno, co dokáže udělat Turingův stroj. U jazyků se tak zkoumá "turingovská úplnost" nebo "turingovská ekvivalence". Všechny dnes používané programovacích jazyků jsou "turingovsky ekvivalentní", tedy "umí stejné věci", jako Turingův stroj.&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;Příklad z praxe&lt;/th&gt; &lt;th&gt;Příklad z praxe&lt;/th&gt; &lt;th&gt;Matematické zobecnění&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;sčítání jablek&lt;/td&gt; &lt;td&gt;sčítání hrušek&lt;/td&gt; &lt;td&gt;sčítání přirozených čísel&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;programování v Javě&lt;/td&gt; &lt;td&gt;programování v Pascalu&lt;/th&gt; &lt;td&gt;programování pro Turingův stroj&lt;/th&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;img src="http://www.arcadefire.com/wp/wp-content/uploads/2010/10/turing2.jpg" /&gt;

&lt;p&gt;Z výše uvedeného jasně vyplývá, že &lt;b&gt;všechny jazyky toho umí stejně&lt;/b&gt;. Každou věc, kterou napíšete v jednom jazyku, lze napsat i v jiném. Tj. v Haskellu můžete napsat 3D střílečku, v C můžete napsat interpret Javy, v Javě lze napsat překladač C, v JavaScriptu můžete napsat operační systém :) . Všechno tyto věci (hra, překladač, operační systém) jsou jen programy, které lze napsat v libovolném jazyce, jelikož si všechny jazyky odpovídají svými schopnostmi.&lt;/p&gt;

&lt;!--
&lt;h3&gt;Zajímavost se SEDem&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://cs.wikipedia.org/wiki/Sed"&gt;SED (Sequence EDitor)&lt;/a&gt; je program na Unixových systémech, který slouží k editaci textu. Program dostane řádky ve tvaru s/výraz/text, které říkají, že každá část textu odpovídající výrazu "výraz" se má nahradit textem "text". Navíc program obsahuje větvení "b" (testování nějaké podmínky) a možnost skoku "g" na jiný řádek s příkazy (třeba skočíme o pár řádků výš a provedeme znovu dané úpravy nad textem). To velmi připomíná práci Turingova stroje, a co čert nechtěl, SED je opravdu turingovsky úplný, a ačkoli nepřipomíná programovací jazyk (nejsou tam funkce, cykly a ani proměnné), lze v něm cokoli naprogramovat. A tak v něm kdosi z nudy naprogramoval &lt;a href="http://www.youtube.com/watch?v=JCqVT2htppA"&gt;hru Tetris&lt;/a&gt; (&lt;a href="http://uuner.doslash.org/forfun/sedtris.sed"&gt;zdrojový kód&lt;/a&gt;) :)&lt;/p&gt;
--&gt;

&lt;h2&gt;Rozdělení programovacích jazyků&lt;/h2&gt;

&lt;p&gt;Podle mě je správné rozdělovat jazyky podle tzv. "programovacího paradigmatu". To, co se doopravdy učíte, není jazyk, ale paradigma. Toto paradigma určuje, jakým způsobem musí programátor přemýšlet. V každém paradigmatu se musí přemýšlet trochu jinak. Pokud ovládáte jedno paradigma, ovládáte více-méně všechny jazyky z dané skupiny. Přechod z jednoho paradigmatu na jiné může být velmi náročný. Když jste zvyklí jen na jedno paradigma, kód z jiného paradigmatu se vám může zdát jako holý nesmysl.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Procedurální&lt;/b&gt; ( = imperativní = přikazovací)&lt;br /&gt;
- masivně používané v praxi &lt;br /&gt;
- píše se posloupnost instrukcí, které počítač provádí jednu za druhou&lt;br /&gt;
- jazyky: Jazyk symbolických adres, C, C++, Pascal, Basic, Fortran, Java, C#, PHP, ActionScript, JavaScript, ...
&lt;/li&gt;

&lt;li&gt;
&lt;b&gt;Neprocedurální&lt;/b&gt; ( = deklarativní = popisovací)&lt;br /&gt;
- používané ve velmi specifických případech. Buď proto, že se tam opravdu víc hodí, nebo proto, že je má dotyčný rád.&lt;br /&gt;
- píše se logika programu a vztahy mezi prvky programu
&lt;ul&gt;
&lt;li&gt;Funkcionální&lt;br/&gt;
- jazyky: Lisp, Scheme, Haskell&lt;/li&gt;
&lt;li&gt;Logické&lt;br /&gt;
- jazyky: Prolog, Gödel, Fril&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;b&gt;Ostatní&lt;/b&gt;&lt;br /&gt;
- turingovsky úplné jazyky, mající nějaké zvláštní paradigma&lt;br /&gt;
- často vytvořeny jen pro zábavu&lt;br /&gt;
- jazyky: výše zmíněný SED, Brainfuck, ...
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existují však i jazyky, umožňující zápis programu podle více paradigmat. Je to například Perl, Python nebo F#. Tyto jazyky mívají spoustu "vychytávek", které ušetří programátorovi čas a zkrátí kód. Podle mě jsou dost nepřehledné a nemám je moc rád, ale opět - je to individuální. Někdo má rád složité věci, někdo ne.&lt;/p&gt;

&lt;h3&gt;Nativní vs. interpretovaný program&lt;/h3&gt;

&lt;p&gt;Většina dnešních počítačů jsou elektronické, vybavené tzv. mikroprocesorem. Každý mikroprocesor má svoji sadu instrukcí, které umí provádět.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Nativní&lt;/b&gt; je program, který je převeden přímo do instrukcí pro daný mikroprocesor (strojový kód). Procesor čte instrukce jednu za druhou a provádí je. Je to velmi rychlé. Bohužel různé mikroprocesory mohou mít různé instrukční sady, a podle toho musíme udělat různé verze našeho programu.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Interpretovaný&lt;/b&gt; je program, který je převeden do instrukcí pro nějaký &lt;a href="http://cs.wikipedia.org/wiki/Virtu%C3%A1ln%C3%AD_stroj"&gt;virtuální stroj&lt;/a&gt;. Tento stroj je zase program, který čte tyto "virtuální" instrukce a převádí je na instrukce pro daný mikroprocesor, na kterém běží (říká se tomu, že je "interpretuje"). Samotný převod je často důvodem pomalého běhu oproti nativním programům. Stačí nám však jen jedna verze programu pro konkrétní virtuální stroj, ale musíme mít víc verzí virtuálních strojů pro každý procesor nebo operační systém, na kterém to chceme spouštět. Virtuální stroje jsou třeba:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java Virtual Machine (JVM) pro Javu&lt;/li&gt;
&lt;li&gt;Adobe Virtual Machine (AVM/AVM2) pro ActionScript (součást Flash Playeru)&lt;/li&gt;
&lt;li&gt;Common Language Runtime (CLR) pro jazyky z .NET (součást .NET frameworku)&lt;/li&gt;
&lt;li&gt;virtuální stroj pro JavaScript je většinou součástí webového prohlížeče.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Rozdělení imperativních jazyků&lt;/h3&gt;

&lt;p&gt;Programem rozumějme posloupnost instrukcí pro fyzický či virtuální stroj. Hlavní vlastností jazyků je rychlost, která často klesá s rostoucí přenositelností programů. Nativní program je bleskově rychlý, ale jen na daném procesoru / architektuře. Interpretovaný program nám poběží na různých procesorech a systémech (Windows, Linux, tablety, mobily, ...), ale kvůli převodu instrukcí bývá často pomalejší. Graf níže ukazuje "polohu" jazyka vzhledem k jeho rychlosti / přenositelnosti. &lt;/p&gt;

&lt;object data="http://www.ivank.net/blogspot/jazyky.svg" type="image/svg+xml" width="650" height="200"&gt;&lt;/object&gt;

&lt;p&gt;Existují také různé nezvyklé případy, kdy se třeba JavaScript přeloží do strojového kódu, či naopak kód C++ se interpretuje na virtuálním stroji.&lt;/p&gt;

&lt;h2&gt;Jak tedy začít&lt;/h2&gt;

&lt;p&gt;Je důležité si uvědomit, že začínající programátor se neučí jazyk. Učí se programovat a jazyk je jen prostředek pro zápis programu. &lt;strong&gt;Umění programovat není vázáno na žádný programovací jazyk.&lt;/strong&gt; Pokud umíte programovat třeba imperativním způsobem, tak se naučíte nový jazyk z dané skupiny během 2 dnů, maximálně týdne. Počet jazyků neříká vůbec nic o schopnostech programátora.&lt;/p&gt;

&lt;p&gt;Doporučuje se začít programovat s imperativním jazykem. Nejdříve nízkoúrovňový, potom vysokoúrovňový jazyk.&lt;/p&gt;

&lt;h3&gt;Nízkoúrovňový jazyk&lt;/h3&gt;
&lt;p&gt;S nízkoúrovňovým jazykem lépe pochopíte, jak počítač pracuje s daty v paměti, jak je ukládá, načítá a zpracovává. Doporučuji začít s jazykem &lt;b&gt;Pascal&lt;/b&gt;. Masochisté začínají s jazykem C, ten bych ale doporučil až ve chvili, kdy trochu ovládnete programování.&lt;/p&gt;

&lt;h3&gt;Vysokoúrovňový jazyk&lt;/h3&gt;
&lt;p&gt;Vysokoúrovňové jazyky nám nabídnou spoustu hotových "zkratek" a "vzorů", které jsme si museli v nízkoúrovňových jazycích sami programovat. Tím je například pohodlnější práce s dynamicky alokovanou pamětí a Objektově orientované programování. Doporučuji začít s jazyky &lt;b&gt;Java nebo C#&lt;/b&gt;.&lt;/p&gt;

&lt;h3&gt;C++&lt;/h3&gt;
&lt;p&gt;C++ je zvláštní jazyk. Je nízkoúrovňový, ale tváří se velmi vysokoúrovňově. Z obou kategorií přebírá to nejlepší. Kompiluje se do strojového kódu (je nativní), a proto je velmi rychlý. Navíc obsahuje spoustu konstrukcí, "zkratek" a "vzorů", které jsou obvyklé ve vysokoúrovňových jazycích a usnadní programátorovi práci. Kvůli rozsáhlosti těchto konstrukcí a tím i složitosti celkové syntaxe, &lt;strong&gt;tento jazyk začátečníkům rozhodně nedoporučuji&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;Algoritmy a datové struktury&lt;/h2&gt;

&lt;p&gt;Při praktickém programování programátoři hojně využívají algoritmů a datových struktur. Algoritmy a datové struktury však s programováním přímo &lt;b&gt;nijak nesouvisí&lt;/b&gt;! Jejich vztah bych naznačil takto:&lt;/p&gt;

&lt;table&gt;

&lt;tr&gt;
&lt;td&gt;psání programu v prog. jazyce&lt;/td&gt; &lt;td&gt;psaní pravopisně správných vět&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;zápis algoritmu pomocí prog. jazyka&lt;/td&gt; &lt;td&gt;psaní příběhu s dějem pomocí pravopisně správných vět&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Algoritmy a datové struktury nemusí být v prog. jazyce pro počítač. Algoritmy může provádět třeba člověk, datové struktury existují i mimo svět počítačů. Stejně jako příběh s dějem nemusí být zapsán pomocí pravopisně správných vět. Může být třeba převyprávěn či zfilmován. Je však jasné, že když chcete být dobrý spisovatel, znalost pravopisu nestačí!&lt;/p&gt;

&lt;p&gt;Přeji vám hodně štěstí, nápadů a trpělivosti při vašich prvních krocích, ať se daří! :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-5357786396125955124?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/5357786396125955124/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2011/09/nejlepsi-programovaci-jazyk.html#comment-form' title='Počet komentářů: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/5357786396125955124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/5357786396125955124'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2011/09/nejlepsi-programovaci-jazyk.html' title='Nejlepší programovací jazyk pro začátečníky'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-5307412507430178920</id><published>2011-08-07T03:19:00.001-07:00</published><updated>2011-08-07T06:42:36.793-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Kreslení grafů v JavaScriptu</title><content type='html'>V tomto článku bych vám rád ukázal předělávku své flash aplikace do HTML5. Jedná se o kreslení hezkých grafů z &lt;a href="http://ivankuckir.blogspot.com/2010/11/kresleni-hezkych-grafu-v-as3.html"&gt;Minulého článku&lt;/a&gt;.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;HTML5 aplikace&lt;/h2&gt;ActionScript 3 jsem přepsal do JavaScriptu, pro vykreslování jsem použil HTML5 komponentu &lt;b&gt;&amp;lt;canvas&amp;gt;&lt;/b&gt; a její metody. Navíc jsem přidal regulaci odpudivosti vrcholů a přitažlivosti pružin - hran. Grafy lze předávat jako parametry v URL. Aplikace je k dispozici na&lt;br /&gt;
&lt;h3&gt;&lt;a href="http://g.ivank.net/" title="Kreslení matematických grafů"&gt;g.ivank.net&lt;/a&gt;&lt;/h3&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-5307412507430178920?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/5307412507430178920/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2011/08/kresleni-grafu-v-javascriptu.html#comment-form' title='Počet komentářů: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/5307412507430178920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/5307412507430178920'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2011/08/kresleni-grafu-v-javascriptu.html' title='Kreslení grafů v JavaScriptu'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-2832076351320252288</id><published>2011-07-14T13:41:00.000-07:00</published><updated>2011-07-14T14:17:44.918-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Voroného diagram v JavaScriptu</title><content type='html'>&lt;p&gt;Už dlouhou dobu mě láká vyzkoušet si práci s JavaScriptem. Přece jen je to hlavní otevřený jazyk pro web, navíc v posledních letech vznikla řada opravdu rychlých interpretů pro JS.&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;iframe height="500" src="http://www.ivank.net/blogspot/jsVor" style="border: 5px solid #282923;" width="650"&gt;&lt;/iframe&gt;  &lt;br /&gt;
&lt;h2&gt;Čím je JS zajímavý&lt;/h2&gt;&lt;p&gt;Doposud jsem o JS věděl pouze to, že je hodně podobný ActionScriptu a že nemá třídy.&lt;/p&gt;&lt;p&gt;Zní to zvláštně, ale je to tak. JavaScript je objektově orientovaný, stejně jako ActionScript nebo C++, ale datové typy ani třídy v něm neexistují. Namísto tříd se používá &lt;a href="http://en.wikipedia.org/wiki/Prototype-based_programming"&gt;Prototypové programování&lt;/a&gt;. Je trochu těžké zvyknout si na absenci tříd, avšak po chvíli už vám to nebude vadit, nebo vám se to nedej bože začne líbit :)&lt;/p&gt;&lt;h2&gt;Přepis kódu z ActionScriptu do JS&lt;/h2&gt;&lt;p&gt;Se způsobem programování v JS jsem se seznámil ve &lt;a href="http://cs.wikipedia.org/wiki/Javascript"&gt;článku na wikipedii&lt;/a&gt;. Vypadalo to celkem jasně a jako cvičení jsem si řekl, že přepíši svoji knihovnu pro Voroného diagramy, kterou už mám napsanou v ActionScriptu a C++. Ze začátku jsem se trochu bál, že bude těžké přepsat AS do JS, ale nakonec to bylo až podezřele jednoduché, a co je ještě divnější, ono to i fungovalo! Během necelé hodiny bylo vše hotové. &lt;br /&gt;
&lt;/p&gt;&lt;h3&gt;Výsledek&lt;/h3&gt;&lt;p&gt;Výsledek můžete vidět výše. Diagramy vykresluji do HTML elementu "canvas". Bohužel jsem neměl implementaci haldy pro prioritní frontu a místo ní jsem použil pole. Časová složitost je tak $O(n^2)$ místo $O(n * log(n))$, kterou má flešová a C++ verze. Pomalost se může projevit při vysokém počtu bodů.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Přepis běžných imperativních objektových jazyků do JS by se dal shrnout do těchto bodů:&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Odstranit specifikace typů při definici proměnných&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;int a = 5; var a:int = 5;  =&amp;gt;  var a = 5; &lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Přepsat definice tříd na definice funkcí. Když se tyto funkce zavolají s "new", chovají se jako konstruktory&lt;/li&gt;
&lt;li&gt;Všechny metody tříd napojit na prototyp konstruktorů&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-2832076351320252288?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/2832076351320252288/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2011/07/voroneho-diagram-v-javascriptu.html#comment-form' title='Počet komentářů: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/2832076351320252288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/2832076351320252288'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2011/07/voroneho-diagram-v-javascriptu.html' title='Voroného diagram v JavaScriptu'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-8269386710353853363</id><published>2011-06-02T12:26:00.000-07:00</published><updated>2011-06-10T16:10:29.634-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matika'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Řešení hlavonamů v Prologu</title><content type='html'>Tato práce vznikla jako součást zápočtového programu na předmětu Neprocedurální programování, MFF UK. Jedná se o řešení konkrétního druhu hlavolamu v programovacím jazyce Prolog. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;iframe height="530" src="http://www.flashandmath.com/flashcs5/sliderweb/WebGraphSlider.swf" width="450"&gt;&lt;/iframe&gt;  &lt;br /&gt;
&lt;h2&gt;Posouvací puzzle na obecném grafu&lt;/h2&gt;&lt;h3&gt;Popis problému&lt;/h3&gt;&lt;p&gt;Mějme neorientovaný graf na n vrcholech, každý jeho vrchol je označen číslem z $[0, n-1]$ a zároveň obsahuje číslo z $[0, n-1]$.  Vrcholu obsahujícímu $0$ říkejme "prázdný" vrchol. Čísla se posouvají mezi vrcholy s použitím prázdného vrcholu, tj. obsahy vrcholů $U$ a $V$ můžeme prohodit, pokud je mezi nimi hrana a jeden z nich obsahuje $0$. &lt;br /&gt;
&lt;/p&gt;Puzzle je vyřešeno, když obsah každého vrcholu odpovídá jeho označení. &lt;br /&gt;
&lt;b&gt;Ukázka:&lt;/b&gt; čirou náhodou jsem na internetu našel flash hru (výše), která přesně odpovídá popisovanému problému (autorem je &lt;a href="http://webspace.ship.edu/deensley/"&gt;Douglas Ensley&lt;/a&gt;, &lt;a href="http://www.flashandmath.com/"&gt;FlashAndMath.com&lt;/a&gt;). Do stejné kategorie hlavolamů patří např. &lt;a href="http://cs.wikipedia.org/wiki/Patn%C3%A1ctka"&gt;Patnáctka&lt;/a&gt;. &lt;br /&gt;
&lt;h3&gt;Poznatky Wilsona (1974)&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;řešení může existovat pouze pro vrcholově 2-souvislé grafy (nemá smysl zkoumat např. stromy)&lt;/li&gt;
&lt;li&gt;obecně neřešitelné pro graf theta&lt;sub&gt;0&lt;/sub&gt; a kružnice&lt;/li&gt;
&lt;li&gt;bipartitní graf (např. mřížka) - řešitelné pouze pro sudé permutace, kterých je polovina&lt;/li&gt;
&lt;li&gt;v ostatních případech řešitelné vždy&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Algoritmus řešení&lt;/h3&gt;Řešíme postupným zkoušením všech možností, ovšem pouze do stanovené hloubky. V každém kroku vybíráme další krok prioritně dle heuristiky. &lt;br /&gt;
&lt;h3&gt;Heuristika&lt;/h3&gt;Definujme &lt;strong&gt;domácí vzdálenost&lt;/strong&gt; vrcholu $v$ jako délku nejkratší cesty od označení $v$ do obsahu $v$, tj, nejmenší počet tahů pro posun "domů". Definujme &lt;strong&gt;rozladěnost grafu&lt;/strong&gt; jako součet domácích vzdáleností přes všechny vrcholy. Puzzle je vyřešené, jakmile rozladěnost klesne na 0. Pokud z vrcholu obsahujícího $0$ máme více možností tahu, vybíráme z nich prioritně podle vlivu na rozladěnost grafu. Nejdříve ty, které ji zmenší, pak ty, co ji nezmění, nakonec ty, co ji zvětší. &lt;br /&gt;
&lt;h3&gt;Poznámky k mé implementaci&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Pro hledání nejkratších cest používám Floyd-Warshallův algoritmus.&lt;/li&gt;
&lt;li&gt;Pro seřazení vrcholů dle priority používám Insertion sort.&lt;/li&gt;
&lt;li&gt;Nedovoluji v řešení cykly délky 2 (Např. když hledáme řešení dlouhé do 10 kroků a řešením je [1,2,3,4], potom [1,2,1,2,3,4] nevrátím, ačkoli to je řešení a má do 10 kroků.&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;&lt;a href="http://www.ivank.net/blogspot/roll_puzzle.pl"&gt;Zdrojový kód v Prologu&lt;/a&gt;&lt;/h3&gt;&lt;h2&gt;Stručná dokumentace k programu&lt;/h2&gt;&lt;h3&gt;Vstup&lt;/h3&gt;Vstupní graf může být definován kdekoli v souboru s programem použitím predikátu  &lt;br /&gt;
&lt;pre&gt;graph(Název, g(V, E)). &lt;/pre&gt;Název je název grafu, pomoci kterého k němu budeme přistupovat V značí seznam vrcholů ve tvaru  &lt;br /&gt;
&lt;pre&gt;[označení-obsah, označení-obsah, ...]&lt;/pre&gt;E značí seznam hran ve tvaru  &lt;br /&gt;
&lt;pre&gt;[e(označení, označení), e(označení, označení), ...]&lt;/pre&gt;&lt;h3&gt;Ukázka&lt;/h3&gt;&lt;pre&gt;graph(ctverec,  g( [0-1, 1-2, 2-3, 3-0],  
                [e(0,1), e(1,2), e(2,3), e(3, 0)] ) ).
&lt;/pre&gt;Což znamena takovýto graf&lt;br /&gt;
&lt;img src="http://www.ivank.net/blogspot/puzzle-square.png" /&gt;  &lt;br /&gt;
&lt;h3&gt;Spuštění výpočtu&lt;/h3&gt;Výpočet se spustí predikátem  &lt;br /&gt;
&lt;pre&gt;solve(Název, Max-tahů).&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Název je název grafu v predikátu "graph"&lt;/li&gt;
&lt;li&gt;Max-tahů je horní hranice pro počet tahů ve výstupních řešeních.&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Výstup&lt;/h3&gt;Výstupem programu jsou všechny posloupnosti tahů do stanovené délky řešící hlavolam. Jsou ve tvaru &lt;br /&gt;
&lt;pre&gt;[vrchol, vrchol, vrchol, ...]&lt;/pre&gt;vrchol je označení vrcholu, který si v daném kroku prohazuje obsah s nulovým vrcholem. Tahy jsou uspořádány zleva. Pokud vám dané řešení nevyhovuje, vygenerujte si další zmáčknutím ";".  Pro náš výše uvedený graf je řešením toto &lt;br /&gt;
&lt;pre&gt;[2, 1, 0]&lt;/pre&gt;Stejně jako toto &lt;br /&gt;
&lt;pre&gt;[0, 1, 2, 3, 0, 1, 2, 3, 0]&lt;/pre&gt;&lt;h3&gt;Již vložené vsupy&lt;/h3&gt;Pro účely testování jsem do souboru přepsal některé grafy z výše uvedené URL a je možné se na ně dotazovat. Jsou to: graph1, graph3, graph5, graph7, graph9, graph11, graph17, graph30. Vyzkoušejte např. solve(graph1, 8). &lt;br /&gt;
&lt;h2&gt;Nejkratší řešení hlavolamů výše&lt;/h2&gt;Zadal jsem některé hlavolamy ze výše uvedené hry do programu a toto je výstup. Pokud chcete, můžete zadat zbytek a vypočítat si další hlavolamy, Patnáctky apod.&lt;br /&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th&gt;Číslo&lt;/th&gt;&lt;th&gt;Řešení&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;[2,4,3,2,1,0],  [2,3,4,2,1,0],  [1,2,4,3,2,0],  [1,2,3,4,2,0] &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;[4,3,0,2,1,0],  [4,3,0,1,2,0],  [3,4,0,2,1,0],  [3,4,0,1,2,0],  [2,1,0,4,3,0],  [2,1,0,3,4,0],  [1,2,0,4,3,0],  [1,2,0,3,4,0] &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;[3,2,1,0,3,4,1,0],  [1,4,3,0,1,2,3,0] &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;[5,4,1,2,5,4,1,0], [5,2,1,4,5,2,1,0], [1,4,5,2,1,4,5,0], [1,2,5,4,1,2,5,0], &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;[1,5,2,3,4,5,6,0] &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;[5,4,1,2,5,4,1,0],  [5,2,1,4,5,2,1,0],  [1,4,5,2,1,4,5,0],  [1,2,5,4,1,2,5,0] &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;[1,2,5,4,3,2,1,0,5,4,3,2,1,0] &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;[7,6,3,2,7,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,3,2,7,0] &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-8269386710353853363?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/8269386710353853363/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2011/06/reseni-hlavonamu-v-prologu.html#comment-form' title='Počet komentářů: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/8269386710353853363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/8269386710353853363'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2011/06/reseni-hlavonamu-v-prologu.html' title='Řešení hlavonamů v Prologu'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-2234863524880670871</id><published>2011-05-30T12:41:00.000-07:00</published><updated>2011-06-03T08:23:04.731-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>Hra ve stylu Untangle</title><content type='html'>&lt;p&gt;
Dnes se pokusíme využít znalosti z předchozích článků a vytvořit hru. Jedná se o typ hry, kde posouváme vrcholy rovinného grafu ve snaze nalézt jeho rovinné nakreslení. Zní to složitě, ale čtěte dál a hned bude vše jasné.
&lt;/p&gt;

&lt;a name='more'&gt;&lt;/a&gt;


&lt;object data="http://www.ivank.net/blogspot/Untangle.swf" height="450" type="application/x-shockwave-flash" width="650" name="gd" id="gd"&gt;          
&lt;param name="movie" value="http://www.ivank.net/blogspot/Untangle.swf" /&gt; 
&lt;/object&gt;  

&lt;h2&gt;Postup práce&lt;/h2&gt;

&lt;p&gt;Stanovme si, co vše potřebujeme a jak to budeme dělat.&lt;/p&gt;

&lt;h3&gt;Kde vzít grafy&lt;/h3&gt;

&lt;p&gt;
Ve hře se pracuje s rovinnými grafy, tedy grafy, které lze nakreslit tak, aniž by se nějaké hrany protínaly. Pokud uděláme náhodný graf, nemusí být rovinný (třeba $K_{3,3}$ 
&lt;a href="http://en.wikipedia.org/wiki/Water,_gas,_and_electricity"&gt;není rovinný&lt;/a&gt;). 
&lt;/p&gt;

&lt;p&gt;
Vstupní grafy je možné zadat ručně, ale musíme nejdříve nějaké hezké vymyslet. Další možností je nechat si je náhodně vygenerovat počítačem.
&lt;/p&gt;

&lt;p&gt;
Rovinným grafem by mohla být např. triangulace (mezi body v rovině dáme hrany tak, že každá stěna je trojúhelník). V minulém &lt;a href="http://ivankuckir.blogspot.com/2011/03/voroneho-diagram-v-as3.html"&gt;článku o Voroného diagramu&lt;/a&gt; jsme při výpočtu diagramu dostali vedlejší produkt, Delaunayho triangulaci. Tu můžeme použít, případně z ní odstranit nějaké hrany, aby graf nebyl tak komplikovaný.
&lt;/p&gt;

&lt;p&gt;
V grafu také potřebujeme kontrolovat protínání hran a podle toho je správně vykreslovat. Kontrolu protínání lze použít z &lt;a href="http://ivankuckir.blogspot.com/2011/04/jednoduche-geometricke-vypocty.html"&gt;předchozího článku&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Postup tedy je:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vytvořit v rovině vrcholy&lt;/li&gt;
&lt;li&gt;vypočítat na nich triangulaci - správný seznam hran&lt;/li&gt;
&lt;li&gt;vyhodit některé hrany pro zjednodušení grafu&lt;/li&gt;
&lt;li&gt;zamíchat vrcholy (my je dáme do kružnice)&lt;/li&gt;
&lt;li&gt;nechat uživatele hýbat vrcholy, podle toho překreslovat graf&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Kód&lt;/h2&gt;

&lt;pre class="brush: as3"&gt;
/*
   Vrcholy jsou třídy Point, graficky je reprezentuje
   třída Dot. Dot má pointer na svůj vrchol (Dot.p) 
*/

import net.ivank.voronoi.*;
import net.ivank.Geometry;

var i:int;
const n:int = 10;   // počet vrcholů
// rozměry scény
const w:int = stage.stageWidth;
const h:int = stage.stageHeight;
var dDot:Dot;       // vrchol, kterým se táhne
var edges:Vector.&lt; VEdge &gt;; 
var v:Voronoi = new Voronoi();
var vertices:Vector.&lt; Point&gt; = new Vector.&lt; Point &gt;();
&lt;/pre&gt;

&lt;h3&gt;Vytvoření grafu&lt;/h3&gt;

&lt;pre class="brush: as3"&gt;
// náhodné vrcholy
for(i = 0; i&lt; n; i++)
   vertices.push(new Point(150 + Math.random()*300, 120 + Math.random()*240 ));

// generujeme pro ně hrany (voronoi a delaunay)
edges = v.GetEdges(vertices, stage.stageWidth, stage.stageHeight);

// umístíme vrcholy do kružnice
for(i=0; i&lt; n; i++)
{
   vertices[i].x = w/2 + 170 * Math.cos(Math.PI*2*i/n);
   vertices[i].y = h/2 + 170 * Math.sin(Math.PI*2*i/n);
}

// přidáme na scénu DOTy
for(i = 0; i&lt; n; i++)
{   
   var d:Dot = new Dot();
   d.addEventListener(MouseEvent.MOUSE_DOWN, onDown );
   d.addEventListener(MouseEvent.MOUSE_UP,   onUp   );
   d.p = vertices[i];
   d.x = vertices[i].x; d.y = vertices[i].y;
   d.buttonMode = true;
   addChild(d);
}
&lt;/pre&gt;

&lt;p&gt;Už jen zbývá napsat vykreslování čar a také kontrolu, zda se nějaké dvě protínají (-&gt; kontrola, zda se žádné neprotínají). To jde napsat různými způsoby a konkrétní kód nechám na vás.&lt;/p&gt;

&lt;h2&gt;Vylepšení hry&lt;/h2&gt;

&lt;p&gt;
Pokud do hry přidáme pěknou grafiku, případně nějaké další extra funkce, bude hra mnohem pestřejší a pro určité procento populace i zábavná :) V tomto duchu jsem vytvořil hru &lt;a href="http://flytangle.ivank.net"&gt;FlyTangle&lt;/a&gt;. Pokud by vás bavila a máte Google Chrome, můžete si ji nainstalovat jako &lt;a href="https://chrome.google.com/webstore/detail/jiehpdnenmlknjcolgcnholekggjpjec"&gt;Chrome aplikaci&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-2234863524880670871?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/2234863524880670871/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2011/05/hra-ve-stylu-untangle.html#comment-form' title='Počet komentářů: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/2234863524880670871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/2234863524880670871'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2011/05/hra-ve-stylu-untangle.html' title='Hra ve stylu Untangle'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-3720432048253956519</id><published>2011-04-20T12:08:00.000-07:00</published><updated>2011-05-06T15:54:43.237-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matika'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>Jednoduché geometrické výpočty</title><content type='html'>&lt;p&gt;
V tomto článku si ukážeme nějaké základní geometrické výpočty v rovině. Kdybyste je někdy potřebovali, tak si je jen okopírujete, anebo vás to může motivovat k psaní vlastních, pokročilejších funkcí :)
&lt;/p&gt;

&lt;a name='more'&gt;&lt;/a&gt;

&lt;object data="http://www.ivank.net/blogspot/Geometry.swf" height="500" type="application/x-shockwave-flash" width="650" name="gd" id="gd"&gt;          
&lt;param name="movie" value="http://www.ivank.net/blogspot/Geometry.swf" /&gt; 
&lt;/object&gt;  

&lt;p&gt;
Začneme napsáním základních funkcí, které budeme využívat při psaní složitějších. Můžeme je dávat jako statické metody do třídy Geometry.
&lt;/p&gt;

&lt;h2&gt;Vzdálenost dvou bodů&lt;/h2&gt;

&lt;p&gt;
Vzdálenost dvou bodů (v prostoru s eukleidovskou metrikou) spočítáme Pythagorovou větou ($c = \sqrt{a\times a + b \times b}$).
&lt;/p&gt;

&lt;h3&gt;Kód&lt;/h3&gt;
&lt;pre class="brush: as3"&gt; 
public static function Distance(a:*, b:*):Number
{
   return(Math.sqrt( (b.x-a.x)*(b.x-a.x) + (b.y-a.y)*(b.y-a.y) ));
}
&lt;/pre&gt;

&lt;h2&gt;Zda bod leží v obdélníku&lt;/h2&gt;

&lt;p&gt;
Obdélník mějme definovaný dvěma body: levým horním a pravým dolním rohem ("b" a "c"). Ptáme se, jestli bod "a" leží uvnitř obdélníku. a.x musí být mezi b.x a c.x, a.y musí být mezi b.y a c.y.
&lt;/p&gt;
&lt;h3&gt;Kód&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
public static function isInRect(a:*, b:*, c:*):Boolean
{
   if(a.x &gt;= Math.min(b.x, c.x) &amp;&amp; a.x &lt;= Math.max(b.x, c.x)
   &amp;&amp; a.y &gt;= Math.min(b.y, c.y) &amp;&amp; a.y &lt;= Math.max(b.y, c.y)) 
   return true;
   return false;
}
&lt;/pre&gt;

&lt;h2&gt;Průsečík dvou úseček / přímek&lt;/h2&gt;

&lt;p&gt;
Mějme úsečky "a", "b" definované dvěma body (začátky "a1", "b1" a konce "a2", "b2"). Chceme zjistit bod, kde se protínají. Nejdřív najdeme průsečík přímek a, b. Aby to byl průsečík úseček, musí ležet mezi začátky a konci obou úseček.
&lt;/p&gt;
&lt;p&gt;
Při výpočtu průsečíku si přímku převedeme do směrnicového tvaru $y = f\times x + g$, kde "f" je směrnice a "g" je svislý posun.
&lt;/p&gt;
&lt;h3&gt;Kód&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
public static function GetLineIntersection(a1:*, a2:*, b1:*, b2:*):Point
{
   var f1:Number = -(a2.y - a1.y) / (a1.x - a2.x);
   var f2:Number = -(b2.y - b1.y) / (b1.x - b2.x);
   var g1:Number = a1.y - f1 * a1.x;
   var g2:Number = b1.y - f2 * b1.x;

   // rovnoběžky -&gt; žádný průsečík
   if(f1 == f2) return null;
   
   var inter:Point;
   if       (a1.x == a2.x) inter = new Point(a1.x, f2*a1.x + g2);
   else if  (b1.x == b2.x) inter = new Point(b1.x, f1*b1.x + g1);
   else     
   {
      inter = new Point((g2-g1)/(f1 -f2),0);
      inter.y =  f1 * inter.x + g1;
   }

   if(isInRect(inter, a1, a2) &amp;&amp; isInRect(inter, b1, b2)) return inter;
   return null;
}
&lt;/pre&gt;

&lt;h2&gt;Střed kružnice opsané&lt;/h2&gt;

&lt;p&gt;
Mějme tři body v rovině (a, b, c). Hledáme kružnici (její střed a poloměr), která prochází těmito třemi body. Tj. hledáme bod (střed kružnice), který má stejnou vzdálenost od a, b, c. Uděláme si osu úsečky a,b (to jsou body se stejnou vzdáleností k "a" a "b"), osu úsečky b,c (body stejně vzdáleny od b, c) a průsečík těchto os je stejně vzdálen od a, b, c.
&lt;/p&gt;
&lt;h3&gt;Kód&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
public static function GetCircumcenter(a:*, b:*, c:*):Point
{
   // m1 - bod uprostřed (a,b), osa ním prochází
   var f1 = (b.x - a.x) / (a.y - b.y);
   var m1 = new Point((a.x + b.x)/2, (a.y + b.y)/2);
   var g1 = m1.y - f1*m1.x;

   var f2 = (c.x - b.x) / (b.y - c.y);
   var m2 = new Point((b.x + c.x)/2, (b.y + c.y)/2);
   var g2 = m2.y - f2*m2.x;

   // ošetření degenerovaných případů
   // - tři body na přímce
   if     (f1 == f2)   return null;
   // - a, b ve stejné výšce -&gt; směrnice osy |ab| = nekonečno
   else if(a.y == b.y) return new Point(m1.x, f2*m1.x + g2);
   else if(b.y == c.y) return new Point(m2.x, f1*m2.x + g1);

   var x:Number = (g2-g1) / (f1 - f2);
   return new Point(x, f1*x + g1);
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-3720432048253956519?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/3720432048253956519/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2011/04/jednoduche-geometricke-vypocty.html#comment-form' title='Počet komentářů: 13'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/3720432048253956519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/3720432048253956519'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2011/04/jednoduche-geometricke-vypocty.html' title='Jednoduché geometrické výpočty'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-1743822553308847611</id><published>2011-03-13T15:50:00.000-07:00</published><updated>2011-03-19T09:45:38.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>Voroného diagram v AS3</title><content type='html'>&lt;p&gt;
Jak jste možná vytušili z &lt;a href="http://ivankuckir.blogspot.com/2011/03/fortunuv-algoritmus-jeho-implementace.html"&gt;předchozího článku&lt;/a&gt;, nyní si implementujeme Fortunův algoritmus pro hledání Voroného diagramu ve flashi.
&lt;/p&gt;

&lt;a name='more'&gt;&lt;/a&gt;

&lt;object data="http://www.ivank.net/blogspot/Voronoi.swf" height="500" type="application/x-shockwave-flash" width="650" name="gd" id="gd"&gt;          
&lt;param name="movie" value="http://www.ivank.net/blogspot/Voronoi.swf" /&gt; 
&lt;/object&gt;  

&lt;h2&gt;Knihovna Voronoi&lt;/h2&gt;

&lt;p&gt;
Celý kód jsem zabalil do jedné knihovny, aby byla snadno přístupná. Knihovnu si stáhnete kliknutím &lt;a href="http://www.ivank.net/blogspot/voronoi_AS3.zip"&gt;ZDE&lt;/a&gt;.
&lt;/p&gt;

&lt;h3&gt;Příklad použití&lt;/h3&gt;

&lt;pre class="brush: as3"&gt; 
import net.ivank.voronoi.*;       // import knihoven
import flash.geom.Point;

var i:int;
var edges:Vector.&lt; VEdge &gt;;       // vektor, kam se uloží hrany
var v:Voronoi = new Voronoi();    // tato instance vše spočítá
// vektor bodů, pro které počítáme diagram
var vertices:Vector.&lt; Point&gt; = new Vector.&lt; Point &gt;();

// přidáme náhodné body (pouze kladné pozice)
for(i = 0; i&lt; vnum; i++)
{
   var p = new Point(Math.random() * 1000 , Math.random() * 800)
   vertices.push(p);
}
// necháme si spočítat hrany, uvedeme rozměr diagramu
edges = v.GetEdges(vertices, 1000, 800);

// takto si nakreslíme Delaunayho triangulaci
graphics.lineStyle(3, 0x888888);
for(i = 0; i&lt; edges.length; i++)
{
   graphics.moveTo(edges[i].left .x, edges[i].left .y);
   graphics.lineTo(edges[i].right.x, edges[i].right.y);
}

// takto si nakreslíme Voroného diagram
graphics.lineStyle(5, 0x000000);
for(i = 0; i&lt; edges.length; i++)
{
   graphics.moveTo(edges[i].start.x, edges[i].start.y);
   graphics.lineTo(edges[i].end  .x, edges[i].end  .y);
}
&lt;/pre&gt;

&lt;h2&gt;Test výkonu&lt;/h2&gt;

&lt;p&gt;Pro reprezentaci fronty událostí lze použít pole nebo haldu. Podívjeme se na rychlost jednotlivých možnosti (diagram pro &lt;b&gt;200 bodů&lt;/b&gt;, přepočítává se při pohybu myši).&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Pole&lt;/b&gt; - přidání události: na konec pole; mazání události: vymazání + posun zbytku o políčko dozadu; výběr maxima: sort + odebrání posledního.&lt;/p&gt;

&lt;object data="http://www.ivank.net/blogspot/vor_array.swf" height="200" type="application/x-shockwave-flash" width="650" name="gd" id="gd"&gt;          
&lt;param name="movie" value="http://www.ivank.net/blogspot/vor_array.swf" /&gt; 
&lt;/object&gt;  

&lt;p&gt;&lt;b&gt;Halda&lt;/b&gt; - přidání událost, výběr maxima: dle &lt;a href="http://cs.wikipedia.org/wiki/Halda_(datov%C3%A1_struktura)"&gt;definice haldy&lt;/a&gt;.&lt;/p&gt;

&lt;object data="http://www.ivank.net/blogspot/vor_heap.swf" height="200" type="application/x-shockwave-flash" width="650" name="gd" id="gd"&gt;          
&lt;param name="movie" value="http://www.ivank.net/blogspot/vor_heap.swf" /&gt; 
&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-1743822553308847611?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/1743822553308847611/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2011/03/voroneho-diagram-v-as3.html#comment-form' title='Počet komentářů: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/1743822553308847611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/1743822553308847611'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2011/03/voroneho-diagram-v-as3.html' title='Voroného diagram v AS3'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-5997637041498613825</id><published>2011-03-08T12:51:00.000-08:00</published><updated>2011-04-29T17:25:49.140-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matika'/><title type='text'>Fortunův algoritmus a jeho implementace</title><content type='html'>Tato práce vznikla jako zápočtový projekt na předmětu Algoritmy a datové struktury 2, MFF UK. Pojí se k ní implementace v C++ (níže) a v ActionScript 3.0 (v příštím článku). 

&lt;a name='more'&gt;&lt;/a&gt;

&lt;h2&gt;Stručně o Voroného diagramu&lt;/h2&gt;

&lt;p&gt;
Mějme N bodů v rovině, kterým budeme říkat &lt;b&gt;místa&lt;/b&gt;. Přiřaďme místu $a$ množinu bodů $V(a)$ z dané roviny takovou, že vzdálenost její bodů od $a$ je menší nebo rovná vzdálenosti jakéhokoli jiného místa. Je zřejmé, že množina bodů $V(a)$ bude vytvářet souvislou plochu kolem místa $a$. Tj. ke každému místu $a$ patří oblast, ze které je to k $a$ nejblíž. 
&lt;/p&gt;

&lt;p&gt;
Průnikem dvou množin $V(a)$ a $V(b)$ jsou body, mající stejnou vzdálenost od $a$ jako od $b$, přitom žádné místo neleží v kratší vzdálenosti od nich. Mohou ležet na přímce, polopřímce nebo úsečce. Voroného diagramem nazveme právě množinu těchto bodů.
&lt;/p&gt;

&lt;img src="http://www.ivank.net/blogspot/vor/vor1.png" /&gt;

&lt;p&gt;Podobně lze Voroného diagram definovat pro vícerozměrné prostory a různé metriky.&lt;/p&gt;


&lt;h3&gt;VD jako graf&lt;/h3&gt;

&lt;p&gt;
Na voroného diagram se lze dívat jako na neorientovaný graf. Jeho hrany jsou výše zmíněné úsečky (průniky V(a) a V(b)) a vrcholy jsou průniky těchto úseček, tedy body, mající stejnou vzdálenost ke třem nebo více nejbližším místům. Poznamenejme, že některé hrany mohou vést do nekonečna. 
&lt;/p&gt;

&lt;h3&gt;Delaunayho triangulace&lt;/h3&gt;

&lt;p&gt;
Na množině bodů $P$ ležících v rovině lze vytvořit velké množství triangulací. Dleaunayho triangulací $DT(P)$ nazveme tu triangulaci, kde kružnice opsaná libovolnému trojúhelníku neobsahuje uvnitř žádné body z $P$. Tato triangulace má "nejrovnostrannější" trojúhelníky - maximalizuje se jejich minimální úhel. Delaunayho triangulace je duálním grafem k Voroného diagramu pro danou množinu bodů v rovině.
&lt;/p&gt;

&lt;img src="http://www.ivank.net/blogspot/vor/vor2.png" /&gt;


&lt;h3&gt;Algoritmy pro výpočet Voroného diagramu&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
Rozděl a panuj - algoritmus rozdělí body na pravou a levou část, rekurzivně spočítá Voroného diagramy těchto dvou částí a nakonec dvě části spojí, vytvořením chybějící části diagramu mezi nimi. 
&lt;/li&gt;
&lt;li&gt;
Inkrementální algoritmus - spočítá Voroného diagram pro dvě místa. Při přidávání dalšího místa vypočítá nový diagram pro danou část.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Nevýhody těchto algoritmů - náročná implementace, netriviální spojování diagramů, velké numerické chyby.
&lt;/p&gt;

&lt;h2&gt;Fortunův algoritmus&lt;/h2&gt;

&lt;p&gt;
Tento algoritmus je založen na "zamétání" roviny. Po rovině se pohybuje přímka $L$ (např. zezdola nahoru), která zpracuje každý bod, přes který projde. Pokusme se určit, které body $x$ ležící pod ní patří do Voroného diagramu. 
&lt;/p&gt;

&lt;p&gt;
Pokud je bod $x$ stejně daleko od dvou míst $a$ a $b$ (všechny 3 leží pod přímkou), ještě nemusí být v diagramu, jelikož těsně nad přímkou může ležet místo $c$, které je k němu blíž než $a$ či $b$. Voroného diagram můžeme určit pouze pro body, které mají blíž k nějakému místu $a$ než k přímce $L$. Tyto body leží pod parabolou ($a$ je její ohnisko a $L$ řídící přímkou, z definice paraboly).
&lt;/p&gt;

&lt;p&gt;
Hranice, pod kterou už můžeme diagram rozhodnout, je tvořená oblouky parabol (angl. "beachline"). Průsečíky parabol mají stejně daleko ke dvěma sousedním místům (ohniskům sousedních parabol) jako k přímce, a tedy při pohybu přímky $L$ "kreslí" diagram. Hranice je tedy posloupnost oblouků $p$ a jejich průsečíků $x$, kterým říkejme hrany, jelikož při pohledu na VD jako na graf $x$ kreslí jeho hranu.
&lt;/p&gt;
&lt;p&gt;Hraniční posloupnost $p_0, x_0, p_1, x_1, .... x_{n-1}, p_n$.&lt;/p&gt;

&lt;br /&gt;&lt;br /&gt;
&lt;img src="http://www.ivank.net/blogspot/vor/beachline.png" /&gt;
&lt;img src="http://upload.wikimedia.org/wikipedia/commons/2/25/Fortunes-algorithm.gif" style=" -webkit-transform: rotate(90deg); -moz-transform: rotate(90deg); -o-transform: rotate(90deg);" /&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;
Posloupnost se však během kreslení může změnit, a to dvěma způsoby:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Místní událost&lt;/strong&gt; - vstoupí do ní nové místo - nová parabola. Rozpůlí parabolu pod ní na dva oblouky a ze středu začnou vycházet do stran dvě nové hrany. Tedy parabolu $p_i$ nahradí posloupnost $p_i, x_i, p_{i+1}, x_{i+1}, p_{i+2}$, kde $p_i$ a $p_{i+2}$ mají ohnisko původní paraboly a $p_{i+1}$ má ohnisko v nově přidaném místě. 
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kružnicová událost&lt;/strong&gt; - zanikne parabola - sousední paraboly ji zatlačí a vznikne zde nová hrana.. Tedy posloupnost $x_{i-1}, p_i, x_i$ se nahradí novou hranou $x_i$. Místo, kde parabola $p_i$ zanikne, má stejně daleko k ohnisku pi jako k ohniskům obou sousedních oblouků, je tedy středem nimi definované kružnice (proto "kružnicová" událost).
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Události budeme uchovávat ve frontě, kde budou seřazeny podle y. Jelikož vidíme, že se hraniční posloupnost mění pouze v několika místech, můžeme s přímkou L hýbat diskrétně, z jedné události na druhou.
&lt;/p&gt;

&lt;h3&gt;Kód algoritmu&lt;/h3&gt;
&lt;p&gt;
&lt;a  onClick=" var kod=document.getElementById('pseudoKod'); kod.style.display='block'"&gt;Rozbalit kód&lt;/a&gt; - 
&lt;a  onClick=" var kod=document.getElementById('pseudoKod'); kod.style.display='none'"&gt;Skrýt kód&lt;/a&gt;
&lt;/p&gt;
&lt;pre id="pseudoKod" style="display:none; border-left: 4px solid #6ce26c;"&gt;
   pro každé místo 
   {
      vytvoříme místní událost &lt;b&gt;e&lt;/b&gt;, 
      e.bod = dané místo, vložíme e do fronty
   }
   dokud fronta není prázdná
   {
      &lt;b&gt;e&lt;/b&gt; = první událost z fronty, vyjmeme ji z fronty
      když e je Místní : PřidejParabolu( e.bod )
      jinak : OdstraňParabolu( e.parabola );
      dokresli hrany x_i
   }
   funkce PřidejParabolu ( bod u )
   {
      &lt;b&gt;par&lt;/b&gt; = oblouk pod bodem u;
      když par má event, kde zaniká, tak ho odstraň z fronty
      nové oblouky &lt;b&gt;a, b, c&lt;/b&gt;;
      b.site = u;
      a.site = c.site = par.site;
      xl, xr  = hrany z bodu na “par” ležícím pod u (levá, pravá)
      xl kolmá na (a.site, b.site);
      xr kolmá na (b.site, c.site);
      nahraď &lt;b&gt;par&lt;/b&gt; posloupností a, xl, b, xr, c
      ZkontrolujKružnici(a);
      ZkontrolujKružnici(c);
   }
   funkce OdstraňParabolu ( Parabola p )
   {
      &lt;b&gt;l&lt;/b&gt; = oblouk vlevo od p;
      &lt;b&gt;r&lt;/b&gt; = oblouk vpravo od p;
      když l nebo r mají eventy, kde zanikají, tak je odstraň z fronty
      s = střed kružnice definované l.site, p.site, r.site
      &lt;b&gt;x&lt;/b&gt; = nová hrana se středem v s, kolmá na (l.site, r.site)
      ukonči postranní hrany xl, xr bodem s
      nahraď posloupnost xl, p, xr hranou x
      ZkontrolujKružnici(l);
      ZkontrolujKružnici(r);
   }
   funkce ZkontrolujKružnici(Parabola p)
   {
      &lt;b&gt;l&lt;/b&gt; = oblouk vlevo od p;
      &lt;b&gt;r&lt;/b&gt; = oblouk vpravo od p;
      &lt;b&gt;xl, xr&lt;/b&gt; = hrany kolem p
      když l chybí  OR  r chybí  OR  l.site=r.site  &lt;b&gt;VRAŤ SE&lt;/b&gt;
      s = střed, kam konvergují xl a xr
      když s chybí (nekonvergují) &lt;b&gt;VRAŤ SE&lt;/b&gt;
      r = vzdálenost s a p.site (průměr kružnice procházející ohnisky)
      když s.y + r leží pod zametací přímkou  &lt;b&gt;VRAŤ SE&lt;/b&gt;
      &lt;b&gt;e&lt;/b&gt; = nová kružnicová událost
      e.parabola = p;
      e.y = s.y + r;
      přidej novou událost e do fronty 
   }
&lt;/pre&gt;

&lt;p&gt;
Spousta autorů mylně uvádí, že při kontrole kružnicové události stačí najít kružnici a zjistit, zda její vrchol leží nad zametací přímkou. To však nestačí, jelikož dvě okolní hrany mohou jít směrem od středu kružnice a nikdy se nesetkají.¨
&lt;/p&gt;

&lt;h3&gt;Implementace&lt;/h3&gt;

&lt;strong&gt;Fronta události&lt;/strong&gt;&lt;br /&gt;
&lt;p&gt;
Jako frontu událostí je zvykem použít prioritní frontu, ve které jsou události uspořádány podle souřadnice "y". Měla by umožňovat mazání prvků.
&lt;/p&gt;

&lt;strong&gt;Hraniční posloupnost&lt;/strong&gt;&lt;br /&gt;

&lt;p&gt;
Hraniční posloupnost lze reprezentovat jako obousměrně spojový seznam. Vkládání a mazání je jednoduché, ovšem vyhledání potřebné položky trvá lineární čas.
&lt;/p&gt;
&lt;p&gt;
Steven Fortune přišel s výbornou myšlenkou reprezentace hraniční posloupnosti jako binárního stromu.
&lt;/p&gt;

&lt;ul&gt;
 
&lt;li&gt;Každý list představuje jeden oblouk. Vnitřní uzly představují hrany.&lt;/li&gt;
&lt;li&gt;pokud je oblouk jeden, stromem je pouze jeden list&lt;/li&gt;
&lt;li&gt;
Při přidání paraboly do listu se daný list stane vnitřním uzlem, jedna půlka bude levým synem, vpravo bude vnitřní uzel, kde vlevo bude nový oblouk a vpravo druhá půlka.&lt;br /&gt;
&lt;img src="http://www.ivank.net/blogspot/vor/tree.png" /&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Mazání listu je rovněž jednoduché. Otec představuje levou nebo pravou hranu, určitý "vyšší předek" představuje další hranu. Pokud jsme levým synem, nahradíme otce pravým synem a obráceně. "Vyššímu předkovi" přiřadíme novou hranu.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Složitost&lt;/h3&gt;
&lt;p&gt;
&lt;b&gt;Věta&lt;/b&gt;: Pro $n \geq 3$ míst v rovině obsahuje Voroného diagram max. $2n - 5$ vrcholů a $3n - 6$ hran.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Důkaz&lt;/b&gt;: 
&lt;ol&gt;
&lt;li&gt;Pro body ležící na přímce to zřejmě platí.&lt;/li&gt;
&lt;li&gt;Předpokládejme, že body neleží na přímce.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Označme si:
&lt;ul&gt;
&lt;li&gt;$V$: počet vrcholů voroného diagramu&lt;/li&gt; 
&lt;li&gt;$E$: počet hran diagramu&lt;/li&gt; 
&lt;li&gt;$N$: počet stěn voroného diagramu = počet míst&lt;/li&gt; 
&lt;/ul&gt;
&lt;p&gt;
Z Eulerova vzorce víme, že pro každý souvislý rovinný graf platí, že:&lt;br /&gt;
$V - E + N = 2$
&lt;/p&gt;

&lt;p&gt;
Jelikož Voroného diagram obsahuje nekončící hrany, vytvořme vrchol "nekonečno" a spojme s ním tyto hrany. Nyní máme rovinný graf. &lt;br /&gt;
$(V + 1) - E + N = 2$
&lt;/p&gt;

&lt;p&gt;
U Voroného grafu navíc víme, že každý jeho vrchol (včetně "nekonečna") má stupeň aspoň 3. Hrana je mezi dvěma vrcholy, a tedy &lt;br /&gt;
$3 * (V + 1) \leq 2 * E$ &lt;br /&gt;
Jednoduchou algebraickou úpravou dostaneme původní tvrzení.
&lt;/p&gt;

&lt;p&gt;
Primitivní operace, jako vyhledání prvku ve stromu nebo ve frontě, vymazání z fronty, trvají logaritmický čas $O(log(n))$. Při každé události uděláme konstatntí počet těchto primitivních operací.
&lt;/p&gt;
&lt;p&gt;
Počet místních událostí je $N$, kružnicových je až $2N - 5$. Při každé z nich provedeme $k$ primitivních operací. Celková složitost je tedy $O(n*log(n))$.
&lt;/p&gt;

&lt;h3&gt;Implementace v C++&lt;/h3&gt;

&lt;p&gt;
&lt;a href="http://www.ivank.net/blogspot/vor/voronoi.zip"&gt;ZDE&lt;/a&gt; je moje implementace napsaná v C++ a komentovaná v angličtině. Součástí je i EXE soubor, který spustí animaci bodů a kreslení diagramů (v OpenGL). Rychlost je ohromující - program dokáže spočítat diagram pro 500 bodů 50 krát za vteřinu, výpočet je asi 10 krát rychlejší než stejná implementace v ActionScript 3.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-5997637041498613825?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/5997637041498613825/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2011/03/fortunuv-algoritmus-jeho-implementace.html#comment-form' title='Počet komentářů: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/5997637041498613825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/5997637041498613825'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2011/03/fortunuv-algoritmus-jeho-implementace.html' title='Fortunův algoritmus a jeho implementace'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-454334620392660599</id><published>2010-11-26T08:33:00.000-08:00</published><updated>2011-04-20T16:35:23.512-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matika'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>Kreslení hezkých grafů 3D</title><content type='html'>Dnes jsem se rozhodl navázat na svůj &lt;a href="http://ivankuckir.blogspot.com/2010/11/kresleni-hezkych-grafu-v-as3.html"&gt;Předchozí článek o kreslení hezkých grafů&lt;/a&gt;, a to tak, že jsem do kódu pouze přidal třetí souřadnici "z" (pro polohu, vektory síly a vše, kde předtím byl jen "x" a "y"). Pro vykreslování jsem použil knihovny &lt;a href="http://www.away3d.com"&gt;Away3DLite&lt;/a&gt;.

&lt;a name='more'&gt;&lt;/a&gt;

&lt;object data="http://www.ivank.net/blogspot/GraphDrawing3D.swf" height="450" type="application/x-shockwave-flash" width="650" name="gd" id="gd"&gt;          
&lt;param name="movie" value="http://www.ivank.net/blogspot/GraphDrawing3D.swf" /&gt;
&lt;param name="allowScriptAccess" value="always" /&gt;
&lt;/object&gt;  

&lt;h2&gt;Nakreslení grafu podle parametrů&lt;/h2&gt;

U této aplikace jsem navrhl možnost zadání grafu, který se má vykreslit. Tvar vstupu je

&lt;pre&gt;početVrcholů:hrana,hrana,hrana,hrana&lt;/pre&gt;

kde "hrana" je ve tvaru

&lt;pre&gt;odVrhcolu-doVrcholu&lt;/pre&gt;

&lt;h3&gt;Příklady&lt;/h3&gt;

&lt;table&gt;
&lt;tr&gt; &lt;th width="100"&gt;Název&lt;/th&gt;   &lt;th&gt;Kód (vložte nahoru)&lt;/th&gt; &lt;/tr&gt;

&lt;tr&gt; &lt;td&gt;Tyčka&lt;/td&gt;   &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;2:1-2&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Trojúhelník&lt;/td&gt;  &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;3:1-2,2-3,3-1&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Kružnice $C_7$&lt;/td&gt;  &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;7:1-2,2-3,3-4,4-5,5-6,6-7,7-1&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Hvězda&lt;/td&gt;    &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;4:1-2,1-3,1-4&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Čtyřstěn&lt;/td&gt;    &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;4:1-2,2-3,3-1,1-4,2-4,3-4&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Krychle&lt;/td&gt;    &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;8:1-2,2-3,3-4,4-1,5-6,6-7,7-8,8-5,1-5,2-6,3-7,4-8&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Osmistěn&lt;/td&gt;    &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;6:1-2,2-3,3-4,4-1,1-5,2-5,3-5,4-5,1-6,2-6,3-6,4-6&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;

&lt;tr&gt; &lt;td&gt;Dvacetistěn&lt;/td&gt;    &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;12:1-2,2-3,3-4,4-5,5-1,6-7,7-8,8-9,9-10,10-6,1-11,2-11,3-11,4-11,5-11,6-12,7-12,8-12,9-12,10-12,1-6,6-2,2-7,7-3,3-8,8-4,4-9,9-5,5-10,10-1&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;

&lt;tr&gt; &lt;td&gt;Dvanáctistěn&lt;/td&gt;    &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;20:1-2,2-3,3-4,4-5,5-1,6-7,7-8,8-9,9-10,10-6,1-11,2-12,3-13,4-14,5-15,6-16,7-17,8-18,9-19,10-20,11-16,16-12,12-17,17-13,13-18,18-14,14-19,19-15,15-20,20-11&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;

&lt;tr&gt; &lt;td&gt;Diabolo&lt;/td&gt;    &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;11:1-2,2-3,3-4,4-5,5-1,6-7,7-8,8-9,9-10,10-6,11-1,11-2,11-3,11-4,11-5,11-6,11-7,11-8,11-9,11-10&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Fanova rovina&lt;/td&gt;    &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;7:1-2,2-3,3-4,4-5,5-6,6-1,1-7,2-7,3-7,4-7,5-7,6-7,2-4,4-6,6-2&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;4D krychle&lt;/td&gt;    &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;16:1-2,2-3,3-4,4-1,5-6,6-7,7-8,8-5,1-5,2-6,3-7,4-8,9-10,10-11,11-12,12-9,13-14,14-15,15-16,16-13,9-13,10-14,11-15,12-16,1-9,2-10,3-11,4-12,5-13,6-14,7-15,8-16&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Trubka (???)&lt;/td&gt;    &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;18:1-2,2-3,3-4,4-5,5-6,6-1,1-7,7-2,2-8,8-3,3-9,9-4,4-10,10-5,5-11,11-6,6-12,12-1,7-8,8-9,9-10,10-11,11-12,12-7,13-14,14-15,15-16,16-17,17-18,18-13,1-13,13-2,2-14,14-3,3-15,15-4,4-16,16-5,5-17,17-6,6-18,18-1&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;

&lt;tr&gt; &lt;td&gt;$K_{10}$ neboli Gulička (díky Míšo :))&lt;/td&gt;    &lt;td&gt;&lt;a href="#gd" onClick="mG(this);"&gt;10:1-2,1-3,1-4,1-5,1-6,1-7,1-8,1-9,1-10,2-3,2-4,2-5,2-6,2-7,2-8,2-9,2-10,3-4,3-5,3-6,3-7,3-8,3-9,3-10,4-5,4-6,4-7,4-8,4-9,4-10,5-6,5-7,5-8,5-9,5-10,6-7,6-8,6-9,6-10,7-8,7-9,7-10,8-9,8-10,9-10&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt;

&lt;/table&gt;


Pokud vytvoříte nějaké další zajímavé grafy, napište je dolů do komentářů (pojmenování grafu a kód) a já je sem dopíšu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-454334620392660599?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/454334620392660599/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/kresleni-hezkych-grafu-3d.html#comment-form' title='Počet komentářů: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/454334620392660599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/454334620392660599'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/kresleni-hezkych-grafu-3d.html' title='Kreslení hezkých grafů 3D'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-4099096871552752202</id><published>2010-11-24T09:33:00.000-08:00</published><updated>2011-03-09T09:05:59.802-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>Aho-Corasick, kód v AS3</title><content type='html'>Ve dnešním díle si ukážeme způsob implementace algoritmu &lt;a href="http://cs.wikipedia.org/wiki/Aho-Corasick"&gt;Aho-Corasickové&lt;/a&gt;. Používá se pro vyhledávání slov v textu a je velmi rychlý oproti ostatním běžným metodám. Podobně se dá implementovat jazycích C, C++, C#, Java a dalších.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;

&lt;object data="http://www.ivank.net/blogspot/AHODrawing.swf" height="500" type="application/x-shockwave-flash" width="650"&gt;          
&lt;param name="movie" value="http://www.ivank.net/blogspot/AHODrawing.swf" /&gt;
&lt;/object&gt;  

&lt;h2&gt;Algoritmus Aho-Corasick&lt;/h2&gt;
Tento algoritmus lze rozdělit do 2 kroků:
&lt;ol&gt;
&lt;li&gt;stavba konečného automatu
   &lt;ul&gt;
   &lt;li&gt;výstavba trie z hledaných slov&lt;/li&gt;
   &lt;li&gt;konstrukce zpětné hrany pro každý uzel&lt;/li&gt;
   &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;průchod automatem - čtení textu po znacích, ukládání výsledků&lt;/li&gt;
&lt;/ol&gt;
V příkladu výše máme ve trii slova "depo", "sedět", "posed", "seno", "se". Prohledávaný text je v políčku dole. Pokud v nějakém kroku najdu hledaná slova (v jednom místě může končit více slov), rozsvítí se jejich koncová písmena.

&lt;h2&gt;Implementace&lt;/h2&gt;

&lt;h3&gt;Trie&lt;/h3&gt;  
Stavbu trie jsme si již ukázali v &lt;a href="http://ivankuckir.blogspot.com/2010/11/trie-v-as3.html"&gt;předchozím článku o Trii&lt;/a&gt;. Pro náš účel si do ní přidáme 5 dalších položek:
&lt;pre class="brush: as3"&gt;
   // ukazatel na předka a zpětná hrana
   public var parent:TNode;
   public var fall:TNode;
   // nějaké údaje pro snazší kreslení
   public var x:Number;
   public var y:Number;
   public var width:Number;
&lt;/pre&gt;

&lt;h3&gt;Konstrukce zpětných hran&lt;/h3&gt;

Pro konstrukci zpětných hran (pointer "fall") musíme prohledávat trii do šířky a potřebujeme &lt;a href="http://cs.wikipedia.org/wiki/Fronta_(datov%C3%A1_struktura)"&gt;frontu&lt;/a&gt;. Já jsem použil frontu z &lt;a href="http://lab.polygonal.de/ds/"&gt;balíčku AS3DS od PolygonLabs&lt;/a&gt; (proměnná "q").
&lt;pre class="brush: as3"&gt;
function MakeFallFunctions():void
{
   trie.fall = trie; // zpětná hrana z kořene je kořen
   q.enqueue(trie);  // přidám do fronty kořen
   while (q.size != 0) // prohledávám do šířky
   {
      var n:TNode = q.dequeue();
      var no:TNode;
      var i:int;
      for (i = 0; i &lt; 4; i++) // naházím potomky do fronty
      {
         no = n.cn[i];
         if (no == null) continue;
         while (no.next != null) { q.enqueue(no); no = no.next; }
         q.enqueue(no);
      }
      if (n == trie) continue; // kořen už má zpětnou hranu
      // od předka jdu po zpětných hranách než najdu pokračování
      // nebo dojdu do kořene
      var fall:TNode = n.parent.fall;
      while (fall.GetChild(n.c) == null &amp;&amp; fall != trie) fall = fall.fall;
      // když najdu pokračování, do nastavím do fall
      n.fall = fall.GetChild(n.c);
      if (n.fall == null) n.fall = trie; // není pokračování
      if (n.fall == n) n.fall = trie;
   }
}
&lt;/pre&gt;

&lt;h3&gt;Prohledávání - průchod automatem&lt;/h3&gt;

&lt;pre class="brush: as3"&gt;
function Prohledávej(e:MouseEvent):void
{
   var text:String = "V tomhle textu budu prohledávat.";
   var cState = trie; // aktuální stav
   var n:TNode;       // pomocné uzly
   var no:TNode;
   var b:String;      // písmeno, které čteme
   for(var i:int=0; i &lt; text.length; i++)
   {
      n = cState;
      b = text.charAt(i);
      
      // jedu po zp. hranách, než najdu pokračování
        while (n.GetChild(b) == null &amp;&amp; n != trie) n = n.fall;
      
      // když jsem se dostal do kořene
        if (n == trie)
        {
            n = n.GetChild(b);
            if (n == null) n = trie;
        }
        else n = n.GetChild(b); // našel jsem pokračování
      
      no = n; // jedu po fallech do kořene, tím projdu všechny přípony
      while(no!= trie)
      {
         if(no.isEnd){/* právě jsem našel slovo, co končí v "no"*/}
         no=no.fall;
      }
      cState = n;
   }
}
&lt;/pre&gt;

&lt;h2&gt;Lineární složitost algoritmu&lt;/h2&gt;

&lt;p&gt;
Při vysvětlování nebudu uvažovat složitost hlášení nalezených slov. Jen dodám, že jde vyřešit v konstantním čase.&lt;/p&gt;

&lt;p&gt;
Nechť prohledávaný text má $n$ znaků. Při hledání děláme buď pohyby "dolů" - na další písmeno, nebo "nahoru" - po zpětné hraně. S každým písmenem se pohneme max. jednou dolů. Počet pohybů "dolů" je max. $n$. &lt;/p&gt;

&lt;p&gt;
Abychom mohli udělat několik pohybů nahoru (po zpětných hranách), musíme nejdříve udělat aspoň stejně tolik pohybů dolů (abychom byli v patřičné "hloubce"). Počet pohybů nahoru tedy nikdy nepřekročí počet pohybů dolů. Celkový počet pohybů (nahoru i dolů) během celého výpočtu nikdy nepřekročí $2n$, algoritmus tedy má lineární složitost $O(n)$.
&lt;/p&gt;

&lt;h2&gt;Závěr&lt;/h2&gt;
&lt;p&gt;
Aho-Corasickovou jsem původně programoval v C#, teď jsem ten kód jen přepsal do AS3. Tento algoritmus se v AS3 nikdy neprogramuje, jelikož když hledáme málo prvků v krátkém textu, vystačíme si se String.indexOf("..."). Pokud hledáme hodně prvků ve velkém textu, nepoužijeme Flash, ale efektivnější nástroj, např. unixový program &lt;a href="http://cs.wikipedia.org/wiki/Grep"&gt;grep&lt;/a&gt;. Tento článek má spíše sloužit jako ilustrace a nástřel k implementaci Aho-Corasickové v jiných jazycích.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-4099096871552752202?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/4099096871552752202/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/aho-corasick-implementace-v-as3.html#comment-form' title='Počet komentářů: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/4099096871552752202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/4099096871552752202'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/aho-corasick-implementace-v-as3.html' title='Aho-Corasick, kód v AS3'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-9098512018083632578</id><published>2010-11-21T23:20:00.000-08:00</published><updated>2011-03-09T09:04:57.907-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>Kreslení hezkých grafů v AS3</title><content type='html'>V tomto článku se podíváme na způsoby kreslení hezkých grafů do roviny. Použijeme fyzikální, tzv. "pružinový" algoritmus, v průběhu kterého si budeme graf vykreslovat. 
&lt;a name='more'&gt;&lt;/a&gt;

&lt;object data="http://www.ivank.net/blogspot/GraphDrawing.swf" height="450" type="application/x-shockwave-flash" width="650"&gt;          
&lt;param name="movie" value="http://www.ivank.net/blogspot/GraphDrawing.swf" /&gt;
&lt;/object&gt;  

&lt;h2&gt;Grafy a jejich nakreslení&lt;/h2&gt;
&lt;h3&gt;Grafy&lt;/h3&gt;
Klasický &lt;a href="http://cs.wikipedia.org/wiki/Graf_(teorie_graf%C5%AF)"&gt;graf&lt;/a&gt; je definován množinou vrcholů (např. ${a, b, c, d}$) a množinou hran, což jsou dvojice vrcholů ($\{ \{ a,b\}, \{b,c\}, \{c,d\}, \{d,a\}\}$). Většina lidí by tento graf nakreslila jako "čtvereček", ovšem způsobů, jak ho nakreslit, je mnoho, některé se nám esteticky líbí více, některé méně.

&lt;h3&gt;Co je to hezké nakreslení&lt;/h3&gt;
Zkusme hezké nakreslení nějak definovat. Určitě budeme chtít, aby vrcholy nebyly příliš blízko u sebe, už vůbec ne jeden na druhém. Budeme asi také chtít, aby hrany byly rozumně dlouhé a nekřížily se příliš často. Můžeme si vymyslet i spoustu dalších kritérií.

&lt;h3&gt;Pružinový model&lt;/h3&gt;
V tomto modelu přiřadíme každému vrcholu "antigravitaci", odpudivou sílu. Díky tomu vrcholy nebudou příliš blízko u sebe. Mezi dvojice vrcholů, kde vede hrana, přidáme přitažlivou sílu (pružinu). Postupem času se působení sil ustálí a graf bude "hezký".

&lt;h2&gt;Třída Vertex&lt;/h2&gt;
 
&lt;pre class="brush: as3"&gt;
package
{
   import flash.display.Sprite;
   import flash.geom.Point;
 
   public class Vertex extends Sprite
   {
      // rychlost vrcholu
      public var velocity:Point = new Point(); 
      // síla vůči aktuálnímu modelu
      public var net_force:Point = new Point();
      public var isDragged:Boolean = false;  // zda ho táhnu myší

      public function Vertex():void
      {
         // doprostřed nakreslím kroužek
         with(graphics)
         {
            beginFill(0xFF005E);
            drawEllipse(-12, -12, 24, 24);
            endFill();
         }
      }
   }
}
&lt;/pre&gt;

&lt;h2&gt;Vytvoření grafu&lt;/h2&gt;

&lt;pre class="brush: as3"&gt;
   // množina vrcholů
   vertices = new Vector.&lt; Vertex &gt;(n, true);
   // hrany v grafu incidence
   edges = new Vector. &lt; Vector.&lt; Boolean &gt;&gt;(n, true);
   for(i=0; i &lt; n; i++) edges[i] = new Vector.&lt; Boolean &gt;(n, true);
   while(e &gt; 0) // přidám hrany
   {
      var a:int = Math.floor(Math.random()*n);
      var b:int = Math.floor(Math.random()*n);
      if(a==b || edges[a][b])continue;
      edges[a][b] = true;
      edges[b][a] = true;
      e--;
   }
   // přidám vrcholy
   for(i=0; i &lt; n; i++)
   {
      var v:Vertex = new Vertex();
      v.x = 200+Math.random()*300;
      v.y = 100+Math.random()*200;
      vertices[i] = v;
      addChild(v);
      v.addEventListener(MouseEvent.MOUSE_DOWN, drag);
      v.addEventListener(MouseEvent.MOUSE_UP, sdrag);
   }
&lt;/pre&gt;

&lt;h2&gt;Vykreslování modelu&lt;/h2&gt;

Už máme vrcholy na náhodných pozicích. Teď provádíme iterace, v každé z nich přepočítáme polohu každého vrcholů podle ostatních vrcholů a podle jeho hran. Iterace provádíme, než "rozklepanost" (kinetická energie) systému neklesne pod nějaké minimum. V příkladu níže provádím iterace při každém snímku, model se nikdy úplně nezastaví.
&lt;pre class="brush: as3"&gt;
function onEF(e:Event):void
{
   for(i=0; i &lt; n; i++) // projdu vrcholy
   {
      var v:Vertex = vertices[i];
      var u:Vertex;
      v.net_force.x = v.net_force.y = 0;
      for(j=0; j &lt; n; j++) // spočítám odpudivou sílu vůči ostatním
      {
         if(i==j)continue;
         u = vertices[j];
         var rsq:Number = ((v.x-u.x)*(v.x-u.x)+(v.y-u.y)*(v.y-u.y))/200;
         v.net_force.x += (v.x-u.x) /rsq;
         v.net_force.y += (v.y-u.y) /rsq;
      }
      for(j=0; j &lt; n; j++) // spočítám přitažlivou sílu pro hrany
      {
         if(!edges[i][j])continue;
         u = vertices[j];
         v.net_force.x += 0.06*(u.x - v.x);
         v.net_force.y += 0.06*(u.y - v.y);
      }
      v.velocity.x = (v.velocity.x + v.net_force.x)*0.85; 
      v.velocity.y = (v.velocity.y + v.net_force.y)*0.85; 
   }
   for(i=0; i &lt; n; i++) // nastavím vrcholům nové pozice
   {
      v = vertices[i];
      if(v.isDragged){ v.x = mouseX; v.y = mouseY; }
      else { v.x += v.velocity.x; v.y += v.velocity.y; }
   }
   // nakreslím hrany
   graphics.clear();
   graphics.lineStyle(3, 0x333333);
   for(i=0; i &lt; n; i++)
   {
      for(j=0; j &lt; n; j++)
      {
         if(!edges[i][j]) continue;
         graphics.moveTo(vertices[i].x, vertices[i].y);
         graphics.lineTo(vertices[j].x, vertices[j].y);
      }
   }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-9098512018083632578?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/9098512018083632578/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/kresleni-hezkych-grafu-v-as3.html#comment-form' title='Počet komentářů: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/9098512018083632578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/9098512018083632578'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/kresleni-hezkych-grafu-v-as3.html' title='Kreslení hezkých grafů v AS3'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-766468705881516345</id><published>2010-11-17T06:15:00.000-08:00</published><updated>2011-03-09T09:04:16.033-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>Trie v AS3</title><content type='html'>Dnes se ve flashi pokusíme implementovat datovou strukturu Trie. Kromě samotné trie ji navíc nějak hezky vykreslíme, abychom dostali přehledné znázornění této struktury. 
&lt;a name='more'&gt;&lt;/a&gt;

&lt;object data="http://www.ivank.net/blogspot/TrieDrawing.swf" height="450" type="application/x-shockwave-flash" width="650"&gt;          
&lt;param name="movie" value="http://www.ivank.net/blogspot/TrieDrawing.swf" /&gt;
&lt;/object&gt;  

&lt;h2&gt;Něco o Trii&lt;/h2&gt;
Řekněme, že náš program dostane tisíc slov, která musíme uložit do nějaké struktury. Poté nám budou chodit dotazy, zda naše struktura obsahuje konkrétní slovo. Uložení prvku do lineárního pole by bylo paměťově náročné, zároveň při hledání slova bychom museli projít všechny prvky. Trie je na tom o mnoho lépe. Sice přidání slova není tak rychlé jako u pole, ale hledání je výrazně rychlejší. Pokud v každém uzlu uchováváme pole o velikosti celé abecedy, jdeme od kořene přímo k listu, složitost je rovná délce slova. Více ve &lt;a href="http://cs.wikipedia.org/wiki/Trie"&gt;článku na Wikipedii&lt;/a&gt;.
  
&lt;h2&gt;Třída TNode&lt;/h2&gt;
&lt;h3&gt;Co od trie chci&lt;/h3&gt;
&lt;p&gt;
Chci si trii snadno vytvářet (var trie = new ...), snadno přidávat slova (trie.AddWord("ahoj");). Chci snadno zjišťovat, zda obsahuje nějaké slovo (if(trie.Contains("ahoj")) ...).  
&lt;/p&gt;
&lt;h3&gt;Jak ukládat potomky uzlu&lt;/h3&gt;

Každý uzel ve trii může mít potomků od 0 až do velikosti abecedy. Abecedy jsou často velké (26 - písmena ang. abecedy, 256 - ASCII znaky, $2^{16}, 2^{24}, 2^{32}$ - znaky Unicode atd.). Avšak uzel většinou neobsahuje všechny tyto potomky. Paměťově efektivnější použít nějaké menší pole pevné velikosti, do kterého budeme prvky hešovat. Níže ukládám prvek na pozici (kód znaku) modulo 4. Kolize řeším vytvářením spojového seznamu.  
&lt;img height="200" src="http://www.ivank.net/blogspot/tnode.png" width="250" /&gt;  

&lt;h3&gt;Základní třída&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
package
{
   public class TNode
   {
      // pole 4 potomků tohoto uzlu
      public var cn:Vector.&lt;tnode&gt; = new Vector.&lt;tnode&gt;(4, true);
      public var c:String;   // znak uložený v uzlu
      public var next:TNode; // ukazatel na další prvek na stejné úrovni
      public var isEnd:Boolean = false; // zda je uzel koncem slova
  
      public function TNode(c:String):void
      {
         this.c = c; // přiřadím znak do "c"
      }
   }
}
&lt;/pre&gt;

&lt;h3&gt;Vyhledání potomka pro daný znak&lt;/h3&gt;
&lt;p&gt;
Jelikož potomky máme v poli pevné velikosti a navíc ve spojových seznamech, není jejich vyhledání úplně triviální, proto si raději napíšeme metodu. 
&lt;/p&gt;
&lt;pre class="brush: as3"&gt;
public function GetChild(s:String):TNode
{
   // nejdříve se podíváme do pole
   var n:TNode = cn[ s.charCodeAt(0)% 4 ];
   if ( n == null) return null; // nebyl v poli
   else    // byl v poli, hledáme ve spojáku
      while (n.next != null)  
      {
         if (n.c == s) return n;
         n = n.next;
      }
   if (n.c == s) return n; // byl na konci spojáku
   return null; // nebyl nikde
}
&lt;/pre&gt;

&lt;h3&gt;Přidání slova do trie&lt;/h3&gt;
&lt;p&gt;
Nejdříve si přečteme první znak slova. Buď pro tento znak už máme potomka, nebo ne (potom ho vytvoříme). Tomuto potomku sdělíme mu, aby si přidal zbytek slova.  
&lt;/p&gt;
&lt;pre class="brush: as3"&gt;
public function AddWord(s:String):void
{
   // podíváme se, zda nemáme potřebného potomka
   var n:TNode = GetChild(s.charAt(0));
   if(n==null) // nemáme
   {
      n = new TNode(s.charAt(0)); // vytvoříme ho
      var pos:int = s.charCodeAt(0)% 4; // kam ho dáme
      if(cn[pos] == null) cn[pos] = n;  // místo je volné
      else // není volné - dáme do spojáku
      {
         var no:TNode = cn[ pos ];
         while(no.next != null) no = no.next;
         no.next = n;
      }
   }
   // když není konec slova, přidáme zbytek do "n"
   if(s.length&amp;gt;1) n.AddWord(s.substring(1,s.length));
   else n.isEnd = true; // konec slova
}
&lt;/pre&gt;

&lt;h3&gt;Zda trie obsahuje slovo&lt;/h3&gt;

&lt;pre class="brush: as3"&gt;
public function Contains(s:String):Boolean
{
   // když jsme na dně rekurze, vrátíme "isEnd"
   if(s.length == 0) return isEnd;
   // podíváme se na potomka s daným znakem
   var n:TNode = GetChild(s.charAt(0));
   if(n==null) return false; // potomek není
   else return n.Contains(s.substring(1,s.length)); // potomek je
}
&lt;/pre&gt;

&lt;h2&gt;Vykreslení trie&lt;/h2&gt;
&lt;p&gt;
Trii vykreslujeme podobným způsobem, jako &lt;a href="http://ivankuckir.blogspot.com/2010/11/binarni-vyhledavaci-strom-v-as3.html"&gt;Binární vyhledávací strom&lt;/a&gt;.  
&lt;/p&gt;
&lt;pre class="brush: as3"&gt;
function vykresli(n:TNode, x:int, y:int, w:int, place:Sprite)
{
   var i:int;
   // potomky uzlu si dám do nového pole
   var nodes:Array = new Array();
   for(i = 0; i&amp;lt;4; i++)
   {
      var no:TNode = n.cn[i]; if(no == null) continue;
      while(no != null){ nodes.push(no); no = no.next;}
   }
   var sW:int = w/nodes.length; // místo pro každý uzel
   for (i = 0; i &amp;lt; nodes.length; i++)
   {
      with(place.graphics)  // čára k potomkovi
      {
         lineStyle(3,0x00E1FF);
         moveTo(x, y);
         lineTo(x-w/2 + i*sW + sW/2, y+60);
      }
      // a vykreslení potomka
      vykresli(nodes[i], x-w/2 + i*sW + sW/2, y+60, sW, place); 
   }

   // nakreslíme kroužek pro daný uzel
   with(place.graphics)
   {
      if(n.isEnd) lineStyle(4, 0x000000); // když je koncový
      else lineStyle(2, 0x333333);  // když není - tenčí okraj
      beginFill(0x6D00D9);
      drawEllipse(x-14, y-14, 28, 28);
      endFill();
   }
 
   // přidáme textové pole s písmenkem
   var tf:TextField = new TextField();
   tf.text = n.c; tf.x = x-tf.textWidth; tf.y = y-14;
   place.addChild(tf);
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-766468705881516345?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/766468705881516345/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/trie-v-as3.html#comment-form' title='Počet komentářů: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/766468705881516345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/766468705881516345'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/trie-v-as3.html' title='Trie v AS3'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-2195723462835258102</id><published>2010-11-10T15:08:00.000-08:00</published><updated>2011-03-09T09:02:58.894-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matika'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>Sierpinského trojúhelník v AS3</title><content type='html'>V tomto článku si ukážeme, jak v ActionScript 3 snadno rekurzivně nakreslit fraktál, a to konkrétně Sierpinského trojúhelník.&lt;br /&gt;

&lt;a name='more'&gt;&lt;/a&gt;

&lt;object type="application/x-shockwave-flash" width="650" height="550" data="http://www.ivank.net/blogspot/Sierpinski_triangle.swf"&gt; 
        &lt;param name="movie" value="http://www.ivank.net/blogspot/Sierpinski_triangle.swf" /&gt; 
&lt;/object&gt;

&lt;h2&gt;Sierpinského trojúhelník&lt;/h2&gt;

Sierpinského trojúhelník je fraktálový obrázek, který lze vytvořit např. tímto způsobem:

&lt;ol&gt;
&lt;li&gt;Nakreslíme černý trojúhelník&lt;/li&gt;
&lt;li&gt;Z černého trojúhelníku odstraníme "vnitřní trojúhelník" a tuto funkci zavoláme na tři menší trojúhelníky, které vznikly v okolí&lt;/li&gt;
&lt;/ol&gt;

Další informace naleznete ve &lt;a href="http://cs.wikipedia.org/wiki/Sierpinsk%C3%A9ho_troj%C3%BAheln%C3%ADk"&gt;článku na Wikipedii&lt;/a&gt;.

&lt;h2&gt;Kód v AS3&lt;/h2&gt;

&lt;pre class="brush: as3"&gt;
var limit:int = 6;

function drawTriangle(x:Number, y:Number, level:int, size:Number):void
{
   if(level==0)  // pokud jsme na 0. úrovni, nakreslíme čer. troj.
      with(graphics)
      {
         clear();
         beginFill(0x00);
         moveTo(x, y-size);
         lineTo( x + size * 1.73/2, y + size/2);
         lineTo( x - size * 1.73/2, y + size/2);
         moveTo(x, y-size);
         endFill();
      }
   if(level == limit) return; // pokud jsme se zanořili do limitu, nepokračujeme
   with(graphics)    // nakreslíme bílý trojúhelník
   {
      beginFill(0xffffff);
      moveTo(x, y+size/2);
      lineTo( x - size * 1.73/4, y - size/4);
      lineTo( x + size * 1.73/4, y - size/4);
      moveTo(x, y+size/2);
      endFill();
   }
   // nakreslíme trojúhelníky kolem
   drawTriangle(x, y - size/2, level+1, size/2); // horní
   drawTriangle(x - size * 1.73/4, y + size/4, level+1, size/2); // pravý dolní
   drawTriangle(x + size * 1.73/4, y + size/4, level+1, size/2); // levý dolní
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-2195723462835258102?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/2195723462835258102/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/sierpinskeho-trojuhelnik-ve-flashi.html#comment-form' title='Počet komentářů: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/2195723462835258102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/2195723462835258102'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/sierpinskeho-trojuhelnik-ve-flashi.html' title='Sierpinského trojúhelník v AS3'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-7307036573011589009</id><published>2010-11-03T14:34:00.000-07:00</published><updated>2011-03-09T09:02:28.507-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>Binární vyhledávací strom v AS3</title><content type='html'>V tomto článku si ukážeme konkrétní příklad použití OOP ve flashi. Implementujeme si binární vyhledávací strom v AS3 a jeho základní metody. Nakonec ho zkusíme ještě vykreslit.
&lt;a name='more'&gt;&lt;/a&gt;

&lt;object type="application/x-shockwave-flash" width="650" height="450" data="http://www.ivank.net/blogspot/BSTdrawing.swf"&gt; 
        &lt;param name="movie" value="http://www.ivank.net/blogspot/BSTdrawing.swf" /&gt; 
        &lt;param name="allowFullScreen" value="true" /&gt; 
&lt;/object&gt;

&lt;h2&gt;Co je to Binární vyhledávací strom?&lt;/h2&gt;
BVS (binární vyhledávací strom), anglicky BST (binary search tree) je dynamická datová struktura, která obsahuje množinu porovnatelných prvků (čísla, slova) a pokud je dobře vyvážený, umožňuje rychlé operace s nimi (v logaritmickém čase - $O(log(n))$. Podrobný popis v &lt;a href="http://cs.wikipedia.org/wiki/Bin%C3%A1rn%C3%AD_vyhled%C3%A1vac%C3%AD_strom"&gt;článku na Wikipedii&lt;/a&gt;.

&lt;h2&gt;Třída Uzel&lt;/h2&gt;
&lt;h3&gt;Co od stromu chci&lt;/h3&gt;
Chci, abych si strom mohl snadno vytvořit (var strom = new ...), mohl do něj snadno přidávat další čísla (strom.Přidej(24);). Chci mít možnost zjišťovat, zda nějaké číslo je ve stromě (if(strom.Obsahuje(24)) ...). Také chci snadno vypisovat jeho obsah (trace(strom.toString());)
&lt;h3&gt;Data v uzlu&lt;/h3&gt;
Každé číslo bude ležet v uzlu, vlevo budou čísla menší, vpravo větší. Každý uzel zároveň definuje strom, který je pod ním.
&lt;h3&gt;Základní třída&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
package
{
   public class Uzel
   {
      public var levý:Uzel; // uzel vlevo
      public var pravý:Uzel; // uzel vpravo
      public var hodnota:int = int.MAX_VALUE; // hodnota v uzlu
   }
}
&lt;/pre&gt;

&lt;h3&gt;Konstruktor&lt;/h3&gt;
Jeho parametr je číslo, které sem ukládáme. Pokud nebude uveden, hodnota v uzlu je int.MAX_VALUE.

&lt;pre class="brush: as3"&gt;
public function Uzel(c:int = int.MAX_VALUE):void
{
   if(c == int.MAX_VALUE) return; // bez parametru -&gt; vrátíme se
   hodnota = c; // jinak přiřadíme parametr do hodnoty
}
&lt;/pre&gt;

&lt;h3&gt;Přidání čísla do struktury&lt;/h3&gt; je velmi snadné. Pokud daná hodnota už je v uzlu, neděláme nic. Pokud přidáváme menší číslo než hodnota v uzlu, přidáme ho do levého podstromu, jinak do pravého.
&lt;pre class="brush: as3"&gt;
public function Přidej(c:int)
{
   if(hodnota == int.MAX_VALUE) 
   { hodnota = c; return;} // konstruktor byl bez parametru
   if(c == hodnota){return; } // c už tu je
   if(c &gt; hodnota)
   {
      if (pravý != null) pravý.Přidej(c);
      else pravý = new Uzel(c);
   }
   else
   {
      if (levý != null) levý.Přidej(c);
      else levý = new Uzel(c);
   }
}
&lt;/pre&gt;

&lt;h3&gt;Zjištění, zda číslo už je ve struktuře&lt;/h3&gt; je také snadné. Podíváme se, zda je v daném uzlu, pokud je menší než hodnota v uzlu, hledáme ho v levém podstromu, jinak v pravém.
&lt;pre class="brush: as3"&gt;
public function Obsahuje(i:int):Boolean
{
   if(i == hodnota) return true;
   if(i &lt; hodnota) 
   {
      if(levý != null) return levý.Obsahuje(i);
      else return false;
   }
   else 
   {
      if(pravý != null) return pravý.Obsahuje(i);
      else return false;
   }
}
&lt;/pre&gt;

&lt;h3&gt;Vypsání čísel ve struktuře - seřazeně&lt;/h3&gt;Obsah stromu vypíšeme velmi snadno. Nejdříve vypíšeme levý podstrom, pak vypíšeme hodnotu v tomto uzlu tolikrát, kolikrát tu je, potom pravý podstrom.
&lt;pre class="brush: as3"&gt;
public function toString():String
{
   var out:String = "";
   
   if(levý != null) out += levý.toString();
   out += hodnota + ", ";
   if(pravý != null) out += pravý.toString();
   
   return out;
}
&lt;/pre&gt;

&lt;h3&gt;Další funkce&lt;/h3&gt;
Další funkce, které by měl BVS umět, je odebrání prvku (můžete doprogramovat). Velmi užitečné jsou funkce pro vyvažování (aby strom byl symetrický a neměl dlouhé větve, kdy musíme chodit příliš hluboko). To často obnáší úpravu funkcí pro přidávání a odebírání prvku. Pravidla pro toto vyvažování jsou např. &lt;a href="http://cs.wikipedia.org/wiki/AVL_strom"&gt;AVL strom&lt;/a&gt; nebo &lt;a href="http://cs.wikipedia.org/wiki/%C4%8Cerveno-%C4%8Dern%C3%BD_strom"&gt;Červeno-černý strom&lt;/a&gt;. 

&lt;h2&gt;Použití třídy&lt;/h2&gt;
Zkusme si do stromu naházet nějaké hodnoty a pak ho vypsat.

&lt;pre class="brush: as3"&gt;
btn.addEventListener(MouseEvent.MOUSE_DOWN, vav);

function vav(e:MouseEvent):void
{
   var strom:Uzel = new Uzel();
   txt.text = "Přídáváme:\n";
   for(var i:int = 0; i &lt; 15; i++) 
   {
      var číslo:int = Math.round(Math.random()*100)-50;
      strom.Přidej(číslo);
      txt.appendText(číslo + ", ");
   }
   txt.appendText("\nSeřazené:\n"   + strom.toString());
   txt.appendText("\nObsahuje -5: " + strom.Obsahuje(-5));
   txt.appendText("\nObsahuje 10: " + strom.Obsahuje(10));
}
&lt;/pre&gt;

&lt;object type="application/x-shockwave-flash" width="600" height="250" data="http://www.ivank.net/blogspot/BSTgenerator.swf"&gt; 
        &lt;param name="movie" value="http://www.ivank.net/blogspot/BSTgenerator.swf" /&gt; 
&lt;/object&gt;

&lt;h2&gt;&lt;a name="vykresleni"&gt;&lt;/a&gt;Vykreslení stromu&lt;/h2&gt;
Napišme si funkci pro rekurzivní vykreslení stromu.
&lt;pre class="brush: as3"&gt;
function vykresli(u:Uzel, x:int, y:int, šířka:int, místo:Sprite)
{
   //--- když uzel má levého syna
   if(u.levý != null)
   {
      //--- nakreslíme k němu čáru
      with(místo.graphics)
      {
         lineStyle(6,0x00E1FF);
         moveTo(x, y);
         lineTo(x - šířka/4, y + 70);
      }
      //--- a vykreslíme syna
      vykresli(u.levý, x - šířka/4, y + 70, šířka/2, místo); 
   }
   //--- když má pravého, to samé
   if(u.pravý != null)
   {
      with(místo.graphics)
      {
         lineStyle(6,0x91FF00);
         moveTo(x, y);
         lineTo(x + šířka/4, y + 70);
      }
      vykresli(u.pravý, x + šířka/4, y + 70, šířka/2, místo); 
   }
   //--- nakreslíme kroužek pro tento uzel
   with(místo.graphics)
   {
      lineStyle(4, 0x6D00D9);
      beginFill(0xff005E);
      drawEllipse(x - 23 - i*4, y - 23 - i*4, 46, 46);
      endFill();
   }
   //--- přidáme textové pole s číslem
   var tf:TextField = new TextField();
   tf.text = u.hodnota.toString();
   tf.x = x-tf.textWidth-2;
   tf.y = y-16;
   tf.setTextFormat(tfo);
   místo.addChild(tf);
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-7307036573011589009?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/7307036573011589009/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/binarni-vyhledavaci-strom-v-as3.html#comment-form' title='Počet komentářů: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/7307036573011589009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/7307036573011589009'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/binarni-vyhledavaci-strom-v-as3.html' title='Binární vyhledávací strom v AS3'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-1765717257712883669</id><published>2010-11-03T12:45:00.000-07:00</published><updated>2011-03-09T09:01:50.412-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>2. Rychlý úvod - Flash a OOP - teorie</title><content type='html'>V tomto článku se seznámíme se základy objektově orientovaného programování v AS3. Předpokládám, že již znáte základní koncepty OOP (&lt;a href="http://cs.wikipedia.org/wiki/Objektov%C4%9B_orientovan%C3%A9_programov%C3%A1n%C3%AD"&gt;OOP na Wikipedii&lt;/a&gt;).

&lt;a name='more'&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;h2&gt;Teorie&lt;/h2&gt;
AS3 je objektově orientovaný jazyk a každá proměnná je nějakého typu / třídy a má s ní spojené vlastnosti a metody.
&lt;br /&gt;
Ve flashi je zvykem definici každé třídy psát do zvláštního souboru. Každá třída je uvnitř nějakého package (balíček), které také definuje jmenný prostor, ve kterém je třída umístěna.
&lt;br /&gt;
Základním typem je Object, ze kterého dědí všechny třídy. Pokud předka nespecifikujeme, předpokládá se, že je to právě Object.
&lt;br /&gt;
Každá metoda je virtuální, můžeme ji tedy v potomcích přepsat.
&lt;h3&gt;Parametry třídy a její položek&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;public&lt;/b&gt; - veřejná položka, dostupná všem&lt;/li&gt;
&lt;li&gt;&lt;b&gt;private&lt;/b&gt; - soukromá, dostupná pouze z dané třídy&lt;/li&gt;
&lt;li&gt;&lt;b&gt;protected&lt;/b&gt; - private + přístupná pro podtřídy&lt;/li&gt;
&lt;li&gt;&lt;b&gt;internal&lt;/b&gt; - dostupná v rámci daného jmenného prostoru&lt;/li&gt;
&lt;li&gt;&lt;b&gt;static&lt;/b&gt; - statická položka, patří třídě, nezávislá na instancích&lt;/li&gt;
&lt;li&gt;&lt;b&gt;override&lt;/b&gt; - nahrazuje danou metodu předka&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Ukázka OOP v AS3&lt;/h2&gt;
&lt;h3&gt;První třída&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
package fauna // jmenný prostor "fauna"
{
   //import flash.display.MovieClip;  // -import dalších tříd
 
   public class Zvíře // definice třídy
   {
      public var hmotnost:int = 10; // proměnná a poč. hodnota
      public var jmeno:String;
 
      public function Zvíře(/*parametry*/) :void // konstruktor třídy
      {
      }
 
      public function OzviSe() :String // veřejná metoda
      {
         return("Ahoj, jsem " + jmeno + " a vážím " + hmotnost + "kg!");
      }
   }
}
&lt;/pre&gt;
&lt;h3&gt;Rozšíříme třídu&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
package fauna
{
   import fauna.Zvíře;
 
   public class Pes extends Zvíře
   {
      public var kouše:Boolean;
      public var plemeno:String;

      public function Pes() :void 
      {
      }
 
      public override function OzviSe() :String
      {
         var hláška:String = "Ahoj, jsem pes " + jméno + " a ";
         hláška += kouše?"koušu!":"nekoušu!";
         return(hláška);
      }
   }
}
&lt;/pre&gt;
&lt;h3&gt;Použití tříd&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
var prase:Zvíře = new Zvíře();
prase.jméno = "Čuník";
prase.hmotnost = 100;

var alík:Pes = new Pes();
alík.jméno = "Alík";
alík.hmotnost = 15;
alík.kouše = true;
trace(alík.OzviSe());
// vypíše "Ahoj, jsem pes Alík a koušu!"
&lt;/pre&gt;

&lt;a href="http://www.ivank.net/blogspot/OOP-pokus.zip"&gt;&lt;h3&gt;Zdrojové soubory&lt;/h3&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-1765717257712883669?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/1765717257712883669/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/2-rychly-uvod-flash-oop-teorie.html#comment-form' title='Počet komentářů: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/1765717257712883669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/1765717257712883669'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/11/2-rychly-uvod-flash-oop-teorie.html' title='2. Rychlý úvod - Flash a OOP - teorie'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-3185412800099797310</id><published>2010-10-14T14:23:00.000-07:00</published><updated>2011-03-09T08:58:26.672-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>1. Rychlý úvod do Adobe Flash / AS3</title><content type='html'>V tomto článku se vás pokusím rychle uvést do Adobe Flash a jazyku AS3 a ukážu základy potřebné pro praktickou práci. Předpokládám, že jste programátoři. Zbylé věci z prostředí Adobe Flash se lze doučit praxí.
&lt;a name='more'&gt;&lt;/a&gt;
&lt;h2&gt;AS3&lt;/h2&gt;

&lt;h3&gt;Komentáře&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
// toto je jednořádkový komentář
/*
toto je komentář na
více řádků
*/
&lt;/pre&gt;


Funkce pro vypsání textu (při debuggingu)
&lt;pre class="brush: as3"&gt;
trace("ahoj" + nejakyString + ".");
&lt;/pre&gt;


&lt;h3&gt;Proměnné&lt;/h3&gt;

Základní:
&lt;pre class="brush: as3"&gt;
// var název:Typ = hodnota;
var n:int = 5;
var a:Number = 4.3419;
var s:String = "Ahoj Ahoj";
var b:Boolean = true; // nebo false
&lt;/pre&gt;

Pole:
&lt;pre class="brush: as3"&gt;
var a:Array = [];
a = [4, 3, "ahoj", b, true];
a[2] = "čau";
var n:Number = a[0];
&lt;/pre&gt;

Instance tříd:
&lt;pre class="brush: as3"&gt;
// var název:Typ = new KonstruktorTřídy(parametry ...);
var mc:MovieClip = new MovieClip();
var tf:TextField = new TextField();
&lt;/pre&gt;


&lt;h3&gt;Podmínky&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
// if(podmínka) proveď jednu věc
// if(podmínka) {proveď víc věcí}
// else {proveď něco jiného}
if(x == 5) trace("x je pět");
else trace("x není pět");
&lt;/pre&gt;
Další operátory pro porovnávání naleznete &lt;a href="http://help.adobe.com/cs_CZ/AS3LCR/Flash_10.0/operators.html"&gt;ZDE&lt;/a&gt;

&lt;h3&gt;Cykly&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
// for (počáteční hodnota; podmínka; operace při cyklu) dělej něco
for(var i:int = 0; i &lt; 10; i++)
{
   trace(i);
}
// while (podmínka) dělej něco
var j:int = 0;
while(j &lt; 10)
{
   trace(j);
   j++;
}
&lt;/pre&gt;


&lt;h3&gt;Funkce&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
// function názevFunkce(parametry ...)
// :Typ návratové hodnoty nebo "void" {něco ...; return něco;}
function dvaKrat(a:int):int
{
   //nějaký kód ..
   return a*2;
}
&lt;/pre&gt;

&lt;h3&gt;Události&lt;/h3&gt;
Veškeré asynchronní akce v Adobe Flash jsou prováděny přes systém událostí (Event) a tím, že jim nasloucháme a případně provedeme obslužnou rutinu.
Většina tříd pochází z &lt;a href="http://help.adobe.com/cs_CZ/AS3LCR/Flash_10.0/flash/events/EventDispatcher.html"&gt;EventDispatcher&lt;/a&gt; a mají metody dispatchEvent(event) a addEventListener(typEventu, obslužnáFunkce). Některé DisplayObjecty (např. MovieClip) standardně vyvolávají události myši, klávesnice atd., stačí jim jen naslouchat.
&lt;pre class="brush: as3"&gt; 
// function názevFunkce(parametry):Typ návratové hodnoty 
//nebo "void" {dělej něco ...; return něco;}
var mc:MovieClip = new MovieClip();
mc.addEventListener("mojeUdalost", mojeFunkce);
var e:Event = new Event("mojeUdalost");
mc.dispatchEvent(e);

function mojeFunkce(ev:Event):void
{
   trace("zavolána událost");
}
&lt;/pre&gt;

Standardní události jsou typů &lt;a href="http://help.adobe.com/cs_CZ/AS3LCR/Flash_10.0/flash/events/Event.html"&gt;Event&lt;/a&gt;, &lt;a href="http://help.adobe.com/cs_CZ/AS3LCR/Flash_10.0/flash/events/MouseEvent.html"&gt;MouseEvent&lt;/a&gt; nebo &lt;a href="http://help.adobe.com/cs_CZ/AS3LCR/Flash_10.0/flash/events/KeyboardEvent.html"&gt;KeyboardEvent&lt;/a&gt;.


&lt;h3&gt;MovieClip&lt;/h3&gt;
Nejznámější třídou ve flashi je MovieClip. Je to zobrazovatelný objekt (DisplayObject), může obsahovat další objekty (je to i DisplayObjectContainer). Má časovou osu a vyvolává událost "enterFrame" podle FPS. Má metodu addChild(p) pro přidání objektu. &lt;a href="http://help.adobe.com/cs_CZ/AS3LCR/Flash_10.0/flash/display/MovieClip.html"&gt;Více o MC&lt;/a&gt;.

Má vlastnosti jako "x", "y", "alpha", "width", "height" ...

&lt;h3&gt;Matematické funkce&lt;/h3&gt;
Ty jsou ve statické, uloženy ve třídě Math. Jsou to např. sin, cos, abs, log, tan, min, max. Math.random() vrací náhodné číslo mezi 0 a 1. Obsahuje konstanty Math.PI nebo Math.E. 
&lt;a href="http://help.adobe.com/cs_CZ/AS3LCR/Flash_10.0/Math.html"&gt;Více o třídě Math&lt;/a&gt;.




&lt;h2&gt;Přklady AS3&lt;/h2&gt;



&lt;h3&gt;Načítání obrázků&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
var obr:Array = ["obr1.jpg", "obr2.jpg", "novyobrazek.jpg"];

for(var i:int = 0; i&amp;lt;obr.length; i = i+1)  nactiObrazek( obr[i] );

function nactiObrazek (c:String) : void
{
   // dopíšeme načítání obrázku
   trace("Načítáme obrázek: " + c);
}
&lt;/pre&gt;

Teď si vytvoříme čtverec asi 30px x 30px, převedeme ho na MovieClip a nastavíme export pod třídou "Ctverec"

&lt;h3&gt;Umístění čtverců po diagonále&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
var ctverce : MovieClip = new MovieClip ()
addChild (ctverce);

for (var i:int = 0; i &lt; 10; i++)
{
   var c:Ctverec = new Ctverec();
   c.x = i*50;
   c.y = i*50;
   ctverce.addChild(c);
}
&lt;/pre&gt;

&lt;h3&gt;Jednoduchá hra - počítá se počet najíždění na čtverce&lt;/h3&gt;
&lt;pre class="brush: as3"&gt;
var tf:TextField = new TextField();
addChild(tf);
tf.x = 200;

var n:int = 0;

for (var i:int = 0; i &lt; 4; i++)
{
   for (var j:int = 0; j &lt; 5; j++)
   {
      var c:Ctverec = new Ctverec();
      c.x = j*100;
      c.y = i*100;
      addChild(c);
      c.addEventListener(MouseEvent.MOUSE_OVER, mojeFunkce);
   }
}

function mojeFunkce(e:MouseEvent):void
{
   e.target.x = Math.random()*500;
   e.target.y = Math.random()*400;
   n++;
   tf.text = "Chytil jsi " + n + " čtverců";
}


&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-3185412800099797310?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/3185412800099797310/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/10/1-rychly-uvod-do-adobe-flash-as3.html#comment-form' title='Počet komentářů: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/3185412800099797310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/3185412800099797310'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/10/1-rychly-uvod-do-adobe-flash-as3.html' title='1. Rychlý úvod do Adobe Flash / AS3'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-7736660321458666457</id><published>2010-09-25T15:49:00.000-07:00</published><updated>2011-03-09T08:56:50.856-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matika'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>LU rozklad</title><content type='html'>Tato práce vznikla jako zápočtový projekt na předmětu Algoritmy a datové struktury 1, MFF UK. Pojí se k ní ještě &lt;a href="http://ivankuckir.blogspot.com/2010/09/lightweight-matrix-class-in-c.html"&gt;tato implementace v C#&lt;/a&gt;.&lt;br /&gt;

&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Efektivní maticové operace s využitím LU rozkladu&lt;/h2&gt;LU rozklad nám říká, že čtvercovou regulární matici lze rozložit na součin matic $A = L * U$, kde L je dolní a U je horní trojúhelníkova matice. Zatím nezkoumejme tuto větu do hloubky a pojďme na to postupně.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Využití:&lt;/h2&gt;&lt;h3&gt;Řešení soustavy rovnic&lt;/h3&gt;Mějme soustavu lineárních rovnic $A * x = b$, která se dá řešit gaussovou eliminací. Pokud se nám však podaří převést matici A na součin $L * U$, tedy $L * U * x = b$ (mějme na paměti, že matice L a U jsou trojúhelníkové), vektor $U*x$ snadno spočteme dopřednou a vektor x zpětnou substitucí. &lt;br /&gt;
&lt;h3&gt;Výpočet determinantu&lt;/h3&gt;Mějme za úkol určit determinant matice A, $det(A)$. Pokud se nám podaří převést A na součin $L*U$, &amp;nbsp;pak $det(A) = det(L*U) = det(L) * det(U)$, což je součin prvků na diagonále L a U, jelikož to jsou matice trojúhelníkové.&lt;br /&gt;
&lt;h3&gt;Inverze matice&lt;/h3&gt;Mějme za úkol určit inverzní matici k A, $A^{-1}$. Hledáme tedy řešení rovnice $A * A^{-1} = I$. K tomuto můžeme přistupovat jako k řešení n soustav rovnic, tj. $A * x_i = e_i$, kde $e_i$ je jednotkový vektor s 1 na i-tém místě a $x_i$ je sloupec námi hledané matice.&lt;br /&gt;
&lt;br /&gt;
Jak je vidět, pro takovýto rozklad matice bychom našli spoustu využití. &lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Algoritmus:&lt;/h2&gt;&lt;h3&gt;Idea&lt;/h3&gt;Uvažujme normální gaussovu eliminaci. V první fázi je zde snaha převést matici na horní trojúhelníkovou, v našem případě by to mohla být matice U. Zde vyplývají na povrch dvě zajímavé otázky - zda by se nedaly elementární úpravy reprezentovat násobením maticí zleva a zda by součin těchto matic elementárních úprav nebyl dolní trojúhelníkovou maticí. Odpověď je ano. Převod na horní trojúhelníkovou matici je možné realizovat přičítáním alfa-násobku prvního vhodného řádku k řádkům pod ním, abychom vynulovali daný sloupec pod pivotem. Tato elementární úprava se dá reprezentovat násobením zleva maticí, kterou vyrobíme z jednotkové tak, že pod pivot umístíme potřebné koeficienty.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Příklad&lt;/h3&gt;&lt;img height="137px;" src="https://lh3.googleusercontent.com/eQ2IvWykXZoHyHhk-mrY73fcJ8Zp-EEV40f92UB9qoKP8ezAaBjUaB3sstRoSC3DhgDwhg3Pj_UxAwQIa-vObKZnpJO_Qm2FWyl_k7pdkEfqtmcCxw" width="594px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Úskalí&lt;/h3&gt;Při tomto postupu se může stát, že se na diagonále objeví nula. Při běžné gaussově eliminaci tyto dva řádky (i. a j.) prohodíme. Tuto úpravu můžeme emulovat prohozením i. a j. řádku v matici L, ovšem potom L už nebude trojúhelníková. Vyřešíme to tzv. “permutační maticí” P, která bude na začátku jednotková a které budeme prohazovat řádky. Rozklad tedy bude $A = P L U$. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Vliv permutační matice na operace:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;řešení soustavy rovnic - $PLUx = b$ - ve vstupním vektoru b pouze prohodíme hodnoty podle matice $P$.&lt;/li&gt;
&lt;li&gt;determinant - $det(PLU)$ - někde si evidujeme počet prohození řádků v P, podle kterého výsledný determinant vynásobíme +1 / -1.&lt;/li&gt;
&lt;li&gt;inverze - ve výsledné inverzní matici prohodíme řádky podle matice P&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h2&gt;Složitost:&lt;/h2&gt;V cyklu musíme probrat řádky matice a od každého z nich odečteme násobek prvního řádku, to vše pro každý ze sloupců. Jsou to tedy 3 vnořené cykly a složitost LU rozkladu je tedy $O(n^3)$.&lt;br /&gt;
&lt;br /&gt;
Při řešení &lt;b&gt;soustavy rovnic&lt;/b&gt; je třeba dopočítat vektor Ux dopřednou a x zpětnou substitucí (obojí má složitost $O(n^2)$). Nezískali jsme tedy žádné zrychlení oproti Gaussově eliminaci (složitost $O(n^3)$). Zrychlení ale získáme ve chvíli, kdy máme vyřešit stejnou soustavu A pro více pravých stran. Když už jednou spočítáme LU rozklad, vyřešení soustavy pro libovolnou pravou stranu má složitost $O(n^2)$.&lt;br /&gt;
&lt;br /&gt;
Efektivnost &lt;b&gt;výpočtu determinantu&lt;/b&gt; dle definice musíme sečíst n! členů, v každém z nich vynásobit n čísel, složitost je tedy $O(n*n!)$. Determinant lze vypočítat pomocí gaussovy eliminace v čase $O(n^3)$. Náš algoritmus funguje také v čase $O(n^3)$, jelikož LU rozklad je jiný způsob přístupu ke gaussově eliminaci.&lt;br /&gt;
&lt;br /&gt;
Výpočet &lt;b&gt;inverzní matice&lt;/b&gt; gaussovou eliminací má složitost $O(n^3)$. Nezískali jsme tedy žádné zrychlení.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-7736660321458666457?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/7736660321458666457/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/09/lu-rozklad.html#comment-form' title='Počet komentářů: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/7736660321458666457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/7736660321458666457'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/09/lu-rozklad.html' title='LU rozklad'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-6296674023299458462</id><published>2010-09-24T08:11:00.001-07:00</published><updated>2012-01-25T04:32:08.679-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matika'/><title type='text'>Taylorův polynom srozumitelně</title><content type='html'>&lt;p&gt;Článek jsem napsal proto, že všechny články na internetu se mi zdály příliš složité a nevysvětlovaly základní princip fungování taylorova polynomu.&lt;/p&gt;&lt;p&gt;Vyhýbám se přesným formalismům, mohou zde být i drobné nepřesnosti, avšak doufám, že po přečtení článků vám formalismy přijdou jasné a srozumitelné.&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;h2&gt;Předpoklady&lt;/h2&gt;&lt;p&gt;Před tím, než začnete číst, byste měli vědět, co je to &lt;a href="http://cs.wikipedia.org/wiki/Polynom"&gt;polynom&lt;/a&gt;, &lt;a href="http://cs.wikipedia.org/wiki/Derivace"&gt;derivace&lt;/a&gt; a &lt;a href="http://cs.wikipedia.org/wiki/Faktori%C3%A1l"&gt;faktoriál&lt;/a&gt;, a umět derivovat a integrovat polynom.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Polynom je funkce&lt;/b&gt;, do které dosadíme hodnotu &lt;b&gt;x&lt;/b&gt; a pomocí sčítání, odčítání, násobení a dělení spočítáme hodnotu polynomu v bodě &lt;b&gt;x&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Derivace funkce v bodě a je číslo. &lt;/b&gt;Pokud &lt;b&gt;y&lt;/b&gt; roste stejně rychle jako &lt;b&gt;x&lt;/b&gt;, derivace je $=1$. Pokud &lt;b&gt;y&lt;/b&gt; roste rychleji než &lt;b&gt;x&lt;/b&gt;, derivace je $&gt;1$, pokud pomaleji, derivace je  $&amp;lt;1$. Pokud &lt;b&gt;x&lt;/b&gt; roste, ale &lt;b&gt;y&lt;/b&gt; stojí, derivace je $=0$.&lt;/p&gt;&lt;h2&gt;Motivace&lt;/h2&gt;&lt;p&gt;V každodenním životě často potřebujeme spočítat sinus, cosinus, tangens či logaritmus. Tak daleko však chodit nemusíme. Stačí, když potřebujeme spočítat odmocninu z nějakého čísla. Problém je ten, že my, lidé, umíme jenom sčítat, odčítat, násobit a dělit. Málo kdo z nás dokáže sínusit, logaritmovat či odmocňovat. Bohužel ani počítače nám s tím nepomohou. Jejich procesory většinou umí taky pouze sčítat (či přičítat opačnou hodnotu) nebo násobit (či násobit převrácenou hodnotou).&lt;/p&gt;&lt;p&gt;Už před stovkami let však existovaly matematické tabulky s hodnotami těchto funkcí. Stejně tak i kalkulačka při zmáčknutí SIN nám vrátí dost přesnou hodnotu. Jak to tedy ti lidé nebo stroje dělají?&lt;/p&gt;&lt;p&gt;Řešení je v přiblížení (aproximace) naší funkce (kterou neumíme spočítat) nějaké jiné podobné funkci (kterou umíme spočítat).&lt;/p&gt;&lt;h2&gt;Konkrétní příklad&lt;/h2&gt;&lt;p&gt;Řekněme, že chceme spočítat $sin(1)$, tedy sinus jednoho radiánu, který má hodnotu asi &lt;b&gt;0.841470984&lt;/b&gt;. O funkci sinus víme tyto 3 věci:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;sinus nuly je nula ...  $sin(0) = 0$&lt;/li&gt; 
&lt;li&gt;derivace sinu v nule je jedna ... $sin'(0) = 1$&lt;/li&gt; 
&lt;li&gt;sinus má periodu dvě pí ...  $sin(x) = sin(x + 2\pi)$&lt;/li&gt; 
&lt;/ul&gt;&lt;h2&gt;Hezká vlastnost polynomů&lt;/h2&gt;&lt;p&gt;Polynomy mají jednu hezkou vlastnost, a to:&lt;/p&gt;&lt;i&gt;&lt;h3&gt;"Pro každých N bodů v rovině existuje polynom stupně N-1 nebo menšího, který jimi prochází."&lt;/h3&gt;&lt;/i&gt; &lt;br /&gt;
&lt;p&gt;To znamená, že:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;pro každý bod existuje vodorovná přímka, která jim prochází&lt;/li&gt; 
&lt;li&gt;pro každé dva body existuje přímka, která jimi prochází&lt;/li&gt; 
&lt;li&gt;pro každé tři body existuje parabola, která jimi prochází&lt;/li&gt; 
&lt;li&gt;...&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;Vypadá to tedy, že polynomy mohou vypadat jakkoli a podobat se nejrůznějším funkcím.&lt;/p&gt;&lt;h2&gt;Základní princip taylorova polynomu&lt;/h2&gt;&lt;p&gt;Taylorův polynom je založen na jednoduchém principu, a to:&lt;/p&gt;&lt;i&gt;&lt;h3&gt;"Dvě funkce si jsou v okolí bodu X tím více podobné, čím více se podobají jejich derivace vyšších řádů v tomto bodě."&lt;/h3&gt;&lt;/i&gt; 
&lt;br /&gt;

&lt;p&gt;Idea byla asi takováto: funkce by se měly v okolí bodu podobat jedna druhé. Asi by tam měly mít stejnou funkční hodnotu (celkem logické). Asi by ten bod měly protínat pod stejným úhlem (neměla by tam jedna funkce růst a druhá naopak klesat). Pak by tam měly být obě stejně "křivé" (aby jedna nebyla v tomto bodě konvexní zatímco druhá konkávní). A pak si náhodou všimneme, že jsme právě mluvili o nulté, prví a druhé derivaci :)&lt;/p&gt;
&lt;p&gt;Vypadá to, že by mohlo platit něco takového:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;funkce by měly mít stejnou 0. derivaci, tj. funkční hodnotu v daném bodě.&lt;/li&gt; 
&lt;li&gt;když mají stejnou 1. derivaci (stejnou směrnici tečny v daném bodě), jsou si víc podobné&lt;/li&gt; 
&lt;li&gt;když mají stejnou 2. derivaci, jsou si podobné ještě víc&lt;/li&gt; 
&lt;li&gt;...&lt;/li&gt; 
&lt;/ul&gt;

&lt;h2&gt;Přiblížení polynomem obecně&lt;/h2&gt;&lt;p&gt;Přibližujeme polynomem právě proto, že ho umíme spočítat (stačí nám sčítání, odčítání ...).&lt;/p&gt;&lt;p&gt;Příklad: $sin(x)$ v bodě 0 má nultou derivaci 0, první derivaci 1, druhou derivaci 0, třetí -1 a dál se to opakuje. Pokud bychom tedy našli polynom, který bude mít v nule stejné derivace do nějakého řádu, můžeme místo sinu počítat hodnotu polynomu a věřit, že se to skoro rovná hodnotě sinu.&lt;/p&gt;&lt;h2&gt;Příklad: hledání polynomu pro sinus&lt;/h2&gt;&lt;p&gt;Zkusme najít polynom, který bude podobný funkci sinus v okolí nuly. Nejdříve chtějme, aby měl stejnou 0. derivaci, potom 1., 2. ... a postupně zvyšujme nároky. Přitom si všímejme, jak se graf polynomu více a více podobá grafu sinu a zároveň $f(1)$ se víc a víc blíží $sin(1)$.&lt;/p&gt;&lt;p&gt;Polynom nultého stupně, co má v 0 stejnou hodnotu, jako sinus, je $f(x) = 0$ (stejná 0. derivace), f(1)= &lt;b&gt;0&lt;/b&gt; &lt;/p&gt;&lt;ol&gt;&lt;li class="spacedli"&gt;Sinus má první derivaci rovnou 1, odpovídá tomu polynom $f(x) = x$ (stejná 0. a 1. derivace), f(1)= &lt;b&gt;1&lt;/b&gt; &lt;br /&gt;
&lt;img border="0" src="http://www.ivank.net/graph/newgraph.php?highquality=1&amp;amp;zoom=50&amp;amp;height=200&amp;amp;width=400&amp;amp;func0=sin(x)&amp;amp;func1=x&amp;amp;red1=255&amp;amp;blue1=0&amp;amp;green0=0" /&gt; &lt;br /&gt;
&lt;/li&gt; 
&lt;li class="spacedli"&gt;Funkce $f(x) = x$ má v bodě 0 druhou derivaci 0, nepotřebujeme ji nijak měnit. &lt;br /&gt;
&lt;/li&gt; 
&lt;li class="spacedli"&gt;Třetí derivace našeho polynomu v nule má být -1, zkusme tedy trochu integrovat a podle potřeby přičítat konstantu. &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;$f'''(x) = -1$ - v nule má být -1 (třetí derivace)&lt;/li&gt; 
&lt;li&gt;$f''(x) = -x$ - v nule má být 0 (druhá derivace), což odpovídá&lt;/li&gt; 
&lt;li&gt;$f'(x) =  1 - \frac{x^2}{2}$ , v nule má být 1 (první derivace), proto + 1&lt;/li&gt; 
&lt;li&gt;$f(x) =  x - \frac{x^3}{6}$ v nule má být 0 (nultá derivace), což odpovídá&lt;/li&gt; 
&lt;/ul&gt;a skutečně, polynom $f(x) =  x - \frac{x^3}{6}$ se už víc podobá sinu (stejná 0. až 3. derivace), f(1)= &lt;b&gt;0.833333&lt;/b&gt; &lt;br /&gt;
&lt;img border="0" src="http://www.ivank.net/graph/newgraph.php?highquality=1&amp;amp;zoom=50&amp;amp;height=200&amp;amp;width=400&amp;amp;func0=sin(x)&amp;amp;func1=x-((x^3)/6)&amp;amp;red1=255&amp;amp;blue1=0&amp;amp;green0=0" /&gt; &lt;br /&gt;
&lt;/li&gt; 
&lt;li class="spacedli"&gt;Čtvrtá derivace našeho polynomu v nule má být 0, tomu už ale vyhovuje předchozí polynom. &lt;br /&gt;
&lt;/li&gt; 
&lt;li class="spacedli"&gt;Pátá derivace našeho polynomu má být 1, a tedy: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;$f''''(x) = x$ - v nule má být 0 (čtvrtá derivace), což odpovídá&lt;/li&gt; 
&lt;li&gt;$f'''(x) =  -1 + \frac{x^2}{2}$ , v nule má být -1 (třetí derivace), proto - 1&lt;/li&gt; 
&lt;li&gt;$f''(x) =  -x + \frac{x^3}{6}$ v nule má být 0 (druhá derivace), což odpovídá&lt;/li&gt; 
&lt;li&gt;$f'(x) =  1 - \frac{x^2}{2} + \frac{x^4}{24} $ v nule má být 1 (první derivace), proto + 1&lt;/li&gt; 
&lt;li&gt;$f(x) =  x - \frac{x^3}{6}  + \frac{x^5}{120}$ v nule má být 0 (nultá derivace), což odpovídá&lt;/li&gt; 
&lt;/ul&gt;a skutečně, polynom $f(x) =  x - \frac{x^3}{6}  + \frac{x^5}{120}$ se už víc podobá sinu (stejná 0. až 5. derivace), f(1)= &lt;b&gt;0.841666&lt;/b&gt; &lt;br /&gt;
&lt;img border="0" src="http://www.ivank.net/graph/newgraph.php?highquality=1&amp;amp;zoom=50&amp;amp;height=200&amp;amp;width=400&amp;amp;func0=sin(x)&amp;amp;func1=x-(x^3)/6plus(x^5)/120&amp;amp;red1=255&amp;amp;blue1=0&amp;amp;green0=0" /&gt; &lt;br /&gt;
&lt;/li&gt; 
&lt;li class="spacedli"&gt;Šestá derivace našeho polynomu v nule má být 0, tomu už ale vyhovuje předchozí polynom. &lt;br /&gt;
&lt;/li&gt; 
&lt;li class="spacedli"&gt;Podobným způsobem odvodíme nebo odhadneme další, přesnější polynom, a to $f(x) =  x - \frac{x^3}{6}  + \frac{x^5}{120} - \frac{x^7}{5040}$.  (stejná 0. až 7. derivace), f(1)= &lt;b&gt;0.841468&lt;/b&gt; &lt;br /&gt;
&lt;img border="0" src="http://www.ivank.net/graph/newgraph.php?highquality=1&amp;amp;zoom=50&amp;amp;height=200&amp;amp;width=400&amp;amp;func0=sin(x)&amp;amp;func1=x-(x^3)/6plus(x^5)/120-(x^7)/5400&amp;amp;red1=255&amp;amp;blue1=0&amp;amp;green0=0" /&gt; &lt;br /&gt;
&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;Došli jsme tedy k funkci $f(x) =  x - \frac{x^3}{6}  + \frac{x^5}{120} - \frac{x^7}{5040}$, která je v okolí 0 velmi podobná funkci $sin(x)$.&lt;/p&gt;&lt;p&gt;Jak jsme si všimli, $sin(x)$ má v bodě nula derivace sudého řádu vždy nulové, taylorův polynom se mění pouze u přesnosti do liché derivace, stejně tak x má v polynomu pouze liché exponenty. Teď možná mnozí tuší, kde se vzal výraz "lichá funkce" (funkce souměrná dle počátku).&lt;/p&gt;&lt;h2&gt;Taylorův polynom pro obecnou funkci &lt;/h2&gt;&lt;p&gt;Pro obecnou funkci &lt;b&gt;f&lt;/b&gt; hledáme taylorův polynom &lt;b&gt;p&lt;/b&gt;, který bude funkci &lt;b&gt;f&lt;/b&gt; podobný v okolí bodu &lt;b&gt;a&lt;/b&gt;. O funkci &lt;b&gt;f&lt;/b&gt; známe několik úrovní derivací v bodě &lt;b&gt;a&lt;/b&gt;. Polynom &lt;b&gt;p&lt;/b&gt; musí v bodě &lt;b&gt;a&lt;/b&gt; nabývat stejných derivací, jako &lt;b&gt;f&lt;/b&gt;. Tedy $p^{(i)}(a) = f^{(i)}(a)$. &lt;b&gt;To je vše, co od funkce &lt;strong&gt;p&lt;/strong&gt; vyžadujeme.&lt;/b&gt; &lt;/p&gt;&lt;p&gt;Pokud do i-krát zderivovaného polynomu &lt;b&gt;p&lt;/b&gt; dosadíme &lt;b&gt;a&lt;/b&gt;, všechny členy by se měly vynulovat a zůstane tam pouze číslo $f^{(i)}(a)$. Polynom &lt;b&gt;p&lt;/b&gt; tedy musí obsahovat hodnoty těchto derivací, navíc členy musí obsahovat &lt;b&gt;(x-a)&lt;/b&gt;, aby se vynulovaly po dosazení &lt;b&gt;a&lt;/b&gt;. Členy polynomu musí také mít jmenovatele, který se při derivování bude krátit s exponenty, které se derivováním snižují o 1. Ve jmenovateli by měl být součin těchto exponentů, tedy faktoriál.&lt;/p&gt;&lt;h3&gt;Vyhovuje tomu tento zápis:&lt;/h3&gt;$p(x) = f(a) + \frac{f'(a) * (x-a) }{ 1! } + \frac{f''(a) * (x-a)^2 }{ 2! }+ \frac{f'''(a) * (x-a)^3 }{ 3! } + ...$&lt;br /&gt;
&lt;p&gt;Po dosazení &lt;b&gt;a&lt;/b&gt; se polynom rovná $f(a)$ (ostatní členy se vynulovaly). Zkusme polynom zderivovat.&lt;/p&gt;$p'(x) = 0 + f'(a) + \frac{f''(a) * (x-a)^1 }{ 1! }+ \frac{f'''(a) * (x-a)^2 }{ 2! } + ...$&lt;br /&gt;
&lt;p&gt;Po dosazení &lt;b&gt;a&lt;/b&gt; se polynom rovná $f'(a)$ (ostatní členy se vynulovaly). To platí i pro další úrovně derivování.&lt;/p&gt;&lt;p&gt;Polynom pro naši funkci sinus (a=0, nultá derivace 0, první 1, druhá 0, třetí -1, čtvrtá 0, ...) by vypadal takto:&lt;/p&gt;$p(x) = 0 + \frac{1 * (x-0) }{ 1! } + \frac{0 * (x-0)^2 }{ 2! }+ \frac{-1 * (x-0)^3 }{ 3! } + \frac{0* (x-0)^4 }{ 4! } + \frac{1 * (x-0)^5 }{ 5! } +... $&lt;br /&gt;
&lt;h2&gt;Taylorova řada&lt;/h2&gt;&lt;p&gt;Pokud pro nějakou funkci známe všechny její derivace do nekonečna (např. pro sinus, kde se tyto derivace opakují), můžeme ji vyjádřit nekonečným taylorovým polynomem. Hodnotu této funkce v nějakém bodě můžeme vyjádřit jako součet řady (nekonečně mnoha čísel).&lt;/p&gt;&lt;h3&gt;Příklad:&lt;/h3&gt;&lt;p&gt;O funkci $y=e^x$ víme, že v nule má hodnotu 1, první a všechny další derivace také 1. Vyjádříme si pro tuto funkci taylorův polynom&lt;/p&gt;$p(x) = 1 + \frac{1 * (x-0) }{ 1! } + \frac{1* (x-0)^2 }{ 2! }+ \frac{1* (x-0)^3 }{ 3! } + ...$&lt;br /&gt;
&lt;p&gt;Teď si můžeme spočítat hodnotu čísla $e$ (tj. $e^1$) libovolně přesně. Je to totiž:&lt;/p&gt;$e = 1 + 1 + \frac{1}{2}+ \frac{1}{6} + \frac{1}{24} + \frac{1}{120} + ...$&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-6296674023299458462?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/6296674023299458462/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/09/tayloruv-polynom-srozumitelne.html#comment-form' title='Počet komentářů: 29'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/6296674023299458462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/6296674023299458462'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/09/tayloruv-polynom-srozumitelne.html' title='Taylorův polynom srozumitelně'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-502721867961438275</id><published>2010-09-19T15:18:00.000-07:00</published><updated>2011-03-09T08:53:51.645-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tvorba webu'/><title type='text'>Jak vytvořit herní web</title><content type='html'>&lt;p&gt;
V tomto článku jsem se rozhodl popsat postup při tvorbě webu, kde budeme nabízet online hry. Bude možné do něj snadno přidávat nové hry, odebírat, možnosti komentářů a podobně.&lt;br /&gt;
&lt;/p&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Budeme potřebovat:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;internetový hosting s 5 MB volné paměti, podporou PHP a databáze MySQL&lt;/li&gt;
&lt;li&gt;redakční systém Wordpress&lt;/li&gt;
&lt;li&gt;Plugin a téma do Wordpressu&lt;/li&gt;
&lt;li&gt;Čas a chuť přidávat nové hry&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Jak získat hosting&lt;/h2&gt;
&lt;p&gt;
Pro náš web potřebujeme, aby byl dostupný neustále, musí tedy být na počítači, který je pořád připojený k internetu. Hosting znamená, že si pronajímáme místo na takovémto počítači a můžeme tam umísťovat svoje stránky a další data.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Spousta hostingů na internetu je zdarma, např.&amp;nbsp;&lt;a href="http://www.webzdarma.cz/info.html"&gt;WebZdarma&lt;/a&gt;. Většinou podporují PHP a MySQL. Máme jen málo paměti (50 - 500 MB) a musíte na stránkách zobrazovat jejich reklamu.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Hostingů za peníze je ještě víc, např. za poplatek 50 Kč měsíčně můžeme dostat 5 GB paměti a kromě PHP a MySQL dostaneme spoustudalších funkcí.&lt;br /&gt;
&lt;/p&gt;

&lt;h2&gt;Instalace Wordpressu&lt;/h2&gt;

&lt;p&gt;
Wordpress je systém, který nám umožňuje psát si blog (dále pouze WP). Je to hromada souborů s příponou ".php" a dá se rozdělit na 3 části:&lt;br /&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jádro - to je sada funkcí, které pracují s databází, ukládají a načítají články a informace o nich&lt;/li&gt;
&lt;li&gt;téma - to jsou soubory, které si návštěvníci otevírají v prohlížeči. Je tam HTML a CSS kód naší stránky a taky komunikace s jádrem pro načtení článků atd.&lt;/li&gt;
&lt;li&gt;pluginy - to jsou další soubory, které si do WP nahrajeme a přidáme tak nové funkce, např. hodnocení článků, ankety, plugin pro vtipy a podobně.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Kroky instalace:&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;stažení WP, třeba &lt;a href="http://cs.wordpress.org/"&gt;ODSUD&lt;/a&gt;, archiv rozbalíte&lt;/li&gt;
&lt;li&gt;založení databáze na svém hostingu, které dáte jméno a heslo&lt;/li&gt;
&lt;li&gt;v archivu najdeme soubor "wp-config.php" a do něj napíšeme název a heslo k databázi, se kterou WP bude pracovat&lt;/li&gt;
&lt;li&gt;všechny soubory nahrajeme na hosting&lt;/li&gt;
&lt;li&gt;otevřeme naši stránku, nastavíme přihlašovací údaje a porozhlédneme se v administraci WP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Podrobný návod na instalaci naleznete &lt;a href="http://www.widlak.cz/2007/06/26/wordpress-krok-za-krokem-1-dil-instalace/"&gt;ZDE&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;


&lt;h2&gt;Instalace pluginu&lt;/h2&gt;
&lt;p&gt;
Hry budeme dostávat ze stránek &lt;a href="http://mochimedia.com/"&gt;MochiMedia.com&lt;/a&gt;, kde nabízí hry zdarma, avšak do každé dávají reklamu. Ital &lt;a href="http://www.emanueleferonato.com/"&gt;Emanuele Feronato&lt;/a&gt;&amp;nbsp;vytovřil plugin do WP, který si sám nahraje hry z MochiMedia a každou z nich uloží do databáze jako příspěvek blogu.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Plugin stáhneme &lt;a href="http://www.emanueleferonato.com/downloads/mochi_plugin_12.zip"&gt;odsud&lt;/a&gt;, rozzipujeme a nahrajeme do složky wp-content/plugins. Otevřeme administraci WP, zapneme plugin, vlevo se objeví menu kde zmáčkneme "Feed Games". Po chvilce se objeví seznam her, po kliknutí na "Publish" vedle hry se hra zveřejní do blogu.&lt;br /&gt;
Podrobný návod v angličtině je &lt;a href="http://www.emanueleferonato.com/triqui-mochiads-arcade-plugin-for-wordpress-official-page/"&gt;zde&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;

&lt;h2&gt;Instalace tématu&lt;/h2&gt;
&lt;p&gt;
Emanuele Feronato také vytvořil téma pro WP, které zobrazuje články jako tabulku obrázků (to budou náhledy našich her). Téma si stáhneme &lt;a href="http://www.emanueleferonato.com/downloads/triqui_mochiads_arcade.zip"&gt;odsud&lt;/a&gt;. Opět rozbalíme a nahrajeme do složky wp-content/themes. V administraci WP téma aktivujeme.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
V balíčku s tématem najdeme spoustu souborů, např. CSS nebo obrázky (pozadí, titulní obrázek ...). Ty si můžeme upravit nebo nahrát vlastní, tím změníme vzhled webu podle sebe.&lt;br /&gt;
Opět podrobný návod v angličtině je &lt;a href="http://www.emanueleferonato.com/triqui-mochiads-arcade-theme-for-wordpress-official-page/"&gt;zde&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;

&lt;h2&gt;Výsledek&lt;/h2&gt;
&lt;p&gt;
Jak to vypadá můžete vidět na mém webu s online hrami &lt;a href="http://www.hrejonlinehry.cz/"&gt;www.HrejOnlineHry.cz&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-502721867961438275?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/502721867961438275/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/09/jak-vytvorit-herni-web.html#comment-form' title='Počet komentářů: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/502721867961438275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/502721867961438275'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/09/jak-vytvorit-herni-web.html' title='Jak vytvořit herní web'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-5468764443446489301</id><published>2010-09-11T04:58:00.000-07:00</published><updated>2011-04-20T12:47:59.970-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Třída pro matice v C# (Strassenův algoritmus, LU rozklad)</title><content type='html'>&lt;p&gt;
Toto je jednoduchá třída, která obsahuje opravdu rychlé násobení matic (&lt;a href="http://cs.wikipedia.org/wiki/Strassen%C5%AFv_algoritmus"&gt;Strassenův algoritmus&lt;/a&gt;, který je cache oblivious), LU rozklad a další funkce.
&lt;/p&gt;

&lt;a name='more'&gt;&lt;/a&gt;

&lt;p&gt;
Obsahuje mocnění celým číslem (-1 : inverze, ...), LU rozklad, který se dál používá pro výpočet determinantu inverze a řešení systému lineárních rovnic. Samozřejmostí jsou standardní funkce jako sčítání matic, násobení, transpozice ... Třída má vlastní systém vyjímek a přetížené operátory, takže lze psát
&lt;/p&gt;
&lt;pre&gt;
C = A * B;
D = -C;
...
&lt;/pre&gt;


&lt;h2&gt;Test&lt;/h2&gt;
&lt;p&gt;
Při pokusu násobení matice 500x500 čísel je výpočet 3 krát rychlejší, než klasickým algoritmem ($O(n^3)$).
&lt;/p&gt;

&lt;h2&gt;Stažení kódu&lt;/h2&gt;
&lt;a href="http://www.ivank.net/blogspot/matrix_cs/Matrix.cs"&gt;CS file&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.ivank.net/blogspot/matrix_cs/LUDecomposition.exe"&gt;EXE example (.NET - Windows)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-5468764443446489301?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/5468764443446489301/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/09/lightweight-matrix-class-in-c.html#comment-form' title='Počet komentářů: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/5468764443446489301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/5468764443446489301'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/09/lightweight-matrix-class-in-c.html' title='Třída pro matice v C# (Strassenův algoritmus, LU rozklad)'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3577160343134399871.post-891163761320215760</id><published>2010-09-10T04:34:00.000-07:00</published><updated>2011-04-20T12:54:31.651-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Maticová kalkulačka v Pascalu</title><content type='html'>&lt;p&gt;
Vytvořil jsem jednoduchou kalkulačku na matice v Pascalu. Ovládá se z konzole jednoduchými příkazy.
&lt;/p&gt;


&lt;a name='more'&gt;&lt;/a&gt;
&lt;p&gt;
Každá matice je záznam (record) na haldě. Máte 26 pointerů na matice (názvy A až Z).
&lt;/p&gt;

&lt;p&gt;
Kód je psán přehledně a robustně, je snadno rozšířitelný, takže si můžete dopsat vlastní Matlab :)
&lt;/p&gt;

&lt;h2&gt;Maticové funkce v Pascalu&lt;/h2&gt;
&lt;p&gt;
Kód obsahuje sčítání matic, násobení, transpozici, inverzi, gaussovu a gauss-jordanovu eliminaci a další funkce.
&lt;/p&gt;


&lt;p&gt;Pro začátek napište "help" a zmáčkněte Enter.&lt;/p&gt;

&lt;a href="http://www.ivank.net/blogspot/matrix_pascal/matrices.exe"&gt;EXE soubor&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.ivank.net/blogspot/matrix_pascal/matrices.pas"&gt;PAS soubor&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://docs.google.com/View?id=dgvg8n6d_82qqtq6m28"&gt;Dokumentace&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3577160343134399871-891163761320215760?l=ivankuckir.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivankuckir.blogspot.com/feeds/891163761320215760/comments/default' title='Komentáře k příspěvku'/><link rel='replies' type='text/html' href='http://ivankuckir.blogspot.com/2010/09/matrix-calculator-in-pascal.html#comment-form' title='Počet komentářů: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/891163761320215760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3577160343134399871/posts/default/891163761320215760'/><link rel='alternate' type='text/html' href='http://ivankuckir.blogspot.com/2010/09/matrix-calculator-in-pascal.html' title='Maticová kalkulačka v Pascalu'/><author><name>Ivan</name><uri>http://www.blogger.com/profile/07929430872599354760</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_Enx9nlXUY-A/TL3Kzt7m5GI/AAAAAAAAARw/DoAGaGDlH00/S220/4c90f1d892161e019c720000.jpg'/></author><thr:total>0</thr:total></entry></feed>
