Upload
jael
View
34
Download
5
Embed Size (px)
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
Citation preview
Geometriai feladatokprogramozásaGeometriai
programozásSzlávi Pé[email protected]
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
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
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’
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.
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
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ó
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
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]
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
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.
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
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?
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?
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
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.)
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
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
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?
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
2010 Szlávi: Geometriai programozás 21/29
Geometriai feladatok programozása *
Geometriai programozás *Alapvető típusok – SzakaszA lépések:
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?
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!
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.
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.
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
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
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.
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