Szlávi Péter [email protected] ELTE IK Média- és Oktatásinformatika Tanszék 2010

29
Geometriai feladatok programozása Geometriai programozás Szlávi Péter [email protected] ELTE IK Média- és Oktatásinformatika Tanszék 2010

description

Szlávi Péter [email protected] 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. - PowerPoint PPT Presentation

Transcript of Szlávi Péter [email protected] ELTE IK Média- és Oktatásinformatika Tanszék 2010

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

Geometriai feladatokprogramozásaGeometriai

programozásSzlávi Pé[email protected]

ELTE IK Média- és Oktatásinformatika Tanszék

2010

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

2010 Szlávi: Geometriai programozás 2/29

Geometriai feladatok programozása *

Geometriai programozás *

Tartalom Bevezetés Alapvető típusok

Pont Szakasz Pontsorozat Megvalósító modul

Első feladat Második feladat Harmadik feladat

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

2010 Szlávi: Geometriai programozás 3/29

Geometriai feladatok programozása *

Geometriai programozás *

Bevezetés A feladatok köre néhány jellemző példán

keresztül… Pontok összekötése zárt, nem-metsző

poligonná.

P6P5

P2

P1

P3

P4

P1P5 P2 P6 P3 P4

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

2010 Szlávi: Geometriai programozás 4/29

Geometriai feladatok programozása *

Geometriai programozás *

Bevezetés 3 pont „forgásiránya”.

P

R

Q

R’

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

2010 Szlávi: Geometriai programozás 5/29

Geometriai feladatok programozása *

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.

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

2010 Szlávi: Geometriai programozás 6/29

Geometriai feladatok programozása *

Geometriai programozás *

Bevezetés A(z origóból) látható négyzetek (pl.

megszámlálása).

O

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

2010 Szlávi: Geometriai programozás 7/29

Geometriai feladatok programozása *

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ó

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

2010 Szlávi: Geometriai programozás 8/29

Geometriai feladatok programozása *

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]

EljárásEljárás

EljárásEljárás

A beolvasás A beolvasás ellenőrzéséhez. Pl.: ellenőrzéséhez. Pl.:

EgységPontE, EgységPontE, EgységBelsőPontEEgységBelsőPontE

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

2010 Szlávi: Geometriai programozás 9/29

Geometriai feladatok programozása *

Geometriai programozás *

FP-ban:FP-ban:Operator =(Const Operator =(Const p,q:TPont)p,q:TPont)

ll:Boolean;:Boolean;////ll kapja értékül –az kapja értékül –az operátor tör-zsében– az operátor tör-zsében– az operáció végeredmé-nyétoperá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]

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

2010 Szlávi: Geometriai programozás 10/29

Geometriai feladatok programozása *

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:

_ _: TPont2 R; 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. Ha a p az 1. vagy a 4. síknegyedben van, síknegyedben van,

akkor az o_p-re akkor az o_p-re illeszkedő egyenes illeszkedő egyenes feletti pontokra a feletti pontokra a

ppr>0, alatti r>0, alatti pontokra <0…pontokra <0…

… … ha a p a 2. vagy a ha a p a 2. vagy a 3. síknegyedben van, 3. síknegyedben van, akkor pont fordítva, akkor pont fordítva, azaz pazaz pr<0, alatti r<0, alatti

pontokra >0 pontokra >0

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

2010 Szlávi: Geometriai programozás 11/29

Geometriai feladatok programozása *

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: 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 az óra Azaz az óra járásával járásával ellentétes ellentétes irányúak.irányúak.

Azaz egy Azaz egy egyenesre egyenesre

illeszkednek.illeszkednek.

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

2010 Szlávi: Geometriai programozás 12/29

Geometriai feladatok programozása *

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

EljárásEljárás

EljárásEljárás

A beolvasás ellenőrzéséhez. A beolvasás ellenőrzéséhez. Pl. BármilyenSzakaszE, Pl. BármilyenSzakaszE,

EgységSzakaszEEgységSzakaszE

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

2010 Szlávi: Geometriai programozás 13/29

Geometriai feladatok programozása *

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), akkor1. 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?

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

2010 Szlávi: Geometriai programozás 14/29

Geometriai feladatok programozása *

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?

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

2010 Szlávi: Geometriai programozás 15/29

Geometriai feladatok programozása *

Geometriai programozás *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:

S1.p

S2.pS1.qS2.q

S1.p

S1.q

S1.q

S1.q

S1.p

S1.p

S2.p

S2.q

S2.p

S2.q

a.) b.)

c.) d.)

S2.p S2.q

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

2010 Szlávi: Geometriai programozás 16/29

Geometriai feladatok programozása *

Geometriai programozás *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)

S1.p

S2.pS1.qS2.q

a.)

S1.q

S1.p

S2.p

S2.q

b.)

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

2010 Szlávi: Geometriai programozás 17/29

Geometriai feladatok programozása *

Geometriai programozás *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) é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?

S1.q

S1.p

S2.p

S2.q

d.)

S1.p

S1.q

c.)

S2.p S2.q

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

2010 Szlávi: Geometriai programozás 18/29

Geometriai feladatok programozása *

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ásEljárás

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

2010 Szlávi: Geometriai programozás 19/29

Geometriai feladatok programozása *

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?

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

2010 Szlávi: Geometriai programozás 20/29

Geometriai feladatok programozása *

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:

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

cossinsincos

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

2010 Szlávi: Geometriai programozás 21/29

Geometriai feladatok programozása *

Geometriai programozás *Alapvető típusok – SzakaszA lépések:

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

2010 Szlávi: Geometriai programozás 22/29

Geometriai feladatok programozása *

Geometriai programozás *Alapvető típusok – SzakaszA lépések (folytatás):

Innen már jön a Merőleges fv implementálása. Hogyan?

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

2010 Szlávi: Geometriai programozás 23/29

Geometriai feladatok programozása *

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!

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

2010 Szlávi: Geometriai programozás 24/29

Geometriai feladatok programozása *

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égeProgram vége.

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

2010 Szlávi: Geometriai programozás 25/29

Geometriai feladatok programozása *

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.

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

2010 Szlávi: Geometriai programozás 26/29

Geometriai feladatok programozása *

Geometriai programozás *

Második feladat

lba=P6

P5

P2

P1

P3

P4

P7

P8

P9

P10

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

2010 Szlávi: Geometriai programozás 27/29

Geometriai feladatok programozása *

Geometriai programozás *

Második feladat

lba=P6P5

P2

P1

P3

P4

P6P4P9P10P1P3P7P5P8P2P6

P7

P8

P9

P10

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

2010 Szlávi: Geometriai programozás 28/29

Geometriai feladatok programozása *

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.

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

2010 Szlávi: Geometriai programozás 29/29

Geometriai feladatok programozása *

Geometriai programozás *

Harmadik feladat Megoldásötletet az alábbi ábra mutatja:

p7

p6=p11p5

p2

p1

p3

p4

P6[P4P9]P10P1[P3P7 ]P5[P2]P8P11

p8

p9

p10

pp1, pp2, pp3, pp4, pp5, pp6