1 / 29

Szlávi Péter szlavip@elte.hu ELTE IK Média- és Oktatásinformatika Tanszék 2010

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.

jael
Download Presentation

Szlávi Péter szlavip@elte.hu ELTE IK Média- és Oktatásinformatika Tanszék 2010

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Szlávi Péterszlavip@elte.huELTE IK Média- és Oktatásinformatika Tanszék 2010

  2. 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

  3. P2 P6 P5 P3 P4 P1 P1P5  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

  4. R’ Q P R Bevezetés • 3 pont „forgásiránya”. Szlávi: Geometriai programozás

  5. 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

  6. O Bevezetés • A(z origóból) látható négyzetek (pl. megszámlálása). Szlávi: Geometriai programozás

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

  8. 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

  9. 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

  10. 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: _  _: TPont2R; p1p2:=p1.x*p2.y-p2.x*p1.y A p1p2 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 pr>0, alatti pontokra <0… … ha a p a 2. vagy a 3. síknegyedben van, akkor pont fordítva, azaz pr<0, alatti pontokra >0 Szlávi: Geometriai programozás

  11. Alapvető típusok – Pont • Függvény ForgásIrány(Konst p,q,r:TPont):{–1,0,+1} [pqr balforgású, kollineáris, jobbforgású esetben] Megközelítése: KeresztSzorzat: TPont3RKeresztSzorzat(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

  12. 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

  13. 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.y0 (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.y0 (az 1. sn.-ben) 4. Irányszög(sz)=–arc(R’), ha R.x<0 és R.y0 (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

  14. Alapvető típusok – Szakasz • Függvény SzakaszonE(Konst s:TSzakasz; r:TPont):Logikai Állítás: p,q,rTPont egy egyenesen vannak  KeresztSzorzat(p,q,r)=0 Állítás: ha p,q,rTPont 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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

  21. Alapvető típusok – Szakasz A lépések: Szlávi: Geometriai programozás

  22. 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

  23. 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

  24. 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

  25. 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

  26. P8 P2 lba=P6 P5 P7 P3 P4 P9 P10 P1 Második feladat Szlávi: Geometriai programozás

  27. P8 P2 lba=P6 P5 P7 P3 P4 P9 P10 P1 P6P4P9P10P1P3P7P5P8P2P6 Második feladat Szlávi: Geometriai programozás

  28. 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

  29. p8 p2 p6=p11 p5 p7 p3 p4 p9 p10 p1 P6[P4P9]P10P1[P3P7 ]P5[P2]P8P11 pp1, pp2, pp3, pp4, pp5, pp6 Harmadik feladat • Megoldásötletet az alábbi ábra mutatja: Szlávi: Geometriai programozás

More Related