Institut für Kartographie und Geoinformation
Prof. Dr. Lutz Plümer
Diskrete Mathematik II
Vorlesung 4
SS 2001
Tiefen- und Breitendurchlauf,
geometrische Algorithmen, Segmentschnitt I
Übersicht
• Abschluss Graph-Algorithmen
– Tiefendurchlauf
• Beispiel
• rekursiver Algorithmus
– Breitendurchlauf
• Beginn Geo-Algorithmen
– Prüfung auf Schnittfreiheit
– Heute: Schnitt zweier Segmente
– Nächste Woche: Schnitt von n Segmenten
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
2
Was ist neu
• In einem binären Baum hat jeder Knoten höchstens
zwei Nachfolger, in einem Graphen beliebig viele
• Ein Baum ist immer zyklenfrei, ein Graph kann
Zyklen enthalten (z.B. Do – Du – D – W im Beispiel)
• In einem Zyklus kann man unendlich viel Zeit
verbringen
• Lösung: Faden der Ariadne
(Quelle: Sagen des klassischen Altertums)
• Moderne Version: ein Boolescher Array „besucht“
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
3
Tiefendurchlauf
Do
Du
Ha
W
D
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
4
Tiefendurchlauf
Do
Du
aktuell
Ha
W
D
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
5
Tiefendurchlauf
Do
Du
besucht
Ha
W
D
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
6
Tiefendurchlauf
Do
Du
Ha
W
D
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
7
Tiefendurchlauf
Do
Du
Ha
W
D
kein Nachfolger backtracking
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
8
Tiefendurchlauf
Do
Du
Ha
W
D
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
9
Tiefendurchlauf
Do
Du
Ha
W
D
Alle Nachfolger
sind bereits
besucht
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
10
Tiefendurchlauf
Do
Du
Ha
W
D
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
11
Tiefendurchlauf
Do
Du
Ha
W
D
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
12
Tiefendurchlauf
Do
Du
Ha
W
D
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
13
Tiefendurchlauf
Do
Du
Ha
W
D
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
14
Tiefendurchlauf
Do
Du
Ha
W
D
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
15
Tiefendurchlauf
Do
Du
Ha
W
D
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
16
Tiefendurchlauf als rekursiver Algorithmus
tiefensuche(k) //Tíefendurchlauf vom Knoten k aus
{
if(besucht[k] == false)
{
drucke k;
besucht[k] = true;
for(jeder Nachfolger ki von k)
{
tiefensuche(ki);
}
}
}
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
17
Breitendurchlauf (binärer Suchbaum)
Test auf Ende
entferne
class BST {
...
void Breitendurchlauf() {
SohnListe ws = new SohnListe();
Knoten aktuell;
ws.FügeAn(wurzel);
while ((aktuell = ws.Entferne()) != null) {
System.out.println(aktuell.GibWert());
ws.FügeAn(aktuell.GibLinks());
ws.FügeAn(aktuell.GibRechts());
}
}
...
}
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
18
Breitendurchlauf
class BST {
...
void Breitendurchlauf(k) {
SohnListe ws = new SohnListe();
Knoten aktuell;
ws.FügeAn(k);
besucht[k] = true;
while ((aktuell = ws.Entferne()) != null) {
System.out.println(aktuell.GibWert());
ws.FügeAn(aktuell.GibLinks());
ws.FügeAn(aktuell.GibRechts());
}
}
...
}
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
19
Breitendurchlauf
class BST {
...
void Breitendurchlauf(k) {
SohnListe ws = new SohnListe();
Knoten aktuell;
ws.FügeAn(k);
besucht[k] = true;
while ((aktuell = ws.Entferne()) != null) {
System.out.println(aktuell.GibWert());
ws.FügeAn(aktuell.GibLinks());
ws.FügeAn(aktuell.GibRechts());
}
}
Verarbeiten
...
eines Knotens
}
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
20
Breitendurchlauf
class BST {
...
void Breitendurchlauf(k) {
SohnListe ws = new SohnListe();
Knoten aktuell;
ws.FügeAn(k);
besucht[k] = true;
while ((aktuell = ws.Entferne()) != null) {
System.out.println(aktuell.GibWert());
for(jeder Nachfolger ki von aktuell) {
if(besucht[ki] == false)
{
ws.FügeAn(ki);
besucht[ki] = true; }
}
}
} ...
}
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
21
Prüfung auf Schnittfreiheit
• 1. Idee
– Berechnung der Geradengleichungen g und g‘ der
Segmente s und s‘
– Schnittpunkt p von g und g‘
– prüfe ob p in s und s‘
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
22
Schnittpunktberechnung
Gegeben: Endpunkte der Segmente
Geradengleichung für zwei Punkte:
y2 y1
y y1
( x x1 )
x 2 x1
g: y a x b
g' : y a' x b'
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
23
Prüfung auf Schnittfreiheit
• 1. Idee
– Berechnung der Geradengleichungen g und g‘ der
Segmente s und s‘
– Schnittpunkt p von g und g‘
– prüfe ob p in s und s‘
• Problem
– vertikale Segmente
– Vermeidung unangenehmer Sonderfälle
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
24
Segmentschnitt I
g1
g2
a)
g1
g2
g2
g1
b)
c)
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
25
Segmentschnitt II
• Reduktion auf das Problem:
P1, P2 liegen auf der
gleichen / verschiedenen
Seiten der durch g
induzierten Geraden
• Homogene Koordinaten:
P1 = (x1,y1,w1)
P2 = (x2,y2,w2)
P = (x,y,w)
• w = w1 = w2 = 1
x x1 x2
D( P , P1 , P2 ) D y y1 y2
w w1 w2
y
D=0
D>0
P2
P
s
D<0
P1
x
wenn D 0 ist, liegt P links von g
wenn D 0 ist, liegt P rechts von g
wenn D 0 ist, liegt P auf g
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
26
Was wird durch die Determinante berechnet?
Z
Vektoren spannen
Parallelepiped auf
Y
x
p2
P
P2
p
1
p1
P1
y
X
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
27
Spatprodukt
Das Spatprodukt (a b ) c ergibt einen Skalar, der
zahlenmäßig gleich dem Volumen des von den drei
Vektoren gebildeten Parallelepipeds ist; das Ergebnis
ist positiv, falls a, b und c ein Rechtssystem, negativ,
falls sie ein Linkssystem bilden.
(a b ) c a b c b c a c a b
a x bx c x
-a c b -b a c -c b a a y b y c y
a z bz c z
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
28
Rechts- oder Linkssystem?
Bilden ein
Rechtssystem
Z
p1 p2
Y
x
p2
P
P2
p
1
p1
P1
y
X
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
29
Rechts- oder Linkssystem?
Z
p, p1 und p2 bilden ein Rechtssystem
D>0
Y
x
p2
P
P2
p
1
p1
P1
y
X
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
30
Rechts- oder Linkssystem?
Z
Y
x
p1
P
P1
p
1
p1 p2
p2
P2
y
X
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
31
Rechts- oder Linkssystem?
Z
p, p1 und p2 bilden ein Linkssystem
D<0
Y
x
p1
P
P1
p
1
p2
P2
y
X
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
32
Rechts- oder Linkssystem?
Z
Es wird kein
Parallelepiped
aufgespannt
D=0
Y
x
p2
P
p
1
P1
p1
P2
y
X
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
33
Einfacher Segmentschnitt I
P2
g
P2
P1
P3
P3
P4
P4
g`
P3
S1 = det ( P1,P3,P4)
S2 = det ( P2,P3,P4)
S3 = det ( P3,P1,P2)
S4 = det ( P4,P1,P2)
P1
P2
P4
P1
Def.: Vor.: Alle Determinanten sind 0:
g und g` schneiden sich genau dann, wenn S1, S2
sowie S3, S4 jeweils verschiedene Vorzeichen
haben.
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
34
Einfacher Segmentschnitt II
Wenn alle Determinanten gleich Null sind, dann folgt daraus, daß
alle vier Punkte kollinear sind.
- eine Determinante ist Null:
=> Algorithmus: Einsparen von Multiplikationen
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 4
35