Föreläsning 11: Beräkningsgeometri

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

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Konvexa höljet Laboration 6 GruDat, DD1344

Föreläsning 5: Grafer Del 1

Matematik CD för TB = 5 +

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

Lösningar till udda övningsuppgifter

Föreläsning 13 Linjär Algebra och Geometri I

Funktioner. Räta linjen

Mer om analytisk geometri

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Explorativ övning Vektorer

Kurvlängd och geometri på en sfärisk yta

Föreläsning 9: Talteori

Föreläsning 9: Talteori

2. 1 L ä n g d, o m k r e t s o c h a r e a

Kappa 1. Robin Kastberg. 10 oktober 2014

Föreläsning 11: Beräkningsgeometri

Möbiusgruppen och icke euklidisk geometri

.I Minkowskis gitterpunktssats

. b. x + 2 y 3 z = 1 3 x y + 2 z = a x 5 y + 8 z = 1 lösning?

KOKBOKEN 1. Håkan Strömberg KTH STH

9 Geometriska begrepp

Instuderingsfrågor för Endimensionell analys kurs B1 2011

Moment Viktiga exempel Övningsuppgifter

Kapitel 4. cos(64 )= s s = 9 cos(64 )= 3.9m. cos(78 )= s s = 9 cos(78 )= 1.9m. a) tan(34 )= x x = 35 tan(34 )= 24cm

SF1620 Matematik och modeller

Vektorgeometri för gymnasister

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Undersökande arbetssätt i matematik 1 och 2

Modul 1: Komplexa tal och Polynomekvationer

Komposanter, koordinater och vektorlängd Ja, den här teorin gick vi igenom igår. Istället koncentrerar vi oss på träning inför KS3 och tentamen.

Matematik CD för TB. x + 2y 6 = 0. Figur 1:

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

Om ellipsen och hyperbelns optiska egenskaper

Instuderingsfrågor för Endimensionell analys kurs B1

Den räta linjens ekvation

Sidor i boken f(x) = a x 2 +b x+c

Banach-Tarskis paradox

Den räta linjens ekvation

Extramaterial till Matematik Y

Föreläsning 8: Aritmetik och stora heltal

Vektorgeometri för gymnasister

kan vi uttrycka med a, b och c. Avsnitt 2, Vektorer SA + AB = SB AB = SB SA = b a, Vi ritar först en figur av hur pyramiden måste se ut.

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Vektorgeometri för gymnasister

MATEMATIK 5 veckotimmar

SF1624 Algebra och geometri Lösningsförslag till modelltentamen DEL A

Uppsala Universitet Matematiska Institutionen Bo Styf. Svar till tentan. Del A. Prov i matematik Linj. alg. o geom

1 Vektorer i koordinatsystem

4-8 Cirklar. Inledning

5B1134 Matematik och modeller

Material till kursen SF1679, Diskret matematik: Lite om kedjebråk. 0. Inledning

x = som är resultatet av en omskrivning av ett ekvationssystemet som ursprungligen kunde ha varit 2x y+z = 3 2z y = 4 11x 3y = 5 Vi får y z

Kvalificeringstävling den 29 september 2009

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

Föreläsningsanteckningar F6

Matematiska uppgifter

Trigonometri. Sidor i boken 26-34

Föreläsning 1: Dekomposition, giriga algoritmer och dynamisk programmering

Vektorgeometri för gymnasister

Uppsala Universitet Matematiska Institutionen Thomas Erlandsson

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Kvalificeringstävling den 30 september 2008

Betygsgränser: För betyg. Vem som har. Hjälpmedel: av papperet. Uppgift. 1. (4p) 0. (2p) 3 (2p) Uppgift. 2. (4p) B-2C om. vektor A (1p) b) Bestäm k så

MVE365, Geometriproblem

Inledande kurs i matematik, avsnitt P.2. Linjens ekvation kan vi skriva som. Varje icke-lodrät linje i planet kan skrivas i formen.

Lite Kommentarer om Gränsvärden

TATM79: Föreläsning 2 Absolutbelopp, summor och binomialkoefficienter

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Fler uppgifter på andragradsfunktioner

Np MaB vt 2002 NATIONELLT KURSPROV I MATEMATIK KURS B VÅREN 2002

Viktigaste begrepp, satser och typiska problem från kursen ALA-A år 2013.

SF1658 Trigonometri och funktioner Lösningsförslag till tentamen den 19 oktober 2009

Föreläsning 9: NP-fullständighet

Moment 5.5 Övningsuppgifter I 5.60a. 5.60b, 5.60.c, 61

Sidor i boken 8-9, 90-93

