Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Geometriai feladatok programozása Geometriai programozás Szlávi Péter ELTE IK Média- és Oktatásinformatika Tanszék 2010.

Hasonló előadás


Az előadások a következő témára: "Geometriai feladatok programozása Geometriai programozás Szlávi Péter ELTE IK Média- és Oktatásinformatika Tanszék 2010."— Előadás másolata:

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

2 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás2/29 Tartalom Bevezetés Alapvető típusok Pont Szakasz Pontsorozat Megvalósító modul Első feladat Második feladat Harmadik feladat         

3 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás3/29 Bevezetés A feladatok köre néhány jellemző példán keresztül… Pontok összekötése zárt, nem-metsző poligonná. P6P6 P5P5 P2P2 P1P1 P3P3 P4P4 P 1  P 5  P 2  P 6  P 3  P 4

4 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás4/29 Bevezetés 3 pont „forgásiránya”. P R Q R’

5 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás5/29 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.

6 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás6/29 Bevezetés A(z origóból) látható négyzetek (pl. megszámlálása). O

7 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás7/29 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ó

8 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás8/29 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] Eljárás Eljárás A beolvasás ellenőrzéséhez. Pl.: EgységPontE, EgységBelsőPontE

9 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás9/29 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 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]

10 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás10/29 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: _  _: TPont 2  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, alatti pontokra <0… … ha a p a 2. vagy a 3. síknegyedben van, akkor pont fordítva, azaz p  r 0

11 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás11/29 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: TPont 3  R KeresztSzorzat(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 az óra járásával ellentétes irányúak. Azaz egy egyenesre illeszkednek.

12 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás12/29 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 Eljárás Eljárás A beolvasás ellenőrzéséhez. Pl. BármilyenSzakaszE, EgységSzakaszE

13 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás13/29 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?

14 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás14/29 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?

15 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás15/29 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.ForgásIrány Alapesetek: S 1.p S 2.p S 1.q S 2.q S 1.p S 1.q S 1.p S 2.p S 2.q S 2.p S 2.q a.) b.) c.) d.) S 2.p S 2.q

16 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás16/29 Alapvető típusok – Szakasz ForgásIrány(s1.p,s1.q,s2.p)=ForgásIrány(s1.p,s1.q,s2.q) és Forgá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) és ForgásIrány(s1.p,s1.q,s2.p)=-ForgásIrány(s1.p,s1.q,s2.q) S 1.p S 2.p S 1.q S 2.q a.) S 1.q S 1.p S 2.p S 2.q b.)

17 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás17/29 Alapvető típusok – Szakasz ForgásIrány(s1.p,s1.q,s2.p)=0 és ForgásIrány(s1.p,s1.q,s2.q)  0 és Forgá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) és Forgá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? S 1.q S 1.p S 2.p S 2.q d.) S 1.p S 1.q c.) S 2.p S 2.q

18 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás18/29 Alapvető típusok – Szakasz SzakaszPárMetszéspont(Konst s1,s2:TSzakasz; Vált r:TPont) Allítás: Az s 1 _s 2 szakaszoknak az r metszéspontja, ha van metszéspontja s 1 -nek és s 2 -nek, továbbá  t i  [0..1]: r i (t i )=s i.p+t i *(s i.q–s i.p) (i=1,2): r 1 (t 1 )=r 2 (t 2 ) ekkor r:=r 1 =r 2 Innen már jön az SzakaszPárMetszéspont eljárás implemen- tálása. Hogyan? Eljárás

19 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás19/29 Alapvető típusok – Szakasz Függvény MerőlegesekE(Konst s1,s2:TSzakasz):Logikai Allítás: Ha =0, akkor s1, s2 merőlegesek egy- másra. Ahol :=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?

20 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás20/29 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: 1.  :=IránySzög(s) 2. Forgatásmátrix: FM(  )= 3. rr forgatása: rr:=(r-p)*FM(  ) 4. rr projekciója az x-tengelyre: rr.y:=0 5. VisszaForgatásMátrix: FM(-  ) 6. rr visszaforgatása: p:=rr*FM(-  )+p

21 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás21/29 Alapvető típusok – Szakasz A lépések:

22 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás22/29 Alapvető típusok – Szakasz A lépések (folytatás) : Innen már jön a Merőleges fv implementálása. Hogyan?

23 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás23/29 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!

24 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás24/29 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.

25 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás25/29 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.

26 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás26/29 Második feladat lba=P 6 P5P5 P2P2 P1P1 P3P3 P4P4 P7P7 P8P8 P9P9 P 10

27 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás27/29 Második feladat lba=P 6 P5P5 P2P2 P1P1 P3P3 P4P4 P 6  P 4  P 9  P 10  P 1  P 3  P 7  P 5  P 8  P 2  P 6 P7P7 P8P8 P9P9 P 10

28 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás28/29 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.

29 Geometriai feladatok programozása * Geometriai programozás * 2010Szlávi: Geometriai programozás29/29 Harmadik feladat Megoldásötletet az alábbi ábra mutatja: p7p7 p 6 =p 11 p5p5 p2p2 p1p1 p3p3 p4p4 P 6  [P 4  P 9  ]P 10  P 1  [P 3  P 7  ]P 5  [P 2  ]P 8  P 11 p8p8 p9p9 p 10 pp 1, pp 2, pp 3, pp 4, pp 5, pp 6


Letölteni ppt "Geometriai feladatok programozása Geometriai programozás Szlávi Péter ELTE IK Média- és Oktatásinformatika Tanszék 2010."

Hasonló előadás


Google Hirdetések