Konvexa höljet Laboration 6 — GruDat, DD1344

January 8, 2018 | Author: Anonymous | Category: Math, Trigonometry
Share Embed Donate


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

Copyright � 2017 NANOPDF Inc.
SUPPORT NANOPDF