Avdelning 1, trepoängsproblem

Tentamen : Lösningar. 1. (a) Antingen har täljare och nämnare samma tecken, eller så är täljaren lika med noll. Detta ger två fall:

x f (x) dx 1/8. Kan likhet gälla i sistnämnda relation. (Torgny Lindvall.) f är en kontinuerlig funktion på 1 x sådan att lim a

Tentamen i Linjär algebra (TATA31/TEN1) ,

x+2y 3z = 7 x+ay+11z = 17 2x y+z = 2

SKOLORNAS MATEMATIKTÄVLING Svenska Matematikersamfundet. Lösningsförslag till naltävlingen den 20 november 2004

Determinant Vi förekommer bokens avsnitt, som handlar om determinanter eftersom de kommer att användas i detta avsnitt. a 11 a 12 a 21 a 22

Lathund geometri, åk 7, matte direkt (nya upplagan)

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

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

Vektorgeometri för gymnasister

Uppföljning av diagnostiskt prov Repetition av kursmoment i TNA001-Matematisk grundkurs.

Veckoblad 1, Linjär algebra IT, VT2010

TATM79: Föreläsning 2 Absolutbelopp, summor och binomialkoefficienter

Övningshäfte 2: Induktion och rekursion

Algoritmer, datastrukturer och komplexitet

Talmängder. Målet med första föreläsningen:

Lösningar Datastrukturer TDA

A1:an Repetition. Philip Larsson. 6 april Kapitel 1. Grundläggande begrepp och terminologi

ax + y + 4z = a x + y + (a 1)z = 1. 2x + 2y + az = 2 Ange dessutom samtliga lösningar då det finns oändligt många.

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

Transkript:

DD2458, Problemlösning och programmering under press Föreläsning 11: Beräkningsgeometri Datum: 2009-11-24 Skribenter: David Björklund, Christoer Lundell Johansson och Mårten Selin Föreläsare: Fredrik Niemelä 1 Inledning För geometriska problem, både enkla och mer avancerade, nns det vissa saker som gör att det försvåras eller blir rent ut av sagt fel. Det man tänker mest på är dock specialfall och precision/overow. 2 Specialfall Om man tänker efter, många gånger hittar man en funktion eller metod som löser ett problem väldigt bra, men det nns nästan alltid specialfall som gör att metoden inte beter sig som man kanske vill eller ger fel svar helt och hållet. Låt oss ta som exempel en metod att beräkna om linjer skär varandra, då kanske man har en koll som ser om det nns en chans att de skär varandra, den kollen kan helt missa specialfallet att de ligger i samma linje, att den andra linjen börjar och följer den första linjen en tid, hur hanteras det specialfallet? Strunta i det: Kan vi på något sätt gå runt problemet? Kanske det bara uppstår för värden under 1? gör så man inte får använda dessa värden. Man kan också antaga eller bevisa att detta specialfall inte kommer eller kan uppstå. Hantera det: Vi har specialfall, kan vi hantera det? Blir det fel värde vid 0 och 1 men för alla andra tal över är det ok? Skriv in dessa för direkt uppslagning! Ljug: Låter lite konstigt men ändå. Ta indata och ändra det eller på annat sätt gör så att problemet inte kan uppstå eller liknande bakom kulisserna lösning på problemet. 2.1 Precisions och overow Andra problem man kan få är med precision och overow. Om man gör stora eller långa beräkningar kan tals begränsade precision ge fel som avviker med era storleksordningar, inte bara små avrundingsfel. Men vad kan man göra åt detta då? Det nns ett antal åtgärder: Heltals aritmetik: Att använda heltal när det är möjligt ger mycket bättre precision. Som att representera ett decimaltal med två long long. En representerar sirorna före och en sirorna efter decimal tecknet. Man kan också använda specialgjorda data strukturer som BigFloat eller javas BigDecimal. Dessa datastrukturer är specialgjorda för att representera godtyckligt stora tal där datorns totala minne sätter gränsen. 1

