home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 September / Chip_2004-09_cd1.bin / chplus / interval / clanek04.htm < prev    next >
Encoding:
Extensible Markup Language  |  2004-08-03  |  20.7 KB  |  242 lines

  1. <?xml version='1.0' encoding='windows-1250'?>
  2. <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
  3. <html xmlns='http://www.w3.org/1999/xhtml' xml:lang='cs' lang='cs'>
  4. <head>
  5. <meta http-equiv='Content-Type' content='text/html; charset=windows-1250' />
  6. <meta http-equiv='Content-language' content='cs' />
  7. <meta http-equiv='Cache-control' content='no-cache' />
  8. <meta http-equiv='Pragma' content='no-cache' />
  9. <meta http-equiv='Expires' content='-1' />
  10. <meta name='robots' content='index,follow' />
  11. <meta name='googlebot' content='index,follow,snippet,noarchive' />
  12. <meta name='description' content='Interval.cz - Internetov² magazφn o webdesignu, v²voji webov²ch aplikacφ a e-komerci. VÜe podstatnΘ o technologiφch XHTML, HTML, CSS, DHTML, JavaScript, XML, .NET, ASP, PHP, Java, J2ME, SQL, WAP...' />
  13. <meta name='keywords' content='Interval' />
  14. <meta name='ICBM' content='49.1915, 16.626' />
  15. <meta name='DC.Title' content='Interval.cz' />
  16. <meta name='DC.Identifier' content='http://interval.cz' />
  17. <meta name='DC.Language' content='cs' />
  18. <meta http-equiv='pics-label' content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline EN v2.0" l gen true for "http://interval.cz" r (nz 1 vz 1 lz 1 oz 1 cz 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://interval.cz" r (n 0 s 0 v 0 l 0))' />
  19. <meta http-equiv='imagetoolbar' content='no' />
  20. <meta http-equiv='MSThemeCompatible' content='no' />
  21. <meta name='MSSmartTagsPreventParsing' content='true' />
  22. <link rel='shortcut icon' type='image/x-icon' href='favicon.ico' />
  23. <link rel='alternate' type='application/rss+xml' title='RSS Interval.cz' href='http://interval.cz/__rss/rss.asp' />
  24. <link rel='home' href='http://interval.cz' />
  25. <link rel='search' href='http://interval.cz/search_ex.asp' />
  26. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/html4.css' />
  27. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/basic_all.css' />
  28. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/homepage_all.css' />
  29. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/articles_all.css' />
  30. <link rel='stylesheet' type='text/css' media='print' href='__services/styles/articles_print.css' />
  31. <title>Interval.cz - webdesign a e-komerce denn∞</title>
  32. </head>
  33. <body class='interval interval-articles'>
  34. <div id='page-header'><div id='interval-logo'><h1 title='Interval.cz - denn∞ o tvorb∞ webu a e-komerci (logo & index link)'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz'>Interval.cz<span></span></a></h1></div><div id='advertising-page-header'></div><div class='page-maker'> </div></div>
  35. <div id='page-topmenu'><h2 class='textversion'>Navigace</h2><div id='page-mainmenu'><h3 class='textversion'>Hlavnφ menu</h3><ul><li class='first selected'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz'>Titulnφ strana</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=14'>Webdesign</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=15'>V²voj aplikacφ</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=18'>E-komerce</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=17'>Nßstroje</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=16'>Magazφn</a></li><li class='right selected'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.inshop.cz'>Knihkupectvφ</a></li><li class='right'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interforum.interval.cz'>Interforum</a></li></ul></div><div id='page-mainmenu-maker'> </div></div>
  36. <div id='page-body'><div id='page-left'><div id='article'>
  37.  
  38.  
  39. <h2>Java a 3D grafika - Geometry (GeometryStripArray)</h2>
  40. <p id='prepend'>Vrcholy t∞les, kterß jsme vytvo°ili v p°edchozφm Φlßnku, nebyly sdφleny mezi jednotliv²mi troj·helnφky, p°esto₧e se troj·helnφky vzßjemn∞ dot²kaly. Z hlediska nßrok∙ na pam∞¥ je takov² zp∙sob ulo₧enφ pom∞rn∞ neefektivnφ. V tomto Φlßnku se seznßmφme se t°φdami pro vytvß°enφ troj·helnφkov²ch trs∙ a pßs∙, jejich₧ vyu₧itφ tento problΘm zΦßsti °eÜφ. V druhΘ Φßsti Φlßnku pak trochu odboΦφme a ukß₧eme si jeden docela zajφmav² algoritmus pro generovßnφ "krajin".</p>
  41.  
  42. <p>Na nßsledujφcφm obrßzku je zobrazen p°φklad trsu troj·helnφk∙ a pßsu troj·helnφk∙. ╚φsla v obrßzku udßvajφ po°adφ, v jakΘm do t∞chto objekt∙ vklßdßme vrcholy.</p>
  43.  
  44. <div class='image'><img src='podklady/kuzelka/906/trsyapasy.png' alt='╚φslovßnφ vrchol∙ v trsech a pßsech' title='╚φslovßnφ vrchol∙ v trsech a pßsech' /></div>
  45.  
  46. <p>T°φdy pro prßci s trsy a pßsy jsou vÜechny odvozeny od abstraktnφ t°φdy GeometryStripArray, kterß je odvozena od t°φdy GeometryArray. V tΘto t°φd∞ je definovßn konstruktor, s nφm₧ budeme v tomto Φlßnku pracovat, a to <samp>GeometryStripArray(int vtxCount, int vertexFormat, int stripVertexCount[])</samp>. Tento konstruktor p°ebφrß t°i parametry. Prvnφ z nich, vtxCount, urΦuje celkov² poΦet vrchol∙, kterΘ budou ulo₧eny v tomto objektu, druh² parametr mß stejn² v²znam jako u konstruktoru t°φdy GeometryArray a urΦuje tedy, co vÜechno bude v tomto objektu ulo₧eno (sou°adnice vrchol∙, barvy, normßlovΘ vektory a dalÜφ). Poslednφm parametrem je pole Φφsel typu int, kterß udßvajφ poΦet vrchol∙ v jednotliv²ch pßsech, pop°φpad∞ trsech, proto₧e do objektu GeometryStripArray jich m∙₧eme ulo₧it i vφce.</p>
  47. <p>Pro nastavovßnφ vrchol∙, barev a pro ostatnφ Φinnosti, jako je nap°φklad dotazovßnφ se "getter" metodami, se pou₧φvajφ metody definovanΘ ve t°φd∞ GeometryArray, s nφ₧ jsme se ji₧ seznßmili.</p>
  48. <p>Nynφ m∙₧eme p°ejφt k prvnφmu p°φkladu, jφm₧ bude vytvo°enφ ÜroubovΘ plochy pomocφ pßsu troj·helnφk∙. Pßsy troj·helnφk∙ se v Jav∞ 3D vytvß°ejφ pomocφ instancφ t°φdy TriangleStripArray. NßÜ program, kter² vytvß°φ Üroubovou plochu, nenφ p°φliÜ efektivnφ kv∙li p°φliÜ velkΘmu poΦtu volßnφ funkcφ sinus a kosinus. Tato volßnφ by Üla nahradit pou₧itφm rotace o konstantnφ ·hel, ale kv∙li Φitelnosti jsem je ponechal v tomto tvaru.</p>
  49.  
  50. <div class='sample'>
  51.     int vertexCounts[] = {300};
  52. <br />    TriangleStripArray tsa = new TriangleStripArray(300, GeometryArray.COORDINATES | GeometryArray.NORMALS, vertexCounts);
  53. <br />    float r = 0.5f;
  54. <br />    for (int i = 0; i < 300; i+=2){
  55. <br />    float x = r*(float)Math.cos(i/20f);
  56. <br />    float y = r*(float)Math.sin(i/20f);
  57. <br />    float z = i/300f;
  58. <br />    tsa.setCoordinate(i, new Point3f(0, 0, z));
  59. <br />    tsa.setCoordinate(i+1, new Point3f(x, y, z));
  60. <br />    }
  61. </div>
  62.  
  63. <div class='image'><img src='podklady/kuzelka/906/sroub.png' alt='èroubovß plocha' title='èroubovß plocha' /></div>
  64.  
  65. <p>Zdrojov² k≤d zde neuvßdφm cel², proto₧e k vypoΦφtßnφ normßlov²ch vektor∙ je v n∞m pou₧ita t°φda NormalGenerator, s nφ₧ jsme se jeÜt∞ nesetkali.</p>
  66. <p>V dalÜφm p°φkladu vytvo°φme pro zm∞nu ku₧elovou plochu pomocφ trsu troj·helnφk∙. Pro vytvß°enφ trs∙ troj·helnφk∙ budeme pot°ebovat t°φdu TriangleFanArray. Pro efektivitu tohoto programu platφ totΘ₧, co jsme si °ekli u p°edchozφho programu.</p>
  67.  
  68. <div class='sample'>
  69.     int vertexCount[] = {32};
  70. <br />    TriangleFanArray tfa = new TriangleFanArray(32, GeometryArray.COORDINATES | GeometryArray.NORMALS, vertexCount);
  71. <br />    tfa.setCoordinate(0, new Point3f(0,0,1));
  72. <br />    float r = 0.5f;
  73. <br />    for (int i = 1; i < 32; i++){
  74. <br />    float x = r*(float)Math.cos(Math.PI*i/15f);
  75. <br />    float y = r*(float)Math.sin(Math.PI*i/15f);
  76. <br />    tfa.setCoordinate(i, new Point3f(x,y,0));
  77. <br />    }
  78. </div>
  79.  
  80. <div class='image'><img src='podklady/kuzelka/906/fan_kuzel.png' alt='Ku₧el' title='Ku₧el' /></div>
  81.  
  82. <p>To je zatφm vÜe, co se t²Φe t°φd odvozen²ch od t°φdy GeometryArray. P°φÜt∞ se zaΦneme zab²vat indexovanou geometriφ. Nynφ se podφvßme na jeden docela zajφmav² algoritmus pro generovßnφ terΘn∙.</p>
  83.  
  84. <h3>Generovßnφ terΘn∙</h3>
  85. <p>Pro generovßnφ terΘn∙ existuje celß °ada algoritm∙, z nich₧ asi nejpopulßrn∞jÜφ jsou ty vyu₧φvajφcφ fraktßly (pokud vßs tato problematika zajφmß, tak na Rootu vyÜel Φlßnek <a href='http://www.root.cz/clanek/2210'>o mid-point displacement algoritmu</a>). My se v tomto Φlßnku nebudeme zab²vat ₧ßdn²m algoritmem vyu₧φvajφcφm fraktßly, ale ukß₧eme si modifikaci "kopeΦkovΘho" algoritmu popsanou na <a href='http://www.robot-frog.com'>robot frog</a>.</p>
  86. <p>Zßkladnφ myÜlenka tohoto algoritmu je velice prostß. Na nßhodn∞ vybranß mφsta umφstφme kopeΦky s nßhodn²mi velikostmi. P°i dostateΦn∞ velkΘm mno₧stvφ kopeΦk∙ zaΦne nßÜ terΘn p°ipomφnat skuteΦnou krajinu, by¥ ne tak realistickou, jako bychom zφskali p°i pou₧itφ n∞jakΘho algoritmu vyu₧φvajφcφho fraktßl∙, ale i to m∙₧e b²t mnohdy p°φnosem.</p>
  87. <p>V programu to ud∞lßme nßsledovn∞. ZaΦneme s height-mapou, jejφ₧ v²Üky nastavφme na nulu. Nßhodn∞ vybereme bod le₧φcφ na naÜφ ploÜe, co₧ bude st°ed kopeΦku, a k n∞mu nßhodn∞ vybereme dalÜφ Φφslo û polom∞r. Ke ka₧dΘmu bodu uvnit° kruhu danΘho polom∞rem a st°edem p°iΦteme hodnotu <samp>polom∞r*polom∞r - (k-x)*(k-x) - (j-y)*(j-y)</samp>, co₧ je vzorec pro rotaΦnφ paraboloid "p°eklopen² sm∞rem dol∙". Tento postup zopakujeme, kolikrßt budeme chtφt. Potom cel² terΘn posuneme, aby jeho nejni₧Üφ bod m∞l z-ovou sou°adnici rovnou nule. Dßle vynßsobφme vÜechny body hodnotou <samp>1/(max-min)</samp>, dφky Φemu₧ budou vÜechny v²Üky v intervalu od 0 do 1. V²Üky vÜech bod∙ potom m∙₧eme umocnit na druhou. Tento krok sice nenφ nezbytn², jeho vyu₧itφm ale m∙₧eme zφskat krajinu s hezk²mi ·dolφΦky. Nakonec vÜechny v²Üky vynßsobφme parametrem maxVyska, udßvajφcφm maximßlnφ v²Üku naÜeho terΘnu. Zdrojov² k≤d, kter² toto vÜechno d∞lß, je na nßsledujφcφm v²pisu:</p>
  88.  
  89. <div class='sample'>
  90. package interval.j3d;
  91. <br />
  92. <br />import java.util.Random;
  93. <br />
  94. <br />public class Hills {
  95. <br />  <span class='comment'>// vytvß°et tuto t°φdu by mohlo b²t zbyteΦnΘ</span>
  96. <br />  private Hills() {
  97. <br />  }
  98. <br />  <span class='comment'>//tato metoda nßm naplnφ pole data hodnotami odpovφdajφcφmi</span>
  99. <br />  <span class='comment'>//v²Ükßm jednotliv²ch bod∙ v naÜem terΘnu</span>
  100. <br />  public static void generateTerrain(float data[][], int minPolomer, int maxPolomer, int pocetIteraci, float maxVyska){
  101. <br />    int rozmerY = data.length;
  102. <br />    int rozmerX = data[0].length;
  103. <br />    float max = 0;
  104. <br />    float min = 0;
  105. <br />    <span class='comment'>//vytvo°φme generßtor nßhodn²ch Φφsel</span>
  106. <br />    Random rand = new Random(System.currentTimeMillis());
  107. <br />    <span class='comment'>//tato smyΦka provßdφ postup, kter² jsme si popsali v Φlßnku</span>
  108. <br />    for (int i = 0; i < pocetIteraci; i++){
  109. <br />    <span class='comment'>//vybereme sou°adnice st°edu novΘho kopeΦku...</span>
  110. <br />    int x = rand.nextInt(rozmerX);
  111. <br />    int y = rand.nextInt(rozmerY);
  112. <br />    <span class='comment'>//... a polom∞r</span>
  113. <br />    int polomer = minPolomer + rand.nextInt(maxPolomer-minPolomer+1);
  114. <br />    int j0, k0, maxJ, maxK;
  115. <br />    <span class='comment'>//dßle se musφme vypo°ßdat s body, kterΘ sice jsou na kladnΘ Φßsti</span>
  116. <br />    <span class='comment'>//rotaΦnφho paraboloidu (kopeΦku), ale le₧φ mimo stanovenΘ hodnoty x,y</span>
  117. <br />    if (y-polomer >= 0)
  118. <br />      j0 = y-polomer;
  119. <br />    else
  120. <br />      j0 = 0;
  121. <br />    if (y+polomer < rozmerY)
  122. <br />      maxJ = y+polomer;
  123. <br />    else
  124. <br />      maxJ = rozmerY;
  125. <br />    
  126. <br />    if (x-polomer >= 0)
  127. <br />      k0 = x-polomer;
  128. <br />    else
  129. <br />      k0 = 0;
  130. <br />    if (x+polomer < rozmerX)
  131. <br />      maxK = x+polomer;
  132. <br />    else
  133. <br />      maxK = rozmerX;
  134. <br />    <span class='comment'>//v t∞chto cyklech vytvß°φme naÜe kopeΦky</span>
  135. <br />    <span class='comment'>//p°iΦtenφm hodnoty polomer*polomer - (k-x)*(k-x) - (j-y)*(j-y)</span>
  136. <br />    <span class='comment'>//k Φφslu na data[j][k]</span>
  137. <br />    for (int j = j0; j < maxJ; j++){
  138. <br />      for (int k = k0; k < maxK; k++){
  139. <br />        float z = polomer*polomer - (k-x)*(k-x) - (j-y)*(j-y);
  140. <br />        if (z > 0){
  141. <br />        data[j][k] += z;
  142. <br />        max = Math.max(data[j][k], max);
  143. <br />        min = Math.min(data[j][k], min);
  144. <br />        }
  145. <br />      }
  146. <br />    }
  147. <br />    }
  148. <br />    <span class='comment'>//musφme upravit v²Üku, aby byla v rozumn²ch mezφch</span>
  149. <br />    scale(data, min, max, maxVyska);
  150. <br />  }
  151. <br />  protected static void scale(float data[][], float min, float max, float vyska){System.out.println(min+" "+max);
  152. <br />    for (int i = 0; i < data.length; i++){
  153. <br />    for (int j = 0; j < data[0].length; j++){
  154. <br />      data[i][j] -= min;
  155. <br />      data[i][j] *= (1/(max-min));
  156. <br />      data[i][j] *= data[i][j];
  157. <br />      data[i][j] *= vyska;
  158. <br />    }
  159. <br />    }
  160. <br />  }
  161. <br />}
  162. </div>
  163.  
  164. <p>Objekt Shape3D, obsahujφcφ nßÜ terΘn, pak vytvo°φme snadno s vyu₧itφm t°φdy HeightMap z p°edchozφho Φlßnku, jak m∙₧eme vid∞t dßle. (T°φdu HeightMap lze snadno upravit tak, aby pou₧φvala pßsy troj·helnφk∙.)</p>
  165.  
  166. <div class='sample'>
  167. float heights[][] = new float[170][170];
  168. <br />Hills.generateTerrain(heights, 0, 20, 800, 0.3f);
  169. <br />HeightMap hm = new HeightMap(heights, 1.2f, 1.2f);
  170. </div>
  171.  
  172. <p>Pokud nastavφme p°φliÜ mal² poΦet iteracφ, nebude nßÜ terΘn vypadat v∙bec reßln∞. S velkou pravd∞podobnostφ to bude pouze n∞kolik osamocen²ch Φßstφ rotaΦnφch paraboloid∙ trΦφcφch z roviny. P°esv∞dΦit se o tom m∙₧eme na nßsledujφcφm obrßzku, kter² byl vytvo°en s poΦtem iteracφ rovn²m deseti:</p>
  173.  
  174. <div class='image'><img src='podklady/kuzelka/906/hills_10iter.png' alt='TerΘn vytvo°en² deseti iteracemi' title='TerΘn vytvo°en² deseti iteracemi' /></div>
  175.  
  176. <p>DalÜφ obrßzek u₧ ukazuje terΘn, u n∞ho₧ jsme poΦet iteracφ nastavili na mnohem v∞tÜφ hodnotu, konkrΘtn∞ 800:</p>
  177.  
  178. <div class='image'><img src='podklady/kuzelka/906/hills_800iter.png' alt='TerΘn vytvo°en² 800 iteracemi' title='TerΘn vytvo°en² 800 iteracemi' /></div>
  179.  
  180. <p>Poslednφ obrßzek jeÜt∞ ukazuje, jak by vypadal terΘn, pokud bychom v²Üky nejprve neumocnili. Zßle₧φ samoz°ejm∞ jen na vßs, kterou variantu si zvolφte.</p>
  181.  
  182. <div class='image'><img src='podklady/kuzelka/906/hills_800iter_bez_umocneni.png' alt='TerΘn vytvo°en² 800 iteracemi bez umocn∞nφ v²Üky' title='TerΘn vytvo°en² 800 iteracemi bez umocn∞nφ v²Üky' /></div>
  183.  
  184. <p>Tento algoritmus je pochopiteln∞ mo₧nΘ r∙zn∞ obm∞≥ovat. Nap°φklad m∙₧eme zm∞nit funkci generujφcφ kopeΦky. TaktΘ₧ m∙₧eme nßhodn∞ jednou vytvo°it kopeΦek a jindy zase ·dolφ. Zm∞nit se dß takΘ rozlo₧enφ nßhodn²ch Φφsel, nap°φklad je mo₧nΘ pou₧φt gaussovskΘ rozlo₧enφ. Zkrßtka, mo₧nostφ je nep°ebern∞.</p>
  185.  
  186.  
  187.  
  188. <div id='article-author'>
  189. <a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/autor.asp?author=194'>Ku₧elka, Ond°ej</a> (1. 7. 2004)
  190.  
  191. </div>
  192.  
  193.  
  194. </div></div>
  195. <div id='page-right'><h2 class='textversion'>Prav² sloupek</h2>
  196. <div id='search'><h3 class='textversion'>Vyhledßvßnφ</h3><form method='get' action='http://interval.cz/search.asp'><div><input type='text' name='hledej' class='text' /><input type='submit' class='submit' value='Najdi!' /></div></form><div><a href='http://interval.cz/search_ex.asp'>RozÜφ°enΘ vyhledßvßnφ</a></div></div>
  197.  
  198.  
  199.  
  200. <div class='page-right-box book'>
  201.     <h3>Kni₧nφ novinka</h3>
  202.     <div class='page-right-box-in'>
  203.         <div class='book-top'>
  204.             <h4><a href='http://interval.cz/__redirect/redirect.asp?what=interval_booknews&url=http://interval.inshop.cz/inshop/scripts/detail.asp?ItemID=269'>Optimalizace pro vyhledßvaΦe - SEO</a></h4>
  205.         </div>
  206.     </div>
  207.     <div class='image'>
  208.         <img src='podklady/knihy/image.jpg' alt='obßlka' title='obßlka' /></a>
  209.     </div>
  210.     <div class='book-bottom'>Cena: <span class='book-price-old'>169 KΦ</span> <span class='book-price-new'>152 KΦ</span></div>
  211. </div>
  212.  
  213.  
  214.  
  215. <div class='page-right-box reading'>
  216.     <h3>NejΦten∞jÜφ</h3>
  217.     <div class='page-right-box-in'>
  218.         <ul>
  219. <li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3476'>Kurz SVG - vypl≥ovßnφ I</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3479'>PPWizard - pokroΦilß makra, podmφnky a standardnφ definice</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3478'>Transformace dat z databßze pomocφ XSL v .NET jednoduÜe</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3481'>Strßnkovßnφ v ovlßdacφm prvku DataGrid bez pou₧itφ PostBack</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3477'>Zpracovßnφ databßzov²ch dat p°es XSLT v ASP</a></li>
  220.         </ul>
  221.     </div>
  222. </div>
  223.  
  224.  
  225.  
  226. <div class='page-right-box cauldron'>
  227.     <h3>Diskuznφ kotel</h3>
  228.     <div class='page-right-box-in'>
  229.         <ul>
  230. <li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3473' title='(25 komentß°∙)'>Sedφm na konßri a Φtu Computerworld</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3468' title='(23 komentß°∙)'>PPWizard - tvo°φme a spravujeme WWW strßnky</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3474' title='(22 komentß°∙)'>PφÜeme pro web - o sφle slov</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3464' title='(15 komentß°∙)'>Kurz SVG - grafickß primitiva</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3472' title='(10 komentß°∙)'>Cryptography v .NET - Symmetric a Asymmetric encryption</a></li>
  231.         </ul>
  232.     </div>
  233. </div>
  234.  
  235.  
  236.  
  237. <div class='page-right-box emailserv'><h3>Email servis</h3><div class='page-right-box-in'><form action='prihlaseni.asp' method='post'><div class='shell'><input class='text' type='text' name='adresa' /></div><div class='shell'><input class='radio' type='radio' value='1' name='co' checked='checked' />T²dennφ p°ehled Φlßnk∙</div><div class='shell'><input class='radio' type='radio' value='2' name='co' />HELP konference</div><div class='shell'><input class='submit' type='submit' value='P°ihlßsit' /></div></form></div></div>
  238. </div>
  239. <div class='page-maker'> </div><div class='page-maker-white'> </div></div>
  240. <div id='page-foot'><div id='page-foot-menu'><a href='http://interval.cz/reklama.asp'>Inzerce na Interval.cz</a> | <a href='http://interval.cz/redakce.asp'>Redakce Interval.cz</a> | <a href='http://interval.cz/autori.asp'>Hledßme novΘ autory</a></div><div id='issn'>ISSN 1212-8651</div><div id='page-foot-zoner'>© Zoner software, s.r.o., vÜechna prßva vyhrazena, tento server dodr₧uje <a href='http://interval.cz/privacy.asp'>prßvnφ p°edpisy</a>o ochran∞ osobnφch ·daj∙.</div></div>
  241. </body>
  242. </html>