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.