Konvexa höljet Laboration 6 GruDat, DD1344

Relevanta dokument
Extramaterial till Matematik Y

Area och volym Punktposition Konvexa höljet. Geometri. Douglas Wikström KTH Stockholm

Abstrakta datatyper Laboration 2 GruDat, DD1344

Föreläsning 11: Beräkningsgeometri

Aktiviteter Del 4. h succesivt anta mindre värden, som till exempel π. , och låta programmet summera sekanternas längder från x = a till x = b.

Vektorgeometri för gymnasister

Linjär Algebra, Föreläsning 2

Polygoner. Trianglar på tre sätt

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Problemlösning och funktioner Grundkurs i programmering med Python

Använda Python Laboration 1 GruDat, DD1344

MATEMATIK GU. LLMA60 MATEMATIK FÖR LÄRARE, GYMNASIET Analys, ht Block 5, översikt

Tentamen TNM061, 3D-grafik och animering för MT2. Onsdag 20/ kl SP71. Inga hjälpmedel

Robotarm och algebra

Sortering. Brute-force. Sortering Ordna element enligt relation mellan nyckelvärden

SF1624 Algebra och geometri

729G04 Programmering och diskret matematik. Föreläsning 4

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Uppgift 1 ( Betyg 3 uppgift )

TAIU07 Matematiska beräkningar med Matlab

Extramaterial till Matematik Y

Några saker till och lite om snabbare sortering

729G04 Programmering och diskret matematik TEN kl 8-12

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Elevuppgift: Bågvinkelns storlek i en halvcirkel

Tenta (TEN3) i kursen 729G04 Programmering och diskret matematik 5 feb 2016, kl 14:00-18:00

Objektorienterad Programkonstruktion

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

3.0. Tips och Trix Sida 1 av 18

Institutionen för matematik och datavetenskap Karlstads universitet. GeoGebra. ett digitalt verktyg för framtidens matematikundervisning

Kojo med Inga Ingenjör. Lär dig programmera Nybörjaruppdrag

Sätt att skriva ut binärträd

TANA17 Matematiska beräkningar med Matlab

Lab5 för prgmedcl04 Grafik

Börja med att kopiera källkoden till din scheme-katalog (som du skapade i Laboration 1).

Kojo med Inga Ingenjör

P Q = ( 2, 1, 1), P R = (0, 1, 0) och QR = (2, 2, 1). arean = 1 2 P Q P R

LABORATION 4 OBJEKTORIENTERAD PROGRAMMERING I C++ I

c d Z = och W = b a d c för några reella tal a, b, c och d. Vi har att a + c (b + d) b + d a + c ac bd ( ad bc)

LNC Lösningar

Programmering. Scratch - grundövningar

Extramaterial till Matematik Y

Läsöversikt. Föreläsningar 2-6. Genomförande av laborationer

Lösningar till udda övningsuppgifter

Index. Vektorer och Elementvisa operationer. Summor och Medelvärden. Grafik i två eller tre dimensioner. Ytor. 20 januari 2016 Sida 1 / 26

