Informatik II Vorlesung am D-BAUG der ETH Zürich. Vorlesung 7, Fallstudie Point-In-Polygon Algorithmus Diskretisierung: Linien zeichnen

Ähnliche Dokumente
DISKRETISIERUNG: LINIEN ZEICHNEN

Informatik II Prüfungsvorbereitungskurs

Geometrie I. Sebastian Redinger Informatik 2 Programmiersysteme Martensstraße Erlangen

2D-Clipping. Kapitel Clipping von Linien. y max. y min x min. x max

Algorithmen und Datenstrukturen SS Übungsblatt 1: Grundlagen

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Der Algorithmus von Bresenham

Hallo Welt für Fortgeschrittene

Technische Universität München WiSe 2018/19 Fakultät für Informatik Übungsblatt 6 Dr. Ch. Herzog 26. November 2018

Geometrie 1. Christian Bay Christian Bay Geometrie / 46

13. Dynamische Datenstrukturen

16. Dynamische Datenstrukturen

Städtisches Gymnasium Olpe Java Ht Informatik - Q1 Die Klasse List im Abitur Methoden und Beispielcode Hier alle wichtigen Methoden. Ein Beispielcode

3. Übungsblatt zu Algorithmen I im SoSe 2017

Die Rasterbildtechnik

Übung Algorithmen und Datenstrukturen

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Einführung in die Objektorientierte Programmierung Vorlesung 18: Lineare Datenstrukturen. Sebastian Küpper

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Voronoi-Diagramme. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK

Geometrie. Hallo Welt! für Fortgeschrittene Simon Kuhnle. 11. Juli

Gerasterte Linien. y n y i y(x i ) x n. x i. Nord. Ost. Prof. Dr. Aris Christidis SS 2017

Übung Algorithmen und Datenstrukturen

Optimierung. Vorlesung 02

Fallstudie: Online-Statistik

Informatik II Übung, Woche 14

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Technische Universität München SS 2006 Fakultät für Informatik Übungsblatt 3 Prof. Dr. A. Knoll 2. Juni 2006

PK-Einstufungstest. 1. Allgemeine Multiple-Choice-Aufgaben

Gerasterte Linien. y n y i y(x i ) x n. x i. Nord. Ost. Prof. Dr. Aris Christidis

PK-Einstufungstest. 1. Allgemeine Multiple-Choice-Aufgaben. Aufgabe 1.1. Alle Aufgaben beziehen sich auf Java.

2.4. Triangulierung von Polygonen

Voronoi-Diagramme INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie

Sebastian Kurfürst

Liniensegmentschnitt. Doppelt verkettete Kantenliste. Überlagerung von 2 ebenen Graphen. Boolsche Operatoren für einfache Polygone (LEDA)

Polygontriangulierung

Computergrafik SS 2016 Oliver Vornberger. Vorlesung vom Kapitel 11: Fraktale

7.0 Arbeiten mit Objekten und Klassen

Computergraphik Grundlagen

Datenstrukturen & Algorithmen Lösungen zu Blatt 14 FS 16

Abgabe: keine Pflichtabgabe (vor 12 Uhr) Aufgabe 10.1 (P) Vererbung Gegeben seien folgende Java-Klassen:

ALP II Dynamische Datenmengen

Hallo Welt! für Fortgeschrittene. Geometrie I. Philipp Erhardt. 19. Juli Philipp Erhardt Geometrie I 19. Juli / 27

Java. public D find(k k) { Listnode K, D n = findnode(k); if(n == null) return null; return n.data; Java

Rastergrafikalgorithmen

Abbildung 11.1: Farnblatt

Formale Spezifikation mit Java Modeling Language

Informatik II Vorlesung am D-BAUG der ETH Zürich

Computergrafik SS 2010 Oliver Vornberger

Lösungen zum Übungsblatt 10: Entwicklung von Softwaresystemen I (WS 2003/04)

Variablenarten. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Geometrie I. Polygone. Dominik Huber Hallo Welt! für Fortgeschrittene. Informatik 2 Programmiersysteme Martensstraße Erlangen

Kapitel Universelle Füll-Verfahren. Zum Füllen eines Objekts mit einer einzigen Farbe oder mit einem Muster bieten sich zwei Ansätze an:

Graphische Datenverarbeitung und Bildverarbeitung

Übung 09: Vererbung und Dynamische Bindung

Übungsblatt 7 - Voronoi Diagramme

Punkt-in-Polygon-Suche Übersicht

2.2 Spezifikation abstrakter Datentypen. 2.3 Implementierung und Anwendung von ADT. 2.4 Datenabstraktion und Objektorientierung

Lineare Programmierung

Serie 13. Analysis D-BAUG Dr. Cornelia Busch FS 2016

Ordnung im Materiallager: Datenstrukturen II. Suchen und Sortieren im Array Verkettete Listen Rekursion

6. Analytische Geometrie : Geraden in der Ebene

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

Graphalgorithmen Minimale Spannbäume. Kruskal: Minimaler Spannbaum

Basispruefung Herbst 2016/ Einführung in die Programmierung

Es findet eine binäre/iterative o.ä. Suche statt. (8 Punkte);

Füllen von Primitiven

1 Abstrakte Datentypen

Einstieg in die Informatik mit Java

Software Entwicklung 1

1. Rekursive Algorithmen 2. Rekursive (dynamische) Datenstrukturen

Einführung in die Informatik

Informatik II Prüfungsvorbereitungskurs

Geradenarrangements und Dualität von Punkten und Geraden

Überblick. Rekursive Methoden. Backtracking. Memorization. Einfache rekursive Datenstrukturen. Aufzählen, Untermengen, Permutationen, Bitmengen

Punktlokalisierung. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie

Verkettete Datenstrukturen: Listen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Objektorientierte Programmierung

Die Topologie von R, C und R n

II.4.5 Generische Datentypen - 1 -

Modulprüfung Numerische Mathematik 1

Klausur zur Vorlesung Stochastik II

Algorithmische Geometrie 3. Schnitte von Liniensegmenten

Algorithmen I - Tutorium 28 Nr. 3

Geradenarrangements und Dualität von Punkten und Geraden

Programmieren I. Kapitel 13. Listen

import JavaKaraProgram; public class Quadrat extends JavaKaraProgram { // Anfang von Quadrat void turnaround() { kara.turnleft(); kara.

Geometrische Algorithmen Punkt-in-Polygon-Suche. Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche

Algorithmische Techniken für Geometrische Probleme

Übungsstunde 8. Einführung in die Programmierung I

Geradenarrangements und Dualität von Punkten und Geraden

7. Verkettete Strukturen: Listen

Übung Algorithmen und Datenstrukturen

Transkript:

Informatik II Vorlesung am D-BAUG der ETH Zürich Vorlesung 7, 11.4.2016 Fallstudie Point-In-Polygon Algorithmus Diskretisierung: Linien zeichnen

Fallstudie: Point-In-Polygon Algorithmus Annahme: abgegrenztes Gebiet auf einer Landkarte. Repräsentation des Gebietes im Programm? Wie entscheiden wir effizient ob ein Punkt «innen» liegt? Wie füllen wir das Gebiet mit einer Farbe? Ein konvexes Gebiet Ein nicht konvexes Gebiet 2

Hintergrund: Jordankurven Schnittfreie Polygone sind Jordankurven und zerlegen die Ebene in zwei Gebiete: das Innere und das Äussere Das Innere ist beschränkt und Das Äussere ist unbeschränkt. Strikt mathematischer Beweis aus der algebraische Topologie: Abbildung der Einheitskugel Das kann man ausnutzen, indem man das Polygon mit Geraden schneidet. Man weiss, dass der unbeschränkte Teil der Geraden aussen liegt. Daher funktioniert die folgende Abzählmethode. 3

Abzählmethode Zähle auf einer beliebigen Geraden (die den fraglichen Punkt enthält), von unendlich fern kommend, die Anzahl echter Schnittpunkte mit dem Polygon Alle Bereiche der Gerade zwischen ungeradzahligen und geradzahligen Schnittpunkten liegen innen aussen S1 S2 S3 S4 aussen innen Das funktioniert mit jeder Geraden, wir suchen uns die einfachen Fälle raus (also horizontal oder vertikal) 4

Spezialfälle Schnittpunkt = Eckpunkt S1 S2=S3 S4 S1 S2 «Schnittpunkt» = Strecke S1 S2 S1 S2 5

Echte vs. unechte Schnitte Was charakterisiert echte Schnitte? 4/8/2016 6

Der Trick Behandle Eckpunkte einer begrenzenden Kante lageabhängig Es werden z.b. nur die oberen Eckpunkte einer Kante mit vertikaler Komponente berücksichtigt horizontale Kanten werden ignoriert Für eindeutige Segmentierung bei Kachelung: Entscheidung für die Hinzunahme der einen oder anderen Richtung oben/unten, rechts/links (optional: behandle Kanten separat) 7

Implementation Polygon Folge von Eckpunkten Benötigte Methoden auf dem Polygon Hinzufügen von Eckpunkten Abzählen von Schnittpunkten des Polygons mit einer Geraden, dargestellt durch Punkt und Richtung (für die Entscheidung ob Punkt innen liegt) Aufzählen von inneren Punkten (für das Füllen) 8

Verkettete Liste von Eckpunkten public class Vertex { public int x, y; public Vertex next; Vertex(int x0, int y0, Vertex nxt){ next = nxt; x = x0; y = y0; x y next x y next x y next 4/8/2016 9

Polygon: zirkuläre Liste von Eckpunkten public class Polygon { Vertex first, last; Polygon() { first = null; last = null; (5,10) 0,0 5,10 10,0 (0,0) (10, 0) 4/8/2016 10

Invarianten der zirkulären Liste Entweder: keine Ecke first == last == null oder: eine Ecke first last first last first == last && first!= null && first.next == last && last.next = first x y next oder: mehr als eine Ecke first!= last && last.next == first first last x y next x y next x y next 11

Polygon = Zirkuläre Liste von Eckpunkten public class Polygon { Vertex first, last; Polygon() {... // add point to the linked circular list public void AddPoint(int x, int y) { Vertex v = new Vertex(x,y,first); if (first == null){ first = v; last = v; last.next = v; last = v; 12

Point in Polygon Algorithmus Live Coding in der Vorlesung. Auf separaten Slides als Präsentation. 4/8/2016 13

PointInPolygon public boolean PointInPolygon(int px, int py) { if (first == last) // keine oder eine Ecke return false; Vertex v = first; // Invariante: first.next!= first boolean b = false; // "Zähl"variable (false -> true -> false... ) do { if (IntersectHorizontalLeft(px, py, v, v.next)) b =!b; v= v.next; while (v!= first); return b; 4/8/2016 14

Schnitt boolean IntersectHorizontalLeft(int x, int y, Vertex a, Vertex b) { if (b.y < y && y <= a.y) { // Kante von oben nach unten return (x-a.x) * (b.y - a.y) <= (b.x-a.x)*(y-a.y); else if(a.y < y && y <= b.y) { // Kante von unten nach oben return (x-a.x) * (b.y - a.y) >= (b.x-a.x)*(y-a.y); else return false; 4/8/2016 15

DISKRETISIERUNG: LINIEN ZEICHNEN

Diskretisierung Überführung einer kontinuierlichen Menge Ω in eine diskretisierte, üblicherweise auch endliche, "möglichst passende" Repräsentation M. Manchmal M Ω. 17

Diskretisierung: Beispiele Computergraphik: Abbildungen über R 2 werden zu gefärbten Pixeln über einem Rechteck 0,, w 1 0,, h 1 Numerische Integration: Diskretisierung des Definitionsbereiches Differentiale werden zu Differenzen 18

Linien zeichnen Angenommen Startpunkt p und Enpunkt q einer Linie im R 2 liegen bereits auf dem Gitter, also Linie von p nach q im R 2 p = p x, p y Z 2 q = q x, q y Z 2 pq = p + λ p q : 0 λ 1 R 2 Entsprechende Linie im Z 2? 4/8/2016 19

Diskrete Linien Betrachte flache Linie mit dy < dx q Liniengleichung y(x) = p y + (x p x ) dy dx Diskretisiere durch Runden: y(x) = p y + x p x dy dx + 1 2 p dx = q x p x dy = q y p y 4/8/2016 20

Bemerkungen Genauso für steile Linien (Tausche Rolle von y und x) Linien sind 8-verbunden, d.h. benachbarte diskrete Punkte der Linie liegen in der 8er-Nachbarschaft 8 verbunden Für flache Linien wählt man alle Punkte im Gitter, deren vertikaler Abstand zur Linie maximal 0.5 beträgt. Bei Gleichheit entweder nur den oberen oder nur den unteren Punkt 4/8/2016 21

Live Coding: Linien zeichnen 4/8/2016 22

Draw Line Implementation public static void Line(ImageViewer v, int px, int py, int qx, int qy) { int dx = (qx-px); int dy = (qy-py); int incx = 1; if (dx < 0) incx = -1; int incy = 1; if (dy < 0) incy = -1; if (dx*incx > dy*incy) { // horizontal for (int x = px; x <= qx; x+= incx) { int y = py + (int)((double)(x-px) * (dy) / dx + 0.5); v.dot(x, y); else { // vertical for (int y = py; y <= qy; y+= incy) { int x = px + (int)((double)(y-py) * (dx) / dy + 0.5); v.dot(x, y); incx=-1 incy=+1 incx=-1 incy=-1 dx > dy incx=+1 incy=+1 incx=+1 incy=-1 dx > dy 4/8/2016 23

Fliesskommaarithmetik Integer Arithmetik int dx = (qx-px); int dx2 = dx / 2;... Ersetze int y = py + (int)((double)(x-px) * (dy) / dx + 0.5); durch int y = py + ((x-px)*dy+dx2)/dx; 4/8/2016 24

Superkompakt: Bresenham Algorithmus int dx = Math.abs(x1-x0); int sx = x0<x1? 1 : -1; int dy = -Math.abs(y1-y0); int sy = y0<y1? 1 : -1; int err = dx+dy; while(x0!= x1 y0!= y1) { dot(x0, y0); if (2*err > dy) { err += dy; x0 += sx; if (2*err < dx) { err += dx; y0 += sy; dot(x1,y1); Idee des Algorithums: Geradengleichung im R 2 : dy x p x dx y p y = 0 Ständige Korrektur des Diskretisierungsfehlers ε = dy x p x dx y p y während des Durchlaufens der Geraden. Wir vertiefen das hier nicht. 25