Konvexa höljet Laboration 6 — GruDat, DD1344
Short Description
Download Konvexa höljet Laboration 6 — GruDat, DD1344...
Description
Konvexa h¨oljet Laboration 6 — GruDat, DD1344 ¨ Orjan Ekeberg 10 december 2008 M˚ als¨ attning Denna laboration ska ge dig ¨ ovning i att implementera en algoritm utg˚ aende fr˚ an en beskrivning av algoritmen. Du ska f˚ a insikt i hur man kan manipulera geometriska objekt som punkter, linjer och polygoner. Du kommer ocks˚ a att f˚ a prova p˚ a att anv¨ anda enkel grafik f¨ or att visualisera resultatet av din algoritm.
1
Uppgiften
Du ska skriva ett program som r¨aknar ut det konvexa h¨ oljet f¨or en punktm¨angd. Punkterna l¨ aser du in fr˚ an filen sweden.txt d¨ar varje rad inneh˚ aller tv˚ a tal som ska tolkas som x- och y-koordinater. Det konvexa h¨ oljet ¨ ar den minsta konvexa polygonen d¨ar ingen punkt ligger utanf¨ or. Figur 1 visar ett exempel. Det konvexa h¨oljet till en m¨angd punkter i planet kan ber¨ aknas med en algoritm som kallas Graham-Scan. Din uppgift ar att implementera denna algoritm och anv¨anda den f¨or att hitta och rita ut ¨ det konvexa h¨ oljet till punkterna i filen.
Figur 1: Konvexa h¨ oljet till en punktm¨angd i planet. Det konvexa h¨oljet ¨ar en polygon som byggs upp av en delm¨angd av punkterna. 1
2
Algoritmen
Graham-Scan g˚ ar till p˚ a f¨oljande s¨att: 1. L˚ at p0 vara den punkt som har minst x-koordinat. Om fler har samma x-koordinat, v¨alj den (av dessa) som har st¨orst ykoordinat. 2. L˚ at [p1 , p2 , . . . , pn ] vara resten av punkterna, ordnade motsols runt punkten p0 . 3. L¨ agg in punkterna p0 , p1 och p2 i en stack s. 4. F¨ or varje punkt p i {p3 , p4 , . . . , pn } • S˚ a l¨ ange punkten ¨overst p˚ a s ligger till v¨anster om linjen fr˚ an punkten n¨ ast ¨ overst p˚ a s till p s˚ a ta bort stackens ¨oversta element. • L¨ agg in p p˚ a stacken. 5. Returnera punkterna i s Steg 1 garanterar att punkten p0 a¨r en punkt som kommer att tillh¨ora l¨ osningen. Steg 2 kr¨ aver att punkterna sorteras efter stigande vinkel f¨or linjen fr˚ an p0 till den aktuella punkten (se figur 2). Huvuddelen av algoritmen a¨r loopen i steg 4. Hur den fungerar illustreras i figur 3.
p7 p6
p5 p4
p0 p2
p3
p1 Figur 2: Punkterna p1 , p2 , . . . , pn sorteras efter stigade vinkel p˚ a linjen som utg˚ ar fr˚ an p0 . 2
p7
A p6 p0
p5
p2
p6
p4
p0
p3
p1
p7 p6
p2
p4 p3
p7
D p5
p2
p6
p4
p0
p3
p1
p5
p2
p4 p3
p1
p7
E p6 p0
p5
p1
C p0
p7
B
p2
p7
F p5
p6
p4
p0
p3
p1
p2
p5
p4 p3
p1
Figur 3: Bilderna illustrerar hur Graham-Scan algoritmen succesivt bygger polygonen. F¨ orst (A) uppt¨ acker man att punkten p2 ligger till v¨anster om linjen fr˚ an p1 till p3 . p2 plockas d¨ arf¨or bort fr˚ an stacken innan p3 l¨aggs in. I n¨asta steg (B) konstateras att p3 ligger till h¨oger om linjen p1 → p4 . p3 l¨amnas d¨arf¨or kvar p˚ a stacken n¨ ar p4 l¨ aggs in. I steg C j¨amf¨ors p4 med linjen p3 → p5 och eftersom punkten ligger till h¨oger om linjen s˚ a l¨amnas den kvar p˚ a stacken. I D j¨ amf¨ ors p5 med linjen p4 → p6 och ¨aven h¨ar ligger punkten till h¨oger om linjen. I n¨ asta steg (E) plockas f¨ orst punkten p6 bort eftersom den ligger till v¨anster om p5 → p7 , men h¨ ar plockas ¨aven p5 bort eftersom den ligger till v¨anster om p4 → p7 . Den slutliga l¨ osningen utg¨ors av punkterna som finns kvar p˚ a stacken n¨ ar alla punkter behandlats (F).
3
3
Hj¨ alpfunktioner
Graham-Scan anv¨ ander sig av en ˚ aterkommande test: befinner sig en punkt p till v¨ anster om en linje p0 → p1 ? Detta unders¨oker man enklast (och s¨akrast) genom att ber¨ akna kryssprodukten av vektorerna p0 → p och p0 → p1 och avg¨ ora om denna ¨ ar positiv eller ej. Kryssprodukten mellan tv˚ a vektorer a och b i planet r¨ aknas enkelt ut som ax by − ay bx . Skriv en hj¨alpfunktion som tar tre punkter och returnerar True om den f¨orsta punkten ligger till v¨anster om linjen fr˚ an den andra till den tredje. F¨ or att kunna sortera punkterna i vinkelordning beh¨over man r¨akna ut vinkeln f¨ or en vektor. H¨ ar ¨ ar det l¨ampligt att utnyttja funktionen math.atan2(y, x) som ger vinkeln (i radianer) fr˚ an origo till punkten (x, y). F¨or att sorteringen ska fungera ¨ ar det viktigt att vinkelber¨akningarna inte pl¨otsligt g¨or ett hopp p˚ a 2π. Genom att utg˚ a fr˚ an punkten med minst x-koordinat ¨ar vi garanterade att a detta alla vinklar ligger mellan − π2 och π2 . math.atan2 g¨or sitt “hopp” vid π s˚ b¨ or vara s¨ akert.
4
Implementera Graham-Scan
Implementera nu de funktioner som beh¨ovs f¨or att r¨akna ut vilken polygon som utg¨ or det konvexa h¨ oljet till punkterna i filen sweden.txt. F¨or sorteringen kan du med f¨ ordel utnyttja den inbyggda funktionen sorted. L¨agg m¨arke till att sorted kan ta en extraparameter (en s.k. nyckelordsparameter) i form av en funktion som plockar fram den nyckel man vill sortera efter; i v˚ art fall vinkeln. Sorteringen kan d¨ arf¨ or g¨oras p˚ a detta s¨att: def myKey( p o i n t ) : return angleBetween ( o r i g i n , p o i n t ) origin = p [0] v = s o r t e d ( p [ 1 : ] , key=myKey)
4
5
Sk¨ oldpaddsgrafik
Under 1960-talet utvecklades ett experimentellt programmeringsspr˚ ak Logo speciellt f¨ or att l¨ ara barn programmering. Logo introducerade en speciell sorts grafik kallad Turtle Graphics, d¨ ar namnet syftar p˚ a den typ av figurer som skapas n¨ar sk¨ oldpaddor g˚ ar omkring p˚ a en sandstrand. Python har en modul turtle som implementerar denna typ av grafik. Prova g¨ arna f¨ oljande: import t u r t l e turtle turtle turtle turtle turtle turtle turtle turtle turtle
. down ( ) . goto (100 , 0) . up ( ) . goto (50 , 0) . down ( ) . c i r c l e (10) . c o l o r ( ’ blue ’ ) . right (90) . forward (20)
H¨ ar ¨ ar ett urval av de funktioner som finns: down up goto right forward circle color speed tracer
S¨ank pennan Lyft pennan G˚ a till angivna koordinater Sv¨ang h¨oger G˚ a fram˚ at G˚ a runt Byt f¨arg p˚ a pennan Trimma sk¨oldpaddan Animerad uppritning p˚ a/av
Mer information f˚ ar du genom help(turtle) i Python, bl.a. hur du fyller ytor och skriver text. Anv¨ and sk¨ oldpaddsgrafik f¨or att rita ut alla punkterna och det konvexa h¨ oljet. Anv¨ and t.ex. sm˚ a cirklar f¨or punkterna och linjer f¨or det konvexa h¨oljet. Rita g¨ arna lite st¨ orre cirklar f¨or de punkter som ing˚ ar i h¨oljet. Sk¨ oldpaddsgrafiken ¨ ar fr˚ an b¨orjan inst¨alld att rita l˚ angsamt f¨or att man ska hinna se vad som h¨ ander. Om du tycker att tempot ¨ar lite v¨al l˚ agt kan du oka sk¨ oldpaddans fart genom turtle .speed(’ fastest ’ ). Alternativt kan du helt ¨ st¨ anga av animeringen under uppritningen genom turtle . tracer (False).
5
6 6.1
Extrauppgift f¨ or h¨ ogre betyg St¨ orsta avst˚ andet
N¨ ar man har det konvexa h¨ oljet kan man anv¨anda detta f¨or att snabbt (O(n)) r¨ akna ut det st¨ orsta avst˚ andet mellan tv˚ a punkter i den ursprungliga punktm¨ angden. En brute force algoritm som ber¨aknar alla parvisa avst˚ and kommer att kr¨ava O(n2 ) tid. F¨ or att komma ned till O(n) m˚ aste man vara smartare. En id´e ¨ar att stega igenom polygonen med en variabel medan man samtidigt i en annan variabel h˚ aller reda p˚ a vilken punkt i polygonen som ligger l¨angst bort. Anv¨ and denna id´e f¨ or att skriva en funktion som r¨aknar ut vilka tv˚ a punkter som ligger l¨ angst ifr˚ an varandra. Rita en linje mellan dessa punkter (g¨arna med en annan f¨ arg).
N¨ ar du ¨ ar klar med laborationen: redovisa f¨or en handledare och f¨ors¨ok att f˚ a en kvittens h¨ ar. Ditt namn: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handledarens signatur: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dagens datum: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extrauppgift genomf¨ ord: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GruDat 2008, Laboration 6
6
View more...
Comments