(Horváth Gyula és Szlávi Péter előadásai felhasználásával)
Feladat: Adjuk meg, hogy az origóból nézve az 1. síknegyedbe eső P ponthoz képest a Q balra, jobbra vagy pedig egy irányban látszik-e! Irány(P,Q) = 1, 1, 0, egy irányb Ponttípus: Típus Tpont=rekord(x,y: Egész) ha ha ha balra jobbra an Q P Geometriai algoritmusok 2016.01.27. 14:08 2/60
Értelmezés: A pontok irányát megadhatjuk az oda vezető egyenes és az x-tengely szögével. Q < tan( )<tan( ) P tan( )=P.y/P.x tan( )=Q.y/Q.x P P.x P.y Geometriai algoritmusok 2016.01.27. 14:08 3/60
< tan( )<tan( ) P.y/P.x<Q.y/Q.x P.y*Q.x<Q.y*P.x P.y*Q.x Q.y*P.x<0 Állítás: Irány(P,Q)=sgn(P.y*Q.x Q.y*P.x) (és ez igaz nem csak az 1. síknegyedben!). sgn(p.y*q.x Q.y*P.x) = 1, 1, 0, ha ha ha Q Q Q a P - töl balra a P - töl jobbra és P egy irányb an Geometriai algoritmusok 2016.01.27. 14:08 4/60
Irány(P,Q): S:=P.y*Q.x Q.y*P.x Ha S<0 akkor Irány:=-1 különben ha S=0 akkor Irány:=0 különben Irány:=1 Függvény vége. Geometriai algoritmusok 2016.01.27. 14:08 5/60
Feladat: Egy s (A B) szakaszhoz képest egy t (B C) szakasz milyen irányban fordul? Megoldásötlet: Toljuk el az s-t és a t-t úgy, hogy az A pont az origóba kerüljön! Ezzel visszavezetjük az irányos feladatra! Fordul(A,B,C)=Irány(B A,C A) Ezzel ekvivalens feladat: Az (A,B)-n átmenő egyenestől a C pont balra van, vagy jobbra van, vagy az (A,B) egyenesen van? Geometriai algoritmusok 2016.01.27. 14:08 6/60 A s t C B
Fordul(A,B,C): P:=B-A {P.x:=B.x-A.x; P.y:=B.y-A.y} Q:=C-A {Q.x:=C.x-A.x; Q.y:=C.y-A.y} Fordul:=Irány(P,Q) Függvény vége. t C A s B Geometriai algoritmusok 2016.01.27. 14:08 7/60
Feladat: Döntsük el, hogy egy C pont rajta van-e egy (A,B) szakaszon! Megoldás: Biztos nincs rajta, ha az A-B-C úton valamerre fordulni kell! Ha nem kell fordulni, akkor A és B között kell lennie! A C B Geometriai algoritmusok 2016.01.27. 14:08 8/60
Rajta(a,b,c): Rajta:=Fordul(a,b,c)=0 és Közte(a.x,c.x,b.x) és Közte(a.y,c.y,b.y) Függvény vége. Közte(r,s,t): Közte:=r s és s t vagy t s és s r Függvény vége. Geometriai algoritmusok 2016.01.27. 14:08 9/60
Feladat: Döntsük el, hogy az (A,B) szakasz metszi-e a (C,D) szakaszt! Lehetséges esetek: A C D B A C D A B C A C D D B B A C B D Geometriai algoritmusok 2016.01.27. 14:08 10/60
Metszi(A,B,C,D): Metszi:=Fordul(A,B,C)*Fordul(A,B,D)<0 és Fordul(C,D,A)*Fordul(C,D,B)<0 vagy Rajta(A,B,C) vagy Rajta(A,B,D) vagy Rajta(C,D,A) vagy Rajta(C,D,B) Függvény vége. A C D B Geometriai algoritmusok 2016.01.27. 14:08 11/60
Feladat: Döntsük el, hogy a D pont az (A,B,C) háromszög belsejében van-e! Megoldásötlet: Belül van, ha a háromszöget A B C A sorrendben körbejárva a D pont vagy mindig balra, vagy mindig jobbra van. C D B Geometriai algoritmusok 2016.01.27. 14:08 12/60 A
Belül(A,B,C,D): Belül:=Fordul(A,B,D)=Fordul(B,C,D) és Fordul(B,C,D)=Fordul(C,A,D) Függvény vége. C B C B A D A D Geometriai algoritmusok 2016.01.27. 14:08 13/60
Feladat: Adott A, B és D pont esetén adjunk meg további N pont közül egy P i pontot úgy, hogy a D pont az (A,B,P i ) háromszög belsejében legyen! Megoldásötlet: Belül van a P i pont, ha a háromszöget A B P i A sorrendben körbejárva a D pont vagy mindig balra, vagy mindig jobbra van. Geometriai algoritmusok 2016.01.27. 14:08 14/60
Keresés(A,B,N,P,D,Van,S): ir:=fordul(a,b,d); i:=1 Ciklus amíg i N és (Fordul(B,P(i),D) ir vagy Fordul(P(i),A,D) ir) i:=i+1 Ciklus vége Van:=i N Ha Van akkor S:=i Eljárás vége. Geometriai algoritmusok 2016.01.27. 14:08 15/60
Feladat: Adott A és B pont esetén adjunk meg további N pont közül egy P i pontot úgy, hogy az (A,B,P i ) háromszög belsejében egyetlen más pont se legyen! Feltehető, hogy az összes pont az (A,B) egyenestől balra van! P 1 P 6 P 3 P 2 P 5 P 7 P 4 B A Geometriai algoritmusok 2016.01.27. 14:08 16/60
Megoldás: Ha van egy potenciális jelöltünk (pl. P 1 ), akkor az (A,P 1 )-től balra levők és a (B,P 1 )-től jobbra levők biztos nincsenek az (A, B,P 5 ) háromszögben! Az (A,P 1 )-től jobbra levők és a (B,P 1 )-től balra levők pedig benne vannak. P 1 P 6 P 3 P 2 P 5 P 7 P 4 B A Geometriai algoritmusok 2016.01.27. 14:08 17/60
Kiválasztás(A,B,N,P,D,S): S:=1 Ciklus i=2-től N-ig Ha Fordul(A,P(S),P(i))=1 és Fordul(B,P(S),P(i))=-1 akkor S:=i Ciklus vége Eljárás vége. P 1 P 6 P 3 {jobbra} {balra} P 2 P 5 P 7 P 4 B A Geometriai algoritmusok 2016.01.27. 14:08 18/60
Feladat: Adott A, B és D pont esetén adjunk meg további N pont közül egy P i pontot úgy, hogy a D pont az (A,B,P i ) háromszög belsejében legyen, de egyetlen más pont se legyen benne! Feltehető, hogy a D pont az (A,B) egyenestől balra van! P 5 P 4 D P 3 B P 2 A P 1 Geometriai algoritmusok 2016.01.27. 14:08 19/60
Megoldás: Nem oldható meg, ha a piros színű tartományban van pont. Az (A,B)-től jobbra levő pontok nem jók szürke tartomány. Az (A,D)-től jobbra levő pontok nem jók sárga tartomány. A (B,D)-től balra levő pontok nem jók zöld tartomány. Sajnos nem a teljes fehér tartomány jó! Geometriai algoritmusok 2016.01.27. 14:08 20/60
Megoldás: Az (A,D) egyenestől balra, a (B,D) egyenestől jobbra olyan P i pontot kell találnunk, hogy az (A,B,P i ) háromszög belsejében ne legyen más pont! Ha van egy potenciális jelöltünk (pl. P 4 ), akkor az (A,P 4 )-től balra levők és a (B,P 4 )-től jobbra levők biztos nincsenek az (A, B,P 4 ) háromszögben! Finomíthatjuk a megoldást, ha P 6 P P 3 4 B feltesszük, hogy nincs P 2 és P P 3 7 P 5 D típusú pont! P 2 A P 1 Geometriai algoritmusok 2016.01.27. 14:08 21/60
Keresés(A,B,N,P,D,Van,S): {(A,B)-től és (A,D)-től balra} S:=0 {(B,D)-től jobbra} Ciklus i=1-től N-ig Ha Fordul(A,B,P(i))=-1 és Fordul(B,D,P(i))=1 és Fordul(A,D,P(i))=-1 akkor Ha S=0 akkor S:=i különben Ha Fordul(A,P(S),P(i))=1 és Fordul(B,P(S),P(i))=-1 akkor S:=i Ciklus vége P Van:=S>0 6 P P 3 4 B P Eljárás vége. 7 P 5 D P 2 A Geometriai algoritmusok P 1 2016.01.27. 14:08 22/60
Keresés(A,B,N,P,D,Van,S): Ha Fordul(A,B,D)>0 akkor Csere(A,B) AA:=0; BB:=0; C:=0 Ciklus i=1-től N-ig {zöld-sárga pontok} FAB:=Fordul(A,B,P(i)) FBD:=Fordul(B,D,P(i)) FDA:=Fordul(D,A,P(i)) {a szürke és a piros tartomány már a ciklus előtt kiszűrhető, de itt sem zavarnak} P 5 P 4 P 6 P 7 D P 3 B P 2 A Geometriai algoritmusok 2016.01.27. 14:08 23/60 P 1
Ha FAB<0 és FDA>0 és FBD<0 akkor Ha AA=0 vagy Fordul(A,P(AA),P(i))>0 akkor AA:=i {(A,B)-től balra, (D,A)-tól jobbra, (B,D)-től balra, (A,P(AA)-tól jobbra} Ha FAB<0 és FDA<0 és FBD>0 akkor Ha BB=0 vagy Fordul(B,P(BB),P(i))<0 akkor BB:=i {(A,B)-től balra, (D,A)-tól balra, (B,D)-től jobbra, (B,P(BB)-tól balra} Ciklus vége Geometriai algoritmusok 2016.01.27. 14:08 24/60
i:=1; C:=0 Ciklus amíg i n és C 0 {egy C meghatározása} Ha i AA és i BB akkor Ha AA>0 akkor FAAA:=Fordul(A,P(AA),P(i)) Ha BB>0 akkor FBBB:=Fordul(B,P(BB),P(i)) FDA:=Fordul(D,A,P(i)) FBD:=Fordul(B,D,P(i)) Ha (AA=0 vagy FAAA>0) és (BB=0 vagy FBBB<0) és FDA>0 és FBD>0 akkor C:=i Ciklus vége Ha C>0 akkor {C finomítása} Geometriai algoritmusok 2016.01.27. 14:08 25/60
{C finomítása} Ciklus i=c+1-től n-ig {(A,B)-től balra, (A,C)-től jobbra} Ha i AA és i BB akkor {(B,C)-től balra} FAB:=Fordul(A,B,P(i)) FAC:=Fordul(A,P(C),P(i)) FBC:=Fordul(B,P(C),P(i)) Ha FAB<0 és FAC>0 és FBC<0 akkor C:=i Ciklus vége Eljárás vége. Geometriai algoritmusok 2016.01.27. 14:08 26/60
Feladat: Döntsük el, hogy a (P 1,,P n ) sokszög konvex sokszög-e! (A pontokat az óramutató járásával ellenkező sorrendben adjuk meg.) Megoldás: A sokszög konvex, ha minden szöge kisebb 180 foknál, azaz az óramutató járásával ellentétes körbejárással haladva minden csúcsban balra kell fordulni! Geometriai algoritmusok 2016.01.27. 14:08 27/60
Konvex(P,N) P(N+1):=P(1); P(N+2):=P(2); i:=1 Ciklus amíg i N és Fordul(P(i),P(i+1),P(i+2))<0 i:=i+1 Ciklus vége Konvex:=i>N Eljárás vége. Geometriai algoritmusok 2016.01.27. 14:08 28/60
Feladat: Döntsük el, hogy a D pont a (P 1,,P n ) konvex sokszög belsejében van-e! Megoldásötlet: Belül van, ha a sokszöget adott sorrendben körbejárva a D pont vagy mindig balra, vagy mindig jobbra van. Geometriai algoritmusok 2016.01.27. 14:08 29/60
Belül(N,P,D): P(N+1):=P(1); Ir:=Fordul(P(1),P(2),D); i:=2 Ciklus amíg i N és Ir=Fordul(P(i),P(i+1),D) i:=i+1 Ciklus vége Belül:=i>N Függvény vége. Geometriai algoritmusok 2016.01.27. 14:08 30/60
Feladat: Döntsük el, hogy a D pont a (P 1,,P n ) konkáv sokszög belsejében van-e! Probléma: Itt nem működik a konvex esetben alkalmazható: mindig egy irányban van elv. Geometriai algoritmusok 2016.01.27. 14:08 31/60
Megoldás: Kössük össze a D pontot egy biztosan külső Q ponttal, majd számoljuk meg, hogy a (D,Q) szakasz a sokszög hány oldalát metszi! Q. y : Q. x : min i 1,..., N max i 1,.., N P i. x D. x P. y 1 P i i. x Geometriai algoritmusok 2016.01.27. 14:08 32/60
Külső(N,P,D,Q): Q.y:=P(1).y; Q.x:=- Ciklus i=2-től N-ig Ha Q.y>P(i).y akkor Q.y:=P(i).y Ha P(i).x<D.x akkor Ha Q.x<P(i).x akkor Q.x:=P(i).x Ciklus vége Q.y:=Q.y-1 Függvény vége. Ha Q.x=- maradt, akkor a D pont kívül van! Geometriai algoritmusok 2016.01.27. 14:08 33/60
Belül(N,P,D): P(N+1):=P(1); Db:=0 Külső(N,P,D,Q) Ciklus i=1-től N-ig Ha Metszi(P(i),P(i+1),D,Q) akkor Db:=Db+1 Ciklus vége Belül:=(Db mod 2)=1 Függvény vége. Geometriai algoritmusok 2016.01.27. 14:08 34/60
Feladat: Egy látképet egyenes szakaszok sorozatával adunk meg. A látkép felett a függőleges iránnyal az óramutató járása szerint szöget bezárva, végtelen távolságban van a Nap. Add meg, hogy a Nap megvilágítja-e a teljes látképet! Ha nem, akkor add meg a megvilágítás irányából az első olyan szakasz sorszámát, amelyet a Nap nem világít meg! Geometriai algoritmusok 2016.01.27. 14:08 35/60
Árnyék(N,H,Mind,E,Alfa): (DX,DY):=Alfa szögből számítva i:=1 Ciklus amíg i<n és Fordul(H(i)-(DX,DY),H(i),H(i+1))=-1 i:=i+1 Ciklus vége Mind:=i N Ha nem Mind akkor E:=i Eljárás vége Geometriai algoritmusok 2016.01.27. 14:08 36/60
Feladat: Egy koordinátarendszerben az x-tengely mentén téglalap alakú házak helyezkednek el. Egy lámpa balról, fentről világítja meg a házakat. Melyek azok a házak, amelyek teljesen árnyékban vannak? Megjegyzés: Az ábra szerint elég a házak bal felső sarkát ismerni! Geometriai algoritmusok 2016.01.27. 14:08 37/60
Megoldás: Legyen L a lámpa, H(i) az i-edik ház jobb felső sarkának helye, u pedig az utoljára megvilágított ház! Azok a házak vannak árnyékban, amelyeket az előttük levő utolsó megvilágított ház teljesen takar. Azaz az L H(u) H(i) úton nem balra kell fordulni! Geometriai algoritmusok 2016.01.27. 14:08 38/60
Árnyék(L,N,H,Db,Y): Db:=0; u:=1 Ciklus i=2-től N-ig Ha Fordul(L,H(u),H(i))=-1 akkor u:=i különben Db:=Db+1; Y(Db):=i Ciklus vége Eljárás vége Geometriai algoritmusok 2016.01.27. 14:08 39/60
Feladat: Egy koordinátarendszerben az x-tengely mentén téglalap alakú házak helyezkednek el. A Nap balról, fentről süt rájuk, a házakhoz párhuzamos fénysugarak érkeznek. Melyek azok a házak, amelyeknek legalább egyetlen pontjára süt a nap? Az ábra szerint elég a házak bal felső sarkát ismerni! DY fénysugár DX Geometriai algoritmusok 2016.01.27. 14:08 40/60
Megoldás: Legyen H(i) az i-edik ház jobb felső sarkának helye, u pedig az utoljára megvilágított ház! Azok a házak vannak megvilágítva, amelyeket az előttük levő utolsó megvilágított ház nem takar. Azaz a H H(u) H(i) úton balra kell fordulni! Geometriai algoritmusok 2016.01.27. 14:08 41/60
Világos(DX,DY,N,H,Db,Y): Db:=1; Y(Db):=1 Ciklus i=2-től N-ig Ha irány(h(y(db))-(dx,dy),h(y(db)),h(i))=-1 akkor Db:=Db+1; Y(Db):=i Ciklus vége Eljárás vége Geometriai algoritmusok 2016.01.27. 14:08 42/60
Feladat: Adott a síkon n darab pont, amelyek nem esnek egy egyenesre. A pontok (x,y) koordinátáikkal adottak. Kössünk össze pontpárokat egyenes szakaszokkal úgy, hogy olyan zárt poligont kapjunk, amelyben nincs metsző szakaszpár! Geometriai algoritmusok 2016.01.27. 14:08 43/60
Megoldás: Válasszuk ki a legkisebb x-koordinátájú pontot, ha több ilyen van, akkor ezek közül válasszuk a legkisebb y-koordinátájút! Ezt nevezzük (bal-alsó) sarokpontnak és cseréljük meg az első ponttal! Poligon(N,P): Sarokpont(N,P); Rendez(N,P); Fordít(N,P) Eljárás vége. Geometriai algoritmusok 2016.01.27. 14:08 44/60
Sarokpont(N,P): s:=1 Ciklus i=2-től N-ig Ha P(i).x<P(s).x vagy P(i).x=P(s).x és P(i).y<P(s).y akkor s:=i Ciklus vége Csere(P(1),P(s)) Eljárás vége. Geometriai algoritmusok 2016.01.27. 14:08 45/60
Húzzunk (fél) egyenest a sarokpontból minden ponthoz! Rendezzük a pontokat a sarokponton áthaladó, x-tengellyel párhuzamos egyenessel bezárt szög alapján, azonos szög esetén pedig a sarokponttól vett távolság szerint! Geometriai algoritmusok 2016.01.27. 14:08 46/60
A sarokpont legyen az első, és p i előbb legyen mint p j akkor és csak akkor, ha a p 1 p i p j úton balra kell fordulni, vagy nem kell fordulni, de p i van közelebb a p 1 -hez! kisebb(q,a,b): ir:=fordul(q,a,b) kisebb:=ir=-1 vagy ir=0 és a.x<b.x Függvény vége. A rendezésnél persze elveszik a pontok régi sorszáma, azaz célszerű azt megőrizni, pl. a PONT típusba egy új mezőt, a sorszám mezőt felvéve. Geometriai algoritmusok 2016.01.27. 14:08 47/60
Rendez(N,P): Ciklus i=2-től N-1-ig min:=i Ciklus j=i+1-től N-ig Ha kisebb(p(1),p(j),p(i)) akkor min:=j Ciklus vége Csere(P(min),P(i)) Ciklus vége Eljárás vége. Geometriai algoritmusok 2016.01.27. 14:08 48/60
Fordít(N,P): Ha N>2 és Fordul(P(1),P(N),P(N-1))=0 akkor Verembe(P(N)); Fordít(N-1,P) Veremből(P(N)) Eljárás vége. Kérdés: Mit csinált a rendezés, ha az utolsó irány a függőleges, azaz a pontok x-koordinátája megegyezik? A jó megoldás: kisebb(q,a,b): ir:=fordul(q,a,b) kisebb:=ir=-1 vagy ir=0 és (a.x<b.x vagy a.x=b.x és a.y<b.y) Függvény vége. Geometriai algoritmusok 2016.01.27. 14:08 49/60
Kössük össze a pontokat a kapott sorrendben! Geometriai algoritmusok 2016.01.27. 14:08 50/60
Feladat: Adott a síkon n darab pont, amelyek nem esnek egy egyenesre. A pontok (x,y) koordinátáikkal adottak. Adjuk meg a legkisebb konvex poligont, amely az összes pontot tartalmazza! Geometriai algoritmusok 2016.01.27. 14:08 51/60
Megoldás: Első lépésként rendezzük a ponthalmazt a bal-alsó sarokpontra vett polárszög szerint, majd minden egyenesen csak a sarokponttól legtávolabbi pontot hagyjuk meg, a többit töröljük. Az így törölt pontok biztosan nem lehetnek csúcspontjai a konvex buroknak. Geometriai algoritmusok 2016.01.27. 14:08 52/60
Megoldás: Második lépésként haladjunk körbe a megmaradt pontokon! Hagyjuk el a q i+1 pontot, ha a q i q i+1 q i+2 úton nem balra kell fordulni! Ez az elv a korábban elhagyott pontokra is működik, azaz az elhagyás felesleges. Geometriai algoritmusok 2016.01.27. 14:08 53/60
A rendezésnél persze elveszik a pontok régi sorszáma, azaz célszerű azt megőrizni, pl. a PONT típusba egy új mezőt, a sorszám mezőt felvéve. Konvex burok(n,p): Sarokpont(N,P); Rendez(N,P); Fordít(N,P) P(N+1):=P(1); Körbejár(N,P) Eljárás vége. Geometriai algoritmusok 2016.01.27. 14:08 54/60
Körbejár(N,P,M,B): i:=3 Ciklus amíg Fordul(P(1),P(i-1),P(i))=0 i:=i+1 Ciklus vége B(1):=P(1); B(2):=P(i-1); M:=2 Ciklus amíg i N+1 Ha Fordul(P(B(M-1)),P(B(M)),P(i)) 0 akkor M:=M-1 különben M:=M+1; B(M):=i; i:=i+1 Ciklus vége M:=M-1 Eljárás vége. Geometriai algoritmusok 2016.01.27. 14:08 55/60
Feladat: Adott a síkon n darab pont, valamint egy további Q pont. A pontok (x,y) koordinátáikkal adottak. Adj meg egy P i, P j pontpárt úgy, hogy a Q pont a (P i,p j ) szakaszon legyen! Megoldás Osszuk két diszjunkt részhalmazba P pontjait aszerint, hogy a Q-n átmenő, x-tengellyel párhuzamos egyenes melyik oldalára esnek! Rendezzük őket óramutató járásával ellentétes irányba! Geometriai algoritmusok 2016.01.27. 14:08 56/60
Az alábbi esetben az alsó pontoknál kell továbblépni, azaz i:=i+1! Geometriai algoritmusok 2016.01.27. 14:08 57/60
Az alábbi esetben a felső pontoknál kell továbblépni, azaz j:=j+1! Megállunk, ha a Q pont rajta van az (A[i],F[j]) egyenesen, vagy ha körbeértünk. Geometriai algoritmusok 2016.01.27. 14:08 58/60
Keresés(N,P,Q,Van,i,j): Szétválogat(N,P,Q,NA,A,Aindex,NF,F,Findex) Rendez(NA,A,Aindex,Q); Rendez(NF,F,Findex,Q); i:=1; j:=1; van:=hamis Ciklus amíg i NA és j NF és nem van f:=fordul(a[i],f[j],q) Ha f<0 akkor j:=j+1 különben ha f>0 akkor i:=i+1 különben van:=igaz Ciklus vége Ha van akkor i:=aindex(i); j:=findex(j) Eljárás vége. Geometriai algoritmusok 2016.01.27. 14:08 59/60
előadás vége