>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
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ň