290 likes | 430 Views
Szlávi Péter szlavip@elte.hu ELTE IK Média- és Oktatásinformatika Tanszék 2010. Bevezetés Alapvető típusok Pont Szakasz Pontsorozat Megvalósító modul Első feladat Második feladat Harmadik feladat. . Tartalom. P 2. P 6. P 5. P 3. P 4. P 1.
E N D
Szlávi Péterszlavip@elte.huELTE IK Média- és Oktatásinformatika Tanszék 2010
Bevezetés Alapvető típusok Pont Szakasz Pontsorozat Megvalósító modul Első feladat Második feladat Harmadik feladat Tartalom Szlávi: Geometriai programozás
P2 P6 P5 P3 P4 P1 P1P5 P2 P6 P3 P4 Bevezetés • A feladatok köre néhány jellemző példán keresztül… • Pontok összekötése zárt, nem-metsző poligonná. Szlávi: Geometriai programozás
R’ Q P R Bevezetés • 3 pont „forgásiránya”. Szlávi: Geometriai programozás
Bevezetés • Egy pont adott poligon belső pontja-e? • Egy pont adott szakaszra illeszkedik-e? • 2 szakasz metsző-e? Ha igen, mi a metszéspontjuk? • Ponthalmaz konvex burka. Szlávi: Geometriai programozás
O Bevezetés • A(z origóból) látható négyzetek (pl. megszámlálása). Szlávi: Geometriai programozás
Alapvető típusok • A tipikus geometriai feladat megoldása az alábbi típusú adatokkal szervezhető meg: • Pont • Szakasz = 2 (vég)pont • Pontsorozat = sok, adott sorrendű pont • Mint a típusok megadásánál lenni szokott, definiálni kell a(z): • ábrázolást – reprezentáció • művelethalmazt – implementáció Szlávi: Geometriai programozás
Alapvető típusok – Pont • Pont • Ábrázolás: • TPont=Rekord(x,y:Valós) • TJóPontE=Függvény(Konst p:TPont):Logikai • Művelethalmaz: • PontKiirás(Konst kezd:Szöveg, p:TPont, zár:Szöveg) [kezd és zár között formázva jeleníti meg a pont koordinátáit; lehetővé téve az egy sorba és a külön sorba szervezést] • PontBeolvasás(Konst kérd:Szöveg,Vált p:TPont, Konst OlyanE:TJóPontE):Logikai[az OlyanE fv állapítja meg, hogy megfelelő-e a beolvasott pont] A beolvasás ellenőrzéséhez. Pl.: EgységPontE, EgységBelsőPontE Eljárás Eljárás Szlávi: Geometriai programozás
Alapvető típusok – Pont • Operátor =(Konst p,q:TPont):Logikai • Operátor +(Konst p,q:TPont):TPont • Operátor –(Konst p,q:TPont):TPont • Operátor *(Konst p:TPont, a:Valós):TPont[’p’ vektor az ’a’ skalárral való jobbról szorzata] • Operátor *(Konst a:Valós, p:TPont):TPont[’p’ vektor az ’a’ skalárral való balról szorzata] • Függvény Norma(Konst p:TPont):Valós[euklideszi-normája, azaz az origótól számított távolsága] FP-ban: Operator =(Const p,q:TPont)l:Boolean;//l kapja értékül –az operátor tör-zsében– az operáció végeredmé-nyét Szlávi: Geometriai programozás
Alapvető típusok – Pont • Operátor *(Konst p,q:TPont):Valós[ez a matematikában szokásos 2-változós keresztszorzat művelet: _ _: TPont2R; p1p2:=p1.x*p2.y-p2.x*p1.y A p1p2 művelet a (,p1,p2,p1+p2) pontok által kijelölt paralelogramma előjeles területét adja.] Tulajdonságai az alábbi ábra alapján kideríthetők: Ha a p az 1. vagy a 4. síknegyedben van, akkor az o_p-re illeszkedő egyenes feletti pontokra a pr>0, alatti pontokra <0… … ha a p a 2. vagy a 3. síknegyedben van, akkor pont fordítva, azaz pr<0, alatti pontokra >0 Szlávi: Geometriai programozás
Alapvető típusok – Pont • Függvény ForgásIrány(Konst p,q,r:TPont):{–1,0,+1} [pqr balforgású, kollineáris, jobbforgású esetben] Megközelítése: KeresztSzorzat: TPont3RKeresztSzorzat(p,q,r):=(q-p)(r-p)= =(q.y-p.y)*(r.x-p.x)-(r.y-p.y)*(q.x-p.x) Állítás: Ha a KeresztSzorzat(p,q,r)>0 , akkor a KeresztSzorzat(p,q,r’)<0, ahol r’ az r tükörképe a p_q-ra illeszkedő egyenesre nézve. Innen már jön a ForgásIrány fv implementálása. Hogyan? Azaz egy egyenesre illeszkednek. Azaz az óra járásával ellentétes irányúak. Szlávi: Geometriai programozás
Alapvető típusok – Szakasz • Szakasz • Ábrázolás: • TSzakasz=Rekord(p[=kezdőpont],q[=végpont]:TPont) • TJóSzakaszE=Függvény(Konst sz:TSzakasz):Logikai • Művelethalmaz: • SzakaszKiírás(Konst kezd:Szöveg, s:TSzakasz, zár:Szöveg)[kezd és zár között formázva jeleníti meg a pont koordinátáit; lehetővé téve az egy sorba és a külön sorba szervezést] • SzakaszBeolvasás(Konst kérd:Szöveg, Vált s:TSzakasz,Konst OlyanE:TJóSzakaszE):Logikai[az OlyanE állapítja meg, hogy megfelelő-e a beolvasott szakasz] • Függvény Hossz(Konst s:TSzakasz):Valós A beolvasás ellenőrzéséhez. Pl. BármilyenSzakaszE, EgységSzakaszE Eljárás Eljárás Szlávi: Geometriai programozás
Alapvető típusok – Szakasz • Operátor =(Konst s1,s2:TSzakasz):Logikai[egyenlők-e: hosszuk és irányuk megegyezik-e] • Függvény Irányszög(Konst s:TSzakasz):Valós Az s szakaszhoz jelölje R:=s.q-s.p:TPont „irányvektort”, arc(R):=arcTg(R.y/R.x), akkor 1. Irányszög(sz)=/2, ha R.x=0 és R.y0 (az „Y-tengelyen felfelé”) 2. Irányszög(sz)=3*/2, ha R.x=0 és R.y<0 (az „Y-tengelyen lefelé”) 3. Irányszög(sz)=arc(R), ha R.x>0 és R.y0 (az 1. sn.-ben) 4. Irányszög(sz)=–arc(R’), ha R.x<0 és R.y0 (a 2. sn.-ben), ahol R’:=(-R.x,R.y) [azaz az R 1. sn.-beli „tükörképe”] 5. Irányszög(sz)=+arc(R), ha R.x<0 és R.y<0 (a 3. sn.-ben) 6. Irányszög(sz)=2*–arc(R’), ha R.x>0 és R.y<0 (a 4. sn.-ben), ahol R’:=(R.x,-R.y) [azaz az R 1. sn.-beli „tükörképe”] Innen már jön az Irányszög fv implementálása. Hogyan? Szlávi: Geometriai programozás
Alapvető típusok – Szakasz • Függvény SzakaszonE(Konst s:TSzakasz; r:TPont):Logikai Állítás: p,q,rTPont egy egyenesen vannak KeresztSzorzat(p,q,r)=0 Állítás: ha p,q,rTPont egy egyenesen vannak és r.x[Min(p.x,q.x)..Max(p.x,q.x)], r.y[Min(p.y,q.y)..Max(p.y,q.y)] akkor az r a p_q szakaszon. Innen már jön az SzakaszonE fv implementálása. Hogyan? Szlávi: Geometriai programozás
S1.q S2.p S2.p S2.q S2.q S1.q S1.p S1.p a.) b.) S1.q S1.q S2.p S2.p S2.q S2.q S1.p S1.p c.) d.) Alapvető típusok – Szakasz • Függvény SzakaszPárMetszőE(Konst s1,s2:TSzakasz):Logikai Állítás: A szakaszok metszőség-vizsgálatát a ForgásIrány-vizsgálatra lehet alapozni. Alapesetek: Szlávi: Geometriai programozás
S1.q S2.p S2.q S1.p a.) S2.p S2.q S1.q S1.p b.) Alapvető típusok – Szakasz ForgásIrány(s1.p,s1.q,s2.p)=ForgásIrány(s1.p,s1.q,s2.q) ésForgásIrány(s2.p,s2.q,s1.p)=ForgásIrány(s2.p,s2.q,s1.q) ForgásIrány(s2.p,s2.q,s1.p)=ForgásIrány(s2.p,s2.q,s1.q) ésForgásIrány(s1.p,s1.q,s2.p)=-ForgásIrány(s1.p,s1.q,s2.q) Szlávi: Geometriai programozás
S1.q S2.p S2.q S1.p d.) S1.q S2.p S2.q S1.p c.) Alapvető típusok – Szakasz ForgásIrány(s1.p,s1.q,s2.p)=0 ésForgásIrány(s1.p,s1.q,s2.q)0ésForgásIrány(s2.p,s2.q,s1.p)=-ForgásIrány(s2.p,s2.q,s1.q) ForgásIrány(s2.p,s2.q,s1.p)=-ForgásIrány(s2.p,s2.q,s1.q) ésForgásIrány(s2.p,s2.q,s1.p)=-ForgásIrány(s2.p,s2.q,s1.q) Innen már jön az SzakaszPárMetszőE fv implemen-tálása. Hogyan? Szlávi: Geometriai programozás
Alapvető típusok – Szakasz • SzakaszPárMetszéspont(Konst s1,s2:TSzakasz; Vált r:TPont) Allítás: Az s1_s2 szakaszoknak az r metszéspontja, ha van metszéspontja s1-nek és s2-nek, továbbáti[0..1]: ri(ti)=si.p+ti*(si.q–si.p) (i=1,2): r1(t1)=r2(t2) ekkor r:=r1=r2 Innen már jön az SzakaszPárMetszéspont eljárás implemen-tálása. Hogyan? Eljárás Szlávi: Geometriai programozás
Alapvető típusok – Szakasz • Függvény MerőlegesekE(Konst s1,s2:TSzakasz):Logikai Allítás: Ha <s1.q–s1.p,s2.q–s2.p>=0, akkor s1, s2 merőlegesek egy-másra. Ahol <Q,R>:=Q.x*R.x+Q.y*R.y [az a „két vektor skaláris szorzata” művelet]. Innen már jön a MerőlegesekE fv implementálása. Hogyan? Szlávi: Geometriai programozás
Alapvető típusok – Szakasz • Függvény Merőleges(Konst s:TSzakasz, r:TPont):TSzakasz [Uf: az s szakaszt tartalmazó egyenesre merőleges szakasz, amely egyik végpontja az r] Allítás: Az r-en átmenő s-re merőleges egyenest a következő lépésekben kaphatjuk meg: • :=IránySzög(s) • Forgatásmátrix: FM()= • rr forgatása: rr:=(r-p)*FM() • rr projekciója az x-tengelyre: rr.y:=0 • VisszaForgatásMátrix: FM(-) • rr visszaforgatása: p:=rr*FM(-)+p Szlávi: Geometriai programozás
Alapvető típusok – Szakasz A lépések: Szlávi: Geometriai programozás
Alapvető típusok – Szakasz A lépések (folytatás): Innen már jön a Merőleges fv implementálása. Hogyan? Szlávi: Geometriai programozás
Alapvető típusok – Pontsorozat • Pontsorozat • Ábrázolás: • Konstans MaxN:Egész(???)TPontSor=Rekord(db:Egész, pontok:Tömb(1..MaxN:TPont)) • Művelethalmaz: • Konstans UresPontSor:TPontSor(db:0,pontok:) • Függvény ElemSzám(Konst ps:TPontSor):Egész • Operátor +(Konst ps:TPontSor, p:TPont):TPontSor[bővíti a pontsort újabb ponttal, ha lehet] Készítse el a geometriai típusok teljes, egyesített modulját (GeomUnit), majd egy tesztelő programot GeomUnit-hoz! Szlávi: Geometriai programozás
Első feladat (ujjgyakorlat) • A fenti típusok műveleteinek gyakorlásaként adjuk meg két szakasz metszéspontját, ha van! • Legfelsőbb szint: Program SzakaszMetszésPont_keresés:Konstans CrLf=Karakter(10)+Karakter(13) Változó s1,s2:TSzakasz r:TPont OK:Logikai OK:=SzakaszBeolvasás('Adja meg az S1 szakaszt!',s1, BármilyenSzakaszE) OK:=SzakaszBeolvasás('Adja meg az S2 szakaszt!',s2, BármilyenSzakaszE) Ha SzakaszParMetszőE(s1,s2) akkor SzakaszPárMetszéspont(s1,s2,r) PontKiírás('Van metszéspontjuk, mégpedig:',r,CrLf) különben Ki: 'Nincs metszéspontjuk.' Elágazás vége Program vége. Szlávi: Geometriai programozás
Második feladat • Adott N darab (nem kollineáris) pont. Adjuk meg a pontok olyan sorrendjét, amelyben az egymást köve-tőket, és az utolsót az elsővel összekötve zárt, nem-metsző poligont kapunk! • Megoldásötlet: a ponthalmaz pontjainak egy alkalmas sorrendjét kapjuk, ha a legbaloldalibb-legalsó pontból „nézve” iránytangensük szerint rendezzük. Szlávi: Geometriai programozás
P8 P2 lba=P6 P5 P7 P3 P4 P9 P10 P1 Második feladat Szlávi: Geometriai programozás
P8 P2 lba=P6 P5 P7 P3 P4 P9 P10 P1 P6P4P9P10P1P3P7P5P8P2P6 Második feladat Szlávi: Geometriai programozás
Harmadik feladat • Adott N darab (nem kollineáris) pont. Adjuk meg a pontok konvex burkát! • Megoldásötlet: • az előző feladat megoldása (a ponthalmaz pontjainak egy alkalmas sorrendjét kapjuk, ha a legbaloldalibb-legalsó pontból „nézve” iránytangen-sük szerint rendezzük) után, • (balsodrásúan) sorra vesszük az egyes pontokat, és megpró-báljuk bővíteni velük a burkot, ha egy pontnál az előző kettő ponttal együtt jobbsodrásúvá válik (azaz konkávvá), ak-kor az előző pontot eldobjuk és újra értékeljük a helyzetet. Szlávi: Geometriai programozás
p8 p2 p6=p11 p5 p7 p3 p4 p9 p10 p1 P6[P4P9]P10P1[P3P7 ]P5[P2]P8P11 pp1, pp2, pp3, pp4, pp5, pp6 Harmadik feladat • Megoldásötletet az alábbi ábra mutatja: Szlávi: Geometriai programozás