2 DD2458 Popup HT 2009 double/long double: Vissa gånger behövs det kanske inte allt för hög precision och då funkar dessa bra. 3 Punkter 3.1 Kortaste avståndet mellan punkter Att naivt räkna ut det kortaste avståndet mellan två punkter i en en punktmängd ger n(n 1)/2 uträkningar och faller in i O(n 2 ) komplexitet. Men det nns bättre sätt att göra det på. Det handlar om att minska ner problemet för att sedan utnyttja vad vi vet från delproblemen med att hitta snabbare lösning. Algoritm 1: Hitta kortaste avståndet i en punktmängd Input: En punktmängd P Output: Kortaste avståndet mellan två punkter ShortestDist(P ) (1) if P = 2 (2) return Avståndet mellan de två punkterna i P. (3) Hitta ett x värde där vi får hälften av alla punkter på var sin sida av linjen (4) Räkna naivt ut kortaste distansen mellan dessa två delmängders punkter (5) Skapa 2 arrayer, sorterad på x och y för punkterna för snabb upp slagning (6) Spara minsta värdet av del höger och del vänster och spara det som eventuell lösning i d (7) foreach p vänstra halvan i stigande ordning (8) if p ligger närmare skiljelinjen än d (9) Se om någon punkt på andra sidan skiljelinjen (inom intressant intervall) ligger närmare än d (10) Uppdatera d om nödvändigt (11) return d

Beräkningsgeometri 3 Figur 1: Ett snitt tas så att punktmängden delas upp i två lagom stora delmängder. 4 Linjer och linjesegment 4.1 Avgöra utifall en punkt ligger på en linje Givet ett linjesegment med ändpunkter i (x 1, y 1 ) och (x 2, y 2 ) kan det vara intressant att avgöra utifall en punkt (x, y) ligger på linjen eller inte. Det gör man enklast genom att kolla att kryssprodukten mellan de två vektorerna som utgår från (x 1, y 1 ) och går till (x 2, y 2 ) respektive (x, y) blir noll: (x 2 x 1, y 2 y 1 ) (x x 1, y y 1 ) =? 0 (y y 1 )(x 2 x 1 ) =? (x x 1 )(y 2 y 1 ) Därför då är vektorerna linjärt beroende, d.v.s. parallella, och de kan de endast vara om (x, y) ligger på linjen. Hittills har vi bara kollat att punkten ligger på linjen, inte på linjesegmentet. Det är därför också nödvändigt, men enkelt, att kolla att punkten benner sig inom rätt intervall. x 1 x x 2 OR x 1 x x 2 är ett tillräckligt test. 4.2 Antalet punkter med heltalskoordinater på linjen Ett annat problem är att givet ett linjesegment med ändpunkter på heltalskoordinater, avgöra hur många andra punkter på linjesegmentet som har heltalskoordinater. Låt x och y vara dierensen i ändpunkternas x- respektive y- koordinat. Punkter på linjesegmentet som har sin x-komponent som heltal av nns det i en: 0, 1/ x, 2/ x,..., 1 -te del av linjesegmentet. Samma sak för y: 0, 1/ y, 2/ y,..., 1 -te del av linjesegmentet. Punkter som uppfyller båda ligger längs en n/ x = m/ y -te del av linjesegmentet där n och m är heltal. Antalet lösningar till n/ x = m/ y, (n, m) [0, x] [0, y], ger således antalet

4 DD2458 Popup HT 2009 punkter vi söker. Men det är ett lätt problem att lösa och antalet punkter blir: GCD( x, y) + 1 (+1 kommer ifrån att en av ändpunkterna inte räknas med). Figur 2: Punkter på linjesegmentet som uppfyller x, y N är GCD( x, y) + 1, inklusive start- och slutpunkt. 4.3 Korsande linjesegment Linjesegment kan korsa varandra på tre olika sätt: de kan vara oberoende av varandra (dvs inte korsa varandra alls), de kan korsa varandra på en punkt, eller så kan de vara överlappande. Det korsade området kan alltså antingen vara tomt, en punkt alternativt en linje. Linjernas ekvationer är: L a = P 1 + u a (P 2 P 1) L b = P 3 + u b (P 4 P 3) Vi letar initialt efter punkten där L a och L b korsas, dvs på punkten där u a och u b har sådana värden att L a = L b gäller. Figur 3: Korsande linjesegment L a = L b P 1 + u a (P 2 P 1) = P 3 + u b (P 4 P 3) P 1 x + u a (P 2 x P 1 x ) = P 3 x + u b (P 4 x P 3 x ) P 1 y + u a (P 2 y P 1 y ) = P 3 y + u b (P 4 y P 3 y ) (P 4x P 3x)(P 1y P 3y) (P 4y P 3y)(P 1x P 3x) u a = u b = (P 4 y P 3 y )(P 2 x P 1 x ) (P 4 x P 3 x )(P 2 y P 1 y ) (P 2x P 1x)(P 1y P 3y) (P 2y P 1y)(P 1x P 3x) (P 4 y P 3 y )(P 2 x P 1 x ) (P 4 x P 3 x )(P 2 y P 1 y ) Värt att notera är att både u a och u b har samma nämnare. Om nämnaren till u a /u b är 0 innebär detta att L a och L b är parallella. Är både täljarrna och nämnaren till u a samt u b 0 innebär det att L a och L b är överlappande, vilket innebär att L a och L b korsas den gemensamma delen av L a och L b. Ett knepigt specialfall är då den gemensamma delen av L a och L b enbart är en punkt.

Beräkningsgeometri 5 För linjesegment gäller dessutom att 0 u a, u b 1 måste gälla. När väl två giltiga värden på u a, u b hittats kan den korsande punkten x, y räknas ut med de tidigare denierade begreppen, t.ex. x = P 1 x + u a (P 2 x P 1 x ) och y = P 1 y + u a (P 2 y P 1 y ). 5 Trianglar Ibland vill man räkna ut arean på trianglar. Då nns det två enkla formler. Vilken man använder beror på vilken information om trianglarna som är given. Vet man längderna så kan man använda Herons formel: A = s(s a)(s b)(s c) där a, b och c är kantlängderna och s är hälften av omkretsen (s = (a + b + c)/2). Vet man istället hörnpunkternas koordinater är det bättre att räkna på kryssprodukten. Absolutbeloppet på kryssprodukten mellan två vektorer blir nämligen arean av det uppspända parallellogrammet. Tar man därför två kanter som vektorer och delar absolutbeloppet av deras kryssprodukt med två får man därför triangelns area: A = (x 2 x 1, y 2 y 1 ) (x 3 x 1, y 3 y 1 ) /2 = (x 2 x 1 )(y 3 y 1 ) (x 3 x 1 )(y 2 y 1 ) /2 6 Polygoner Även polygoner har areor, och även dem nns det två enkla sätt att räkna ut: antingen med trapetser eller med trianglar. 6.1 Area m.h.a. trapetser Varje linjesegment i polygonen bildar en trapets med x-axeln (alternativt y-axeln om det är enklare, men nu antar vi att vi valde x-axeln). Dessa bidrar till polygonens area antingen positivt eller negativt. Det är inte uppenbart vilka som ska vara positiva och vilka som ska vara negativa, men om vi ser till att följa polygonen runt och alltid ta arean av trapetsen som: (y 2 + y 1 )(x 2 x 1 )/2, där (x 1, y 1 ) är linjesegmentets startpunkt och (x 2, y 2 ) är linjesegmentets slutpunkt får vi en area som är rätt förutom kanske tecknet.

6 DD2458 Popup HT 2009 Så om vi har en enkelt sammanhängande polygon given av (x 0, y 0 ), (x 1, y 1 ),...(x n 1, y n 1 ). Så får vi polygonens area av: 6.2 Area m.h.a. trianglar A = 1 2 Σn k=1(y k + y k 1 )(x k x k 1 ) Använder vi trianglar gör vi på nästan samma sätt som för trapetser. Nu tar vi en godtycklig punkt (x, y) i planet och bildar trianglar alla trianglar bestående av punkten och linjesegment från polygonen. Formeln för arean av en triangel givet hörnens koordinater har vi redan från (5). Samma fråga som tidigare: vilka ska vara positiva och vilka negativa? Och det är samma svar som tidigare: Följer vi bara polygonen runt så blir det rätt förutom kanske på tecknet: A = 1 2 Σn k=1(x k 1 x)(y k y) (x k x)(y k 1 y) 6.3 Antalet heltalspunkter i en polygon Det nns ett special fall för att räkna ut arean av en polygon om den uppfyller två kriterier. Den är representerad med heltalskoordinater och den är en simpel polygon. Denna egenskap beskrivs i Picks sats, vilket är som följer: A = i + (b/2) 1

Beräkningsgeometri 7 Där A är den totala arean av polygonen, i är det totala antalet punkter med heltalskoordinater som är strikt innanför polygonens kanter. b är totala antalet heltalskoordinater som ligger direkt på polygonens kanter. Med hjälp Picks sats kan vi nu räkna ut antalet punkter med heltalskoordinater inuti polygonen: i = A (b/2) 1 För att räkna ut b använder vi resultatet från 4.2. Lägger vi ihop för alla linjesegment (och drar ifrån ett från varje så att inte hörnen räknas två ggr) får vi: 6.4 Punkt i Polygon b = Σ k GCD( x k, y k ) När man har en polygon kan det vara intressant att veta om en punkt man har ligger inuti denna eller om den ligger utanför polygonen. Detta kan, om polygonen är simpel, räknas ut med antalet skärningar av polygonens kanter. Som man ser på bilden, kan man skapa en linje som går igenom polygonen. Sedan kan vi kolla hur många gånger vi skär polygonens kanter, om vi skär ett jämn antal kanter innan vi når punkten är den utanför, eftersom vi börjar utanför kommer varje jämn skärning vara att vi går ut. Man behöver dock inte spara antalet skärningar, räcker med en bool variabel som är false till att börja med. Algoritm 2: Avgör om en punkt ligger i polygonen. Input: En punkt p och en polygon P Output: En boolsk sant eller falskt InsidePoly(p, P ) (1) inside := false (2) p_line := linje från punkten till oändligheten längs en horisontell linje (3) foreach linjesegment m P (4) if p_line och m korsar varandra (5) inside = not inside (6) return inside Denna metod fungerar dock inte på komplexa polygoner med korsande kanter då detta kan ge fel värde fast den är innanför då den korsar kanter den inte ska korsa.

8 DD2458 Popup HT 2009 Då nns det en annan metod, och det är att man går runt alla polygonens kanter och summerar ihop vinkeln från punkten till linjesegmentets båda ändpunkter för alla linjesegment (och tillåter att vinkeln är negativ när ändpunkterna är i omvänd ordning). Summan kommer bli 2πm där m är antalet varv polygonen går runt punkten. Om summan är noll är punkten alltså utanför eftersom polygonen går noll varv runt punkten. Annars är punkten innanför. 6.5 Konvexa höljet Det konvexa höljet är den polygon med minsta möjliga antal kanter som innefattar en hela punktmängden. För att lösa detta nns det bland annat en metod som kallas Graham scan som löser problemet i O(n log n): Några delar borde dock gås igenom lite närmare. Om man gör en kryss produkt Algoritm 3: Hitta konvexa höljet till en punktmängd Input: En punktmängd P Output: Minsta polygon som omfattar alla punkter GrahamScan(P) (1) Sök upp den punkt som har den absolut lägsta y värdet, använd lägsta x för tie breaker. O(n) (2) Sortera punkterna på vinkel mot x planet sett från punkten man fann i förra steget. Om två punkter har samma vinkel ta bort den som är närmast utgångs punkten. (3) Lägg utgångs punkten och de två nästkommande från sorteringen på en stack. (4) foreach i [3n 1] (5) Lägg P i på stacken. (6) while stackens tre översta punkter inte bildar vänstersväng (7) Ta bort näst översta elementet i stacken. (8) return Punkter i stacken mellan de tre senaste punkterna ser man om det är en höger eller vänstersväng. Positivt för vänster negativt för höger, får man noll är punkterna kolinjära. Är det negativt värde säger vi att det är falskt i kollen i sista loopen. Detta görs i linjär tid då varje punkt inte kollas mer än två gånger i värsta fallet (efter andra gången tas den bort. Så det som händer när en punkt ratas är att den helt sonikt hoppas över. Som bilden visar när det sker en fel sväng så tar man bort just den punkten och leder förbi den. 7 Cirklar 7.1 Ett centrum och en radie Vanligast är att vi representerar en cirkel med hjälp av ett centrum och en radie. Radien är avståndet från centrum till cirkelns kant, dvs alla punkter på kanten har ekvidistanta avstrånd från centrum.

Beräkningsgeometri 9 7.2 Entydligt given av tre punkter Givet de tre punkterna a, b och c på ett plan (där punkterna inte ligger i linje med varandra) kan man entydligt hitta en cirkel där de tre punkterna alla ligger på cirkelns kant. En annan punkt existerar på planet som är ekvidistant från de tre punterna, vilket innebär att cirkelns centrum (punkten på det ekvidistant avstånd från a, b, c) samt radie (det ekvidistanta avståndet) existerar. Figur 4: 3 punkter i planet Figur 5: Cirkeln bestämd efter punkterna. 7.3 Ligger en punkt på, utanför eller inuti cirkeln? Genom att använda att man av 3 punkter på planet entydligt kan bestämma en cirkel kan man räkna ut huruvida en fjärde punkt ligger på, utanför eller inuti cirkeln. Anta att vi har en cirkel bestående av punkterna a, b samt c. Ligger punkten d på, utanför eller inuti cirkeln? Figur 6: Ligger d i cirkeln? Beräkna determinanten D: a x a y a 2 xa 2 y 1 b x b y b 2 xb 2 y 1 c x c y c 2 xc 2 y 1 d x d y d 2 xd 2 y 1 Är D negativ ligger d utanför cirkeln, är D positiv ligger d innanför cirkeln. Är D 0 innebär det att punkten d ligger på cirkelns kant. Om vi istället har cirkelns radie, cirkelns centrum samt en punkt och undrar huruvida den ligger inom cirkeln går också ovanstående formel att använda, då genom att ta ut tre punkter från cirkeln och använda dessa som a, b och c.