{ 1, om i = j, e i e j = 0, om i j.

Föreläsning 12. Söndra och härska

Sökning i ordnad lista. Sökning och sortering. Sökning med vaktpost i oordnad lista

Föreläsning 9-10 Innehåll

Programmering F-3. -dansprogrammering. Del 1

Undersökande arbetssätt i matematik 1 och 2

Affina avbildningar och vektorgrafik

TDP002 Imperativ programmering. Laborationsmaterial emacs python-mode

Laboration 3 GUI-programmering

Grundläggande Datalogi

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Veckoblad 1, Linjär algebra IT, VT2010

Laboration 1: Figurer i hierarki

Geometriska transformationer

Vad är algoritmer? Lektionen handlar om att få en grundläggande förståelse för vad en algoritm är. Vad är algoritmer?

Exempel på användning av arv: Geometriska figurer

SF1624 Algebra och geometri

Exempel :: Spegling i godtycklig linje.

1 Vektorer i koordinatsystem

Övning 1 - Abstrakta datatyper

Linjär Algebra, Föreläsning 2

Parabeln och vad man kan ha den till

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Saker du ska kunna Föreläsning 13 & 14

Lär dig programmera! Prova på programmering med enkla exempel! Björn Regnell

Mer om analytisk geometri

Laboration 2: Designmönster

729G04 PYTHON 4 JODY FOO. Department of Computer and Information Science (IDA) Linköping University, Sweden

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

7F Ma Planering v2-7: Geometri

Projekt i programmering 1 (ver 2)... 2 Projektidé... 2 Planering... 2 Genomförande... 2 Testning och buggar... 3 Utvärdering... 3 Planering...

Föreläsning REPETITION & EXTENTA

Rumsuppfattning är förmågan att behandla sinnesintryck av former

Karta över Jorden - viktigt exempel. Sfär i (x, y, z) koordinater Funktionen som beskriver detta ser ut till att vara

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Klassrumsprojekt programmering - Digitalt lärande

8F Ma Planering v2-7 - Geometri

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

Introduktion till Python Teoridel

Explorativ övning Vektorer

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Python. Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program.

Liten lathund för användning av klubbens Quarq Shockwiz (QSW).

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

Innehåll. Innehåll... 2 Detaljövningar Övning 1 Skiss och Intersect Övning 2 Path, Pattern Övning 3 - Featureträdet...

Lennart Rolandsson, Uppsala universitet, Ulrica Dahlberg och Ola Helenius, NCM

Tenta i Grundläggande programmering DD klockan

Transformationer i R 2 och R 3

Handbok Kig. Dominique Devriese Översättare: Stefan Asserhäll

9 Geometriska begrepp

Aktivitetsbank. Matematikundervisning med digitala verktyg II, åk 7-9. Ulrihca Malmberg, Maria Johansson, Ulrica Dahlberg

9E Ma Planering v2-7 - Geometri

Bestäm den matris B som löser ekvationen = 1 2

Uppgifter till praktiska tentan, del A. (7 / 27)

Transkript:

Konvexa höljet Laboration 6 GruDat, DD1344 Örjan Ekeberg 10 december 2008 Målsättning Denna laboration ska ge dig övning i att implementera en algoritm utgående från en beskrivning av algoritmen. Du ska få insikt i hur man kan manipulera geometriska objekt som punkter, linjer och polygoner. Du kommer också att få prova på att använda enkel grafik för att visualisera resultatet av din algoritm. 1 Uppgiften Du ska skriva ett program som räknar ut det konvexa höljet för en punktmängd. Punkterna läser du in från filen sweden.txt där varje rad innehåller två tal som ska tolkas som x- och y-koordinater. Det konvexa höljet är den minsta konvexa polygonen där ingen punkt ligger utanför. Figur 1 visar ett exempel. Det konvexa höljet till en mängd punkter i planet kan beräknas med en algoritm som kallas Graham-Scan. Din uppgift är att implementera denna algoritm och använda den för att hitta och rita ut det konvexa höljet till punkterna i filen. Figur 1: Konvexa höljet till en punktmängd i planet. Det konvexa höljet är en polygon som byggs upp av en delmängd av punkterna. 1

2 Algoritmen Graham-Scan går till på följande sätt: 1. Låt vara den punkt som har minst x-koordinat. Om fler har samma x-koordinat, välj den (av dessa) som har störst y- koordinat. 2. Låt [,,..., p n ] vara resten av punkterna, ordnade motsols runt punkten. 3. Lägg in punkterna, och i en stack s. 4. För varje punkt p i {,,..., p n } Så länge punkten överst på s ligger till vänster om linjen från punkten näst överst på s till p så ta bort stackens översta element. Lägg in p på stacken. 5. Returnera punkterna i s Steg 1 garanterar att punkten är en punkt som kommer att tillhöra lösningen. Steg 2 kräver att punkterna sorteras efter stigande vinkel för linjen från till den aktuella punkten (se figur 2). Huvuddelen av algoritmen är loopen i steg 4. Hur den fungerar illustreras i figur 3. Figur 2: Punkterna,,..., p n sorteras efter stigade vinkel på linjen som utgår från. 2

A B C D E F Figur 3: Bilderna illustrerar hur Graham-Scan algoritmen succesivt bygger polygonen. Först (A) upptäcker man att punkten ligger till vänster om linjen från till. plockas därför bort från stacken innan läggs in. I nästa steg (B) konstateras att ligger till höger om linjen. lämnas därför kvar på stacken när läggs in. I steg C jämförs med linjen p 5 och eftersom punkten ligger till höger om linjen så lämnas den kvar på stacken. I D jämförs p 5 med linjen p 6 och även här ligger punkten till höger om linjen. I nästa steg (E) plockas först punkten p 6 bort eftersom den ligger till vänster om p 5, men här plockas även p 5 bort eftersom den ligger till vänster om. Den slutliga lösningen utgörs av punkterna som finns kvar på stacken när alla punkter behandlats (F). 3

3 Hjälpfunktioner Graham-Scan använder sig av en återkommande test: befinner sig en punkt p till vänster om en linje? Detta undersöker man enklast (och säkrast) genom att beräkna kryssprodukten av vektorerna p och och avgöra om denna är positiv eller ej. Kryssprodukten mellan två vektorer a och b i planet räknas enkelt ut som a x b y a y b x. Skriv en hjälpfunktion som tar tre punkter och returnerar True om den första punkten ligger till vänster om linjen från den andra till den tredje. För att kunna sortera punkterna i vinkelordning behöver man räkna ut vinkeln för en vektor. Här är det lämpligt att utnyttja funktionen math.atan2(y, x) som ger vinkeln (i radianer) från origo till punkten (x, y). För att sorteringen ska fungera är det viktigt att vinkelberäkningarna inte plötsligt gör ett hopp på 2π. Genom att utgå från punkten med minst x-koordinat är vi garanterade att alla vinklar ligger mellan π 2 och π 2. math.atan2 gör sitt hopp vid π så detta bör vara säkert. 4 Implementera Graham-Scan Implementera nu de funktioner som behövs för att räkna ut vilken polygon som utgör det konvexa höljet till punkterna i filen sweden.txt. För sorteringen kan du med fördel utnyttja den inbyggda funktionen sorted. Lägg märke 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årt fall vinkeln. Sorteringen kan därför göras på detta sätt: def mykey( point ) : return anglebetween ( o r i g i n, point ) o r i g i n = p [ 0 ] v = s o r t e d ( p [ 1 : ], key=mykey) 4

5 Sköldpaddsgrafik Under 1960-talet utvecklades ett experimentellt programmeringsspråk Logo speciellt för att lära barn programmering. Logo introducerade en speciell sorts grafik kallad Turtle Graphics, där namnet syftar på den typ av figurer som skapas när sköldpaddor går omkring på en sandstrand. Python har en modul turtle som implementerar denna typ av grafik. Prova gärna följande: import t u r t l e t u r t l e. down ( ) t u r t l e. goto (100, 0) t u r t l e. up ( ) t u r t l e. goto (50, 0) t u r t l e. down ( ) t u r t l e. c i r c l e ( 10) t u r t l e. c o l o r ( blue ) t u r t l e. r i g h t (90) t u r t l e. forward (20) Här är ett urval av de funktioner som finns: down up goto right forward circle color speed tracer Sänk pennan Lyft pennan Gå till angivna koordinater Sväng höger Gå framåt Gå runt Byt färg på pennan Trimma sköldpaddan Animerad uppritning på/av Mer information får du genom help(turtle) i Python, bl.a. hur du fyller ytor och skriver text. Använd sköldpaddsgrafik för att rita ut alla punkterna och det konvexa höljet. Använd t.ex. små cirklar för punkterna och linjer för det konvexa höljet. Rita gärna lite större cirklar för de punkter som ingår i höljet. Sköldpaddsgrafiken är från början inställd att rita långsamt för att man ska hinna se vad som händer. Om du tycker att tempot är lite väl lågt kan du öka sköldpaddans fart genom turtle. speed( fastest ). Alternativt kan du helt stänga av animeringen under uppritningen genom turtle. tracer(false). 5

6 Extrauppgift för högre betyg 6.1 Största avståndet När man har det konvexa höljet kan man använda detta för att snabbt (O(n)) räkna ut det största avståndet mellan två punkter i den ursprungliga punktmängden. En brute force algoritm som beräknar alla parvisa avstånd kommer att kräva O(n 2 ) tid. För att komma ned till O(n) måste man vara smartare. En idé är att stega igenom polygonen med en variabel medan man samtidigt i en annan variabel håller reda på vilken punkt i polygonen som ligger längst bort. Använd denna idé för att skriva en funktion som räknar ut vilka två punkter som ligger längst ifrån varandra. Rita en linje mellan dessa punkter (gärna med en annan färg). När du är klar med laborationen: redovisa för en handledare och försök att få en kvittens här. Ditt namn:................................................................... Handledarens signatur:....................................................... Dagens datum:............................................................... Extrauppgift genomförd:..................................................... GruDat 2008, Laboration 6 6