>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Zobrazování polygonů <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Problém je následující : máme 4 body a potřebujeme z nich udělat polygon .. nejlépe vyplněný nějakou barvou ... Okomentovanej polygůnek Postup vyplňování polygonu je následující : • zjistíme minimální a maximální Y, to znamená odkud kam budeme vyplňovat(v našem případě je to Yová souřadnice bodu A a D) • smyčka např. for (i=miny;i<=maxy;i++) ... • zjistíme pro každé Y kde přímka p začíná a kde končí (tzn. body x1 a x2 na obrazku) Ze nevíme jak ? Ale ano ...jen dávat při hodině matyky pozor ...:) Víme že každou přímku v 2D lze vyjádřit obecnou rovnicí : 0 = Ax + By + C přičemž body A a B jsou souřadnice normálového vektoru, který lze získat následovně : • mějme body M[x1,y1] a N[x2,y2] • uděláme vektor : vv = MN = (x2-x1,y2-y1) • a "prohodíme" X a Y souřadnice vektoru vv a jednu z nich (jakoukoliv) vynásobíme (-1) • takže obecně : vv(a,b) ==> nvv(-b,a) nebo nvv(b,-a) , kde nn je normál. Takže naše rovnice pro vektor uu: uu = AB= (x2-x1,y2-y1) nuu = (y1-y2,x2-x1) -> (normál vektoru uu) by vypadala : 0 = (y1-y2) * x + (x2-x1) * y + c Jak získáme c ? Akorát dosadíme do této rovnice nějaký bod ležící na přímce, např. bod A[xa,ya] (klidne i B) ... po úpravách dostaneme rovnici : 0 = (y1-y2)*xa + (x2-x1)*ya + C C = -(y1-y2)*xa - (x2-x1)*ya a C dosadíme do původní rovnice 0 = (y1-y2)*x + (x2-x1)*y - (y1-y2)*xa - (x2-x1)*ya; a po vytknutí máme kompletní rovnici 0 = (y1-y2)(x-xa) + (x2-x1)(y-ya), z čehož potřebujeme získat x ... (x2 - x1) (y - ya) x = ------------------------- - xa (y1-y2) Cool, ne ? No a takhle dopočítáme i bod x2 (viz. obr. výše). • a posledním bodem je nakreslit horizontální lajnu z bodu x1 do bodu x2 oboje ležící na stejné Y. • dále je třeba v algoritmu zjišíovat jestli na dané Y leží bod x1 na úsečce AD, nebo až na úsečce DC ... ale to je jenom otázka podmínek. výheň