Grundlagen der Computergeometrie
Transcription
Grundlagen der Computergeometrie
Grundlagen der Computergeometrie Übung 9 1 Windungszahlen Aufgabe a) Wie berechnet man die Windungszahl eines Punktes bezogen auf ein Polygon? (1 Punkt) b) Gegeben seien ein überschlagsfreies Polygon und ein Punkt. Die Berechnung der Windungszahl des Punktes bezogen auf das Polygon ergebe 3. Welchen Schluss ziehen Sie? (1 Punkt) c) Implementieren Sie die Berechnung einer Windungszahl eines Punktes im Bezug auf ein Polygon in der Methode Polygon2.WindingNumber(). d) Implementieren Sie das Windungszahlverfahren für den Punkt-in-Polygon-Test in der Methode Polygon2.Contains(). e) Wie kann man die Orientierung eines überschlagsfreien Polygons mithilfe der Berechnung einer Windungszahl feststellen? (1 Punkt) Prüfen Sie Ihren Ansatz, indem Sie die Implementierung der Methode Polygon2.Orientation() entsprechend ändern. Lösung a) Die Windungszahl π€β (π) eines Streckenzugs β = π1 π2 β¦ ππ mit π1 = ππ um einen Punkt π ermittelt man wie folgt. πβ1 β©ππ β π, ππ+1 β πβͺ 1 β οΏ½ sgn(det(ππ β π, ππ+1 β π)) β acos οΏ½ π€β (π) = οΏ½ |ππ β π| β |ππ+1 β π| 2π π=1 Das Vorzeichen des Flächeninhalts des Dreiecks πππ ππ+1 . Dieses gibt Auskunft über die Orientierung dieses Dreiecks. Der Winkel ππ πππ+1 im Bogenmaß. Dieser Wert liegt zwischen 0 und π. b) Die Windungszahl eines Punktes außerhalb des Polygons ist immer 0. Aufgrund der Überschlagsfreiheit des Polygons ist die Windungszahl von Punkten innerhalb des Polygons immer gleich ±1. Die Windungszahl von Punkten auf dem Rand des Polygons, die keine Eckpunkte sind, ist immer ±0,5. Und die Windungszahl der Eckpunkte selbst hängt vom Innenwinkel an diesem Eckpunkt ab, ist aber immer größer als β1 und kleiner als +1 und niemals gleich 0. Wenn also die Berechnung der Windungszahl 3 ergibt, dann ist offensichtlich die Berechnung falsch, also zum Beispiel die entsprechende Methode falsch implementiert. c) public static class Polygon2 { // ... /// <summary> /// Berechnet die Windungszahl eines Punktes im Bezug /// auf ein Polygon. /// </summary> /// <param name="Points">Das Polygon.</param> /// <param name="Q">Der Punkt.</param> /// <returns>Die Windungszahl.</returns> public static double WindingNumber(Point2[] Points, Point2 Q) { // ... // Windungszahl initialisieren. double w = 0.0; // Iteration über alle Ecken des Polygons. for (int i = 0; i < N; i++) { // i-te Ecke und ihr Nachfolger. Point2 A = Points[i]; Point2 B = Points[(i + 1) % N]; // Vektoren QA und QB. Vector2 QA = A - Q; Vector2 QB = B - Q; // Determinante ... double det = Vector2.Determinant(QA, QB); // ... ist nicht 0. if (Math.Abs(det) >= 0.000001) { // Winkel zwischen den Vektoren. double phi = Vector2.Radians(QA, QB); } } } } // Windungszahl. w += Math.Sign(det) * phi; // Windungszahl. return w / (2.0 * Math.PI); // ... d) public static class Polygon2 { // ... /// <summary>Punkt-in-Polygon-Test.</summary> /// <param name="Points">Das Polygon.</param> /// <param name="Q">Der zu testende Punkt.</param> public static bool Contains(Point2[] Points, Point2 Q) { // ... // Windungszahl. double w = WindingNumber(Points, Q); // ... ist 0. if (Math.Abs(w) < 0.000001) return false; } } // ... ist nicht 0. return true; // ... e) Das Vorzeichen der Windungszahl eines Punktes im Polygon oder auf dem Rand des Polygons gibt Auskunft über die Orientierung des Polygons. Ist die Windungszahl positiv, so ist das Polygon gegen den Uhrzeigersinn orientiert. Ist sie dagegen negativ, so ist das Polygon im Uhrzeigersinn orientiert. Man kann die Orientierung eines Polygons also ermitteln, indem man die Windungszahl einer Ecke ermittelt und sich deren Vorzeichen anschaut. public static class Polygon2 { // ... /// <summary> /// Ermittelt die Orientierung eines Polygons. /// </summary> /// <param name="Points">Das Polygon.</param> public static PolygonOrientation2 Orientation(Point2[] Points) { // ... // Die Windungszahl bezogen auf die erste Ecke ... double w = WindingNumber(Points, Points[0]); // ... ist positiv. if (w > 0.0) return PolygonOrientation2.CounterClockwise; } } // ... ist negativ. else return PolygonOrientation2.Clockwise; // ... 2 Graphen, Satz von Euler und Konvexe Polyeder Graphen Ein Graph πΊ ist ein Tripel (π, πΈ, π), wobei π die Menge der Ecken und πΈ die Menge der Kanten ist. Die Funktion π ordnet jeder Kante zwei Ecken zu. Die Anzahl der Ecken sei |π| = π£, die Anzahl der Kanten sei |πΈ| = π. Wenn bei dieser Zuordnung die Reihenfolge der beiden Ecken keine Rolle spielt, dann ist πΊ ungerichtet, sonst gerichtet. gerichtet ungerichtet Wenn für jedes Eckenpaar des Graphen ein Kantenzug existiert, der die beiden Ecken miteinander verbindet, dann ist der Graph zusammenhängend, sonst nicht. nicht zusammenhängend zusammenhängend Ein Graph heißt einfach, wenn für jedes Eckenpaar maximal eine Kante existiert (es also keine Mehrfachkanten gibt) und wenn die Endpunkte jeder Kante verschieden sind (es also keine Schleifen gibt). einfach nicht einfach Ein Graph heißt einbettbar in den πΌπ, wenn man jeder Ecke einen Punkt im πΌπ und jeder Kante eine Kurve im πΌπ zuordnen kann, sodass die Kurven einfach (doppelpunktfrei) sind und einander nur in den Ecken schneiden. Jeder Graph ist in den πΌ3 einbettbar. Wenn ein Graph in den πΌ2 einbettbar ist, dann ist er planar. Mit einem Planaritätstest überprüft man, ob ein Graph planar ist. nicht planar planar Der Satz von Euler Einen beliebigen planaren Graphen kann man immer so auf ein Blatt Papier zeichnen, dass es keine Kantenschnitte gibt. In einer solchen Zeichnung wird die Euklidische Ebene immer in π disjunkte (also einander nicht schneidende) Gebiete unterteilt. Ist der Graph planar und einfach, dann kann man alle Kanten als Strecken zeichnen. Ist der Graph planar und zusammenhängend, dann gilt der Satz von Euler: 2 = πβ π + π£ Wir wollen damit nun weitere Zusammenhänge herleiten. Angenommen wir haben einen einfachen, zusammenhängenden und planaren Graphen, der die Ebene in mindestens zwei Gebiete teilt. Es gelte also π β₯ 2. In diesem Fall grenzt jedes Gebiet an mindestens drei Kanten. Es muss also folgender Zusammenhang zwischen Flächen und Kanten gelten. 3π β€ 2π Wenn wir das in den Satz von Euler einsetzen, dann erhalten wir den folgenden Zusammenhang zwischen der Anzahl der Kanten und der Anzahl der Ecken. Er gilt, wie gesagt, immer dann, wenn es mindestens zwei Flächen gibt und der Graph einfach, zusammenhängend und planar ist. 3π£ β₯ π + 6 Dieses kleine Beispiel soll zeigen, dass man aus dem Satz von Euler weitere Zusammenhänge herleiten kann, wenn man zusätzliches Wissen über den Graphen hat. Eine praktische Anwendung dafür sind konvexe Polyeder. Der Eulersche Polyedersatz Der Satz von Euler ist auch als Eulerscher Polyedersatz bekannt. Das kommt daher, dass der Satz für jedes beschränkte, konvexe Polyeder gilt. Nehmen wir das Tetraeder als Beispiel. Es hat π£ = 4 Ecken, π = 6 Kanten und π = 4 Flächen. Die Ecken und Kanten des Tetraeders bilden einen einfachen, zusammenhängenden und planaren Graphen. Tetraeder im πΌ3 Einbettung des Tetraeders in den πΌ2 . Allgemeiner gesprochen: Für jedes beschränkte, konvexe Polyeder gibt es einen zugehörigen einfachen, zusammenhängenden, planaren Graphen. Umgekehrt gilt das aber nicht. Ein einfacher, zusammenhängender, planarer Graph kann nicht automatisch als Polyeder dargestellt werden. Dafür fällt Ihnen bestimmt sofort ein Beispiel ein. Auch für beschränkte konvexe Polyeder wollen wir weitere Zusammenhänge aus dem Satz von Euler herleiten. Dazu notieren wir zunächst einige sehr triviale Feststellungen. β’ β’ β’ β’ β’ β’ Zu jeder Kante gehören genau zwei Ecken und zwei angrenzende Flächen. Jede Fläche hat genauso viele Ecken wie Kanten. Jede Fläche hat mindestens drei Ecken bzw. Kanten. Von jeder Ecke gehen mindestens drei Kanten weg. Die Anzahl der Flächen π ist die Anzahl aller Dreiecke (π3) plus die Anzahl aller Vierecke (π4 ) plus die Anzahl aller Fünfecke (π5) plus die Anzahl aller Sechsecke (π6) β¦ Die Anzahl der Ecken π£ ist die Anzahl aller Ecken mit drei weggehenden Kanten (π£3 ) plus die Anzahl aller Ecken mit vier weggehenden Kanten (π£4 ) plus die Anzahl aller Ecken mit fünf weggehenden Kanten (π£5 ) β¦ Das versuchen wir nun mathematisch darzustellen. Wenn ππ die Anzahl aller π-ecke ist und wenn π£π die Anzahl aller Ecken ist, von denen π Kanten weggehen, dann gilt offensichtlich: π = π3 + π4 + π5 + β¦ π£ = π£3 + π£4 + π£5 + β¦ Damit können wir nun die Kanten zählen. 2π = 3π3 + 4π4 + 5π5 + β¦ Es gilt weiterhin offensichtlich: 2π = 3π£3 + 4π£4 + 5π£5 + β¦ 2π β₯ 3π3 + 3π4 + 3π5 + β¦ bzw. 2π β₯ 3π£3 + 3π£4 + 3π£5 + β¦ bzw. Damit können wir außerdem folgendes herleiten: π£ = 2βπ+π 3π£ = 6 β 3π + 3π β€ 2π und analog: 6 + π β€ 3π 6 + π β€ 3π£ Für ein beschränktes, konvexes Polyeder muss also gelten: π + 6 β€ 3π β€ 2π π + 6 β€ 3π£ β€ 2π 2π β₯ 3π 2π β₯ 3π£ 3 Satz von Euler Aufgabe a) Gegeben sei ein Polyeder. Jede Fläche ist ein Dreieck und jede Ecke hat genau fünf adjazente Kanten. Wie viele Flächen, Kanten und Ecken hat das Polyeder? (1 Punkt) b) Beschreiben Sie das Polyeder, das genau 8 Kanten hat. (1 Punkt) c) Zeigen Sie, dass kein Polyeder existiert, das genau 7 Kanten hat. (1 Punkt) d) Zeigen Sie, dass ein Pentagramm kein planarer Graph ist. (1 Punkt) e) Für den Planaritätstest gibt es eine Reihe von teilweise recht komplizierten und schwierig zu implementierenden Algorithmen. Es wurde bewiesen, dass die untere Schranke für die asymptotische Laufzeit im schlechtesten Fall πͺ(π£) ist. Eine Beschleunigung im durchschnittlichen Fall kann man dennoch erreichen. Skizzieren Sie kurz, wie das gehen könnte. (1 Punkt) Lösung a) Da jede Fläche des gesuchten Polyeders ein Dreieck ist, können wir schlussfolgern, dass π = π3 . Es muss folglich 2π = 3π gelten. Diese Gleichung stellen wir auf π um. 3 π= π 2 Ähnliches gilt für die Ecken. Da jede Ecke genau fünf adjazente Kanten hat, können wir schlussfolgern, dass π£ = π£5 und folglich 5π£ = 3π gelten. Diese Gleichung stellen wir auf π£ um. 3 π£= π 5 Wir haben damit die Anzahl der Kanten und die Anzahl der Flächen jeweils in Abhängigkeit von π dargestellt. Das setzen wir nun in den Satz von Euler ein. 2=πβπ+π£ 3 3 2=πβ π+ π 2 5 π = 20 Diesen Wert setzen wir in obige Gleichungen für π und π£ ein. π = 30 π£ = 12 Das gesuchte Polyeder hat also 20 Flächen, 30 Kanten und 12 Ecken. Ein Ikosaeder hat 12 Ecken, 20 Flächen und 30 Kanten. Quelle: wikimedia.org b) Das gesuchte Polyeder hat genau π = 8 Kanten. Für die Anzahl der Ecken bedeutet das: π + 6 β€ 3π£ β€ 2π 14 β€ 3π£ β€ 16 Gleiches gilt für die Anzahl der Flächen: π£=5 π + 6 β€ 3π β€ 2π 14 β€ 3π β€ 16 π=5 Das gesuchte Polyeder hat also 8 Kanten, 5 Ecken und 5 Flächen. Die Frage ist nun, wie die Flächen aussehen. Dabei ist eines ganz klar. Wenn es insgesamt fünf Ecken sind, dann kann keine Fläche ein Sechseck sein. Es kann auch keine Fläche ein Fünfeck sein, da das Polyeder sonst kein Volumen hätte. Die Flächen können also nur Dreiecke oder Vierecke sein. π = π3 + π4 5 = π3 + π4 Wir setzen das nun ein. π3 = 5 β π4 2π = 3π3 + 4π4 16 = 3(5 β π4 ) + 4π4 π4 = 1 π3 = 4 Das Polyeder hat also eine Fläche, die ein Viereck ist, und vier Flächen, die Dreiecke sind. Es ist also eine vierseitige Pyramide. c) Der Beweis gestaltet sich recht einfach. Wir setzen einfach π = 7 an geeigneter Stelle ein, zum Beispiel: π + 6 β€ 3π β€ 2π 13 β€ 3π β€ 14 Wir sehen sofort, dass es kein π gibt, für welches die Ungleichung erfüllt ist. Folglich kann es kein Polyeder mit 7 Kanten geben. d) Schauen wir uns zunächst ein Pentagramm an. Es hat π£ = 5 Ecken und π = 10 Kanten. Wie wir sehen, ist dieser Graph zusammenhängend. Wenn er außerdem planar ist, dann muss der Satz von Euler gelten und eine planare Darstellung des Graphen die Euklidische Ebene folglich in sieben disjunkte Flächen unterteilen. 2=πβπ+π£ 2 = π β 10 + 5 π=7 Wir können weiterhin erkennen, dass der Graph einfach ist. Es gibt keine Mehrfachkanten und keine Schleifen. Weiter oben haben wir festgestellt, dass für einfache, zusammenhängende, planare Graphen, welche die Euklidische Ebene in mindestens zwei disjunkte Flächen unterteilen, der folgende Zusammenhang gelten muss. 3π β€ 2π 21 β€ 20 Der Zusammenhang gilt nicht. Folglich kann der Graph nicht planar sein. e) Eine mögliche Strategie ist die folgende. Angenommen, wir kennen die Anzahl der Ecken, Kanten und Flächen. Dann können wir vor dem eigentlichen Planaritätstest prüfen, ob der Satz von Euler gilt. Wenn nicht, dann kann der Graph nicht planar sein und wir können uns die weiteren Schritte sparen. Wenn nur die Anzahl der Ecken und die Anzahl der Kanten bekannt sind, der Graph aber noch weitere Bedingungen erfüllen muss, dann können wir wie in der vorigen Aufgabe vorgehen und anhand von Ungleichungen, die aus dem Satz von Euler hergeleitet wurden, prüfen, ob der Graph überhaupt planar sein kann.