D - Institut für Geodäsie und Geoinformation der Universität Bonn

Werbung
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
Herunterladen