Eck. Und man hat sich halt auch lange gefragt,
was ist alles möglich mit Zirkel in Ideal?
Das ist jetzt zwar nicht Thema, aber nur so weit,
man kann immer nicht alles konstruieren.
Also zum Beispiel sieben Ecke lassen sich nicht konstruieren oder
auch 13 Ecke lassen sich nicht konstruieren.
Das ist aber schon halt eine frühe Form von Algorithmen.
Das heißt, man geht nach einer bestimmten Anweisungsreihenfolge,
geht man vor, um halt irgendein Ziel zu erreichen
So, wo lassen sich geometrische Probleme überall benutzen?
Wo sind die Anwendungen? Seit den 80er Jahren wird es
halt auch mit Computern, wird alles Geometrie gemacht.
Das ist dann die algorithmische Geometrie. Und es gibt halt,
ja, es gibt halt wirklich sehr viele Anwendungen in der Informatik.
Also Bild verarbeiten, Computergrafik, Computerspiele, da muss man Dreiecksgitter berechnen.
Geografie ist auch sehr, sehr wichtig. Da muss man zum Beispiel,
wenn man die Distanz von Punkt A zu Punkt B
auf einer Kugel wissen will,
muss man halt Geometrie benutzen
Und dasselbe auch, wenn man Chips oder Cat-Software, will man halt automatisch entwerfen.
Und da muss man halt auch diese ganzen Konstruktionssachen,
muss man wissen, wie brechne ich die Schnitte von Linien,
wie berechne ich irgendwie irgendwelche Regionen von Objekten, die sie umschließen.
Und natürlich, das Ganze ist auch in der Bierinformatik-Rechtfall verbreitet. Zum einen gibt es natürlich die,
weil wir auch relativ viel Moleküle sind, Graphen,
weil wir relativ viel mit diesen Graphen arbeiten,
also die Graphenvisualisierung, Visualisierung von Netzwerken, von Molekülen,
dann die ganze Sache mit Molekülmechanik Und Dynamik,
da haben wir Bolyküle oder Proteine mit 3D-Koordinaten.
Und da will man dann wissen, wie groß ist das
Protein oder wie groß ist eine Bindetasche, was passt in eine Bindetasche rein.
Solche Fragestellungen lassen sich alle mit der algorithmischen Geometrie oder mit Algorithmen aus diesem Gebiet beantworten.
Ja, Grundlagen sollten eigentlich aus der Schule bekannt sein. Es gibt,
wenn man das Ganze im Rechner machen will,
kann man dem Rechner nicht sagen, benutze Zirkel und Lineal,
sondern man muss dem irgendwie sagen, Man hat ein Koordinatensystem.
Es gibt Graden, haben die Gradengleichung, Liniensegmente,
können beschrieben werden und auch in 3D können Ebenen beschrieben werden.
Also hier sieht man als Beispiel, im 2D eine Gradengleichung,
das wäre einmal die bekannte Formel X gleich Plus,
Slamdamal A, also wo man dann Achsenabschnitt und Steigung hat.
Und die andere Form ist, wenn man die normale auf
der Graden betrachtet, ist das die hessische Normalform. Das heißt,
wenn man einen Punkt, einen Punkt auf der Grade,
Ein beliebiger Punkt x, minus, der Parameter,
der gerade, diese gerade bestimmt, also irgendein beliebiger Punkt,
der auf der gerade schon liegt, mal dem Normalvektor muss null ergeben.
Wobei, das ist hier natürlich das Galabprodukt. Und ja,
diese Formel lässt sich halt auch für den 3D-Verallgemeinern,
im 3D haben wir halt auch eine normale, das ist dann ein 3D-Vektor,
der auf einer Ebene liegt und mit der Ebene,
also senkrecht auf der Ebene liegt, das heißt,
das Galabprodukt muss null sein.
Wenn man Liniensegmente betrachtet, Macht man das typischerweise so,
also dass es hier wieder dieselbe Formel wieder oben,
also P plus Lamm da mal A. Hier haben wir dann zwei Punkte,
die das Liniensegment abschließen.
Also dieses Liniensegment geht vom Punkt P1 bis zum Punkt P2.
Das heißt, wir haben, wir nehmen den Punkt 1
als Stützfektor und P2 minus P1 ist der Richtungsvektor der Graden.
Und das Lamm da,
wenn dieses Lamm da sich zwischen 0 und 1 befindet,
kriegen wir damit alle Punkte,
die sich auf einem bestimmten Liniensegment befinden
So, ja, das sollte eigentlich auch noch alles bekannt sein,
wie addiert man Vektoren, indem man halt die Komponentenweise addiert.
Wie skaliert man Vektoren, indem man sie auch komponentenweise skaliert?
Das Galaprodukt ist im Zusammenhang mit dem Winkel,
beziehungsweise mit dem Skalaprodukt,
wenn man zum Beispiel die Länge eines Vektors ausrechnet,
nimmt man den Vektor mit sich selbst mal.
Das Kreuzprodukt dient dazu im dreidimensionalen,
einfach einen senkrechten Vektor auf zwei anderen Lektoren
zu berechnen
Ja, und da weiß man halt immer nicht,
wenn man hier, in welcher Reihenfolge man A und B nimmt,
also wenn man A und B so nimmt,
dann kommt der Vektor oben raus, wenn man B&A vertauscht,
dann kommt der Vektor nach unten raus beim Kreuzprodukt.
Es sollte eigentlich alles noch soweit bekannt sein. Ja,
die Distanz lässt sich mit der akklidischen Distanz ausrechnen,
das heißt, man bildet,
man subprechiert die beiden Vektoren voneinander,
bekommt den Richtungsvektor und berechnet die Länge von diesem Vektor
Der Schnittpunkt von zwei Graden in diesem Fall,
also x gleich People's Lamde A, x gleich Kuplus Mühbe.
Ergibt sich dadurch, dass man dieses Gleichungssystem einfach gleichsetzt.
Das heißt, wenn man jetzt die vorderen,
den vorderen Teil betrachtet, sind das die beiden Gleichungssysteme,
da die Vektoren alle zweidimensional sind,
hat man zwei Gleichungen mit zwei Unbekannten.
Diese Gleichung lässt sich eindeutig auflösen. Und die Lösung dieser Gleichung,
also man löst nach Lamde und nach Müh auf,
die Lösung dieser Gleichung,
ergibt den Schnittpunkt von Vergleich,
von zwei Graden
Dasselbe lässt sich natürlich im 3D machen, also wenn man drei Graden hat,
da kann es dann natürlich passieren, da bräuchte man halt,
damit man einen eindeutigen Schnittpunkt hat, wenn der existiert,
braucht man natürlich drei Gleichungen, um sie eindeutig aufzulösen.
Dasselbe kann man auch machen,
um zum Beispiel den Schnittpunkt gerade mit einer Ebene festzustellen oder wenn man eine Kugelgleichung hat,
den Schnittpunkt von einer Ebene mit einer Kugel,
all diese Sachen kann man, äh,
einen Schnittkreis von einer Ebene mit einer Mönnerkugel,
also all diese Sachen kann man,
macht man üblicherweise über das Lösen von Gleichungssystemen
Eine weitere wichtige Sache ist, wie man die Distanz von
einem Punkt zu einer Ebene oder zu einer Gerade im 2D berechnet.
Dafür benutzt man wieder die hessische Normalform. Das heißt,
man hat die Gerade, auf der ein Normalvektor liegt und nimmt,
also das ist quasi direkt diese Gleichung, der Normalvektor SN.
Und ja, man setzt es halt einfach den Punkt,
von dem man wissen will,
wie weit ist er von dieser Ebene entfernt.
Den setzt man hier anstatt auf der Folgenfolie,
müsste da X gestanden haben
Also für dieses X setzt man einfach den Punkt ein,
von dem man die Distanz zur Ebene berechnen möchte.
Und man kriegt dann die Distanz in Vielfachen des normalen Vektors.
Und wenn man halt wirklich eine Distanz, eine normierte Distanz haben will,
muss man diese Distanz noch durch den Betrag oder die Länge des normalen Vektors teilen.
Genau, also diese Formel,
da die in 2D und in 3D ist,
kann man im 2D,
kann man die Distanz von einem Punkt zu einer Graden
bestimmen und im 3D kann man die Distanz von einem Punkt
seiner Ebene bestimmen
Ja, das Letzte, was auch noch relativ wichtig ist,
ist, dass, also das heißt Kreuzprodukt im 2D,
hat aber nichts mit dem Kreuzprodukt im 3D zu tun.
Hier wird einfach die folgende dierte Manante ausgerechnet. Also es
gibt direkt diese Formel. Und wenn man das auf 2D-Vektoren
anwendet, kann man damit feststellen, welcher Fall stattfindet.
Also wir haben ein Vektor A und ein Vektor B und
ob es hier einen, wenn man hier lang geht,
läuft auf diesen beiden Graden,
ob es einen rechts biegen oder
eine Linksbiegung hat
Wenn dieser, wenn hier null rauskommt, hat man,
ist entweder die beiden Vektoren, sind halt in dieselbe Richtung oder entgegen.
Also der Vektor B könnte dann auch in die entgegengesetzte Richtung
von A zeigen, aber die liegen halt direkt aufeinander.
Und dieses Kreuzprodukt kann man auch sehr gut dazu benutzen,
um zum Beispiel, wenn man Vektoren hat,
wenn man sich das jetzt vorstellt,
ich habe hier so eine Reihe von Vektoren,
um die halt zum Beispiel nach dem Polarwinkel zu sortieren.
Also ich kann halt immer gucken, welcher Vektor wo ergibt die Rechtsbiegung immer eins.
Und dann kann ich die im Kreis um den Ursprung anordnen,
wobei die Vektoren dann nach ihrem Polarwinkel geordnet sind.
Das ist besser, weil dieser Formel keine Winkelberechnung enthält.
Also da ist kein Akkus größer, nur ist kein Akkus Tangiens drin.
Und er führt halt dazu, dass man einfach Sachen sortieren kann.
Also das werden wir später noch brauchen. Gut,
dann nach dieser Kurzeinführung in Vektorrechnung bereits bekannte Sachen,
kommt es jetzt zu, kommen wir jetzt zu Algorithmen,
Entwurfstechniken, die man halt bei einer algorithmischen Geometrie immer wiederfindet.
Und eine Sache, die man immer wieder findet, ist das Scanline-Prinzip.
Und für das Scanline-Prinzip stellt man erst mal fest,
ich habe, wenn man sich im 2D befindet,
also wenn man sich eine reelle Zahlen gerade anguckt,
haben alle Zahlen eine Ordnung.
Und man kann zum Beispiel eine minäre Suche machen,
um irgendwie schnell einen gewünschten Wert zu finden.
Oder ich kann die Zahlen alle der Reihe nach anordnen.
Sobald ich den 2D betrachte,
ist es nicht mehr klar, wie ich die Zahlen in
einer festen Reihenfolge
anordnen kann
Also, Mann, Mann, Mann, man kann also,
man kann also keine natürliche Ordnung mehr für Zahlen in höherwertigen Vektorräumen
feststellen oder so einfach machen, die halt direkt sich ergibt.
Und man will aber trotzdem diese Objekte auf eine systematische Art und Weise durchgehen,
also dass sich die zum Beispiel irgendwelche Linien in einer gewissen Reihenfolge durchgehe.
Und was man machen muss, ist,
man muss sich eine Reihenfolge schaffen und das macht man,
indem man diesem Fall, also eine Scannline,
zum Beispiel von links nach rechts.
Man könnte ja auch von unten nach oben oder irgendwie so schräg drüber ziehen.
Die Richtung ist quasi egal. Hauptsache, man hat eine feste Richtung,
in der man eine Scanline über die Objekte zieht,
von denen man irgendwelche Eigenschaften ermitteln möchte. Ja,
und was man dann typischerweise macht, ist,
dass man, während man diese Scanline über die Objekte zieht,
von denen man irgendwas wissen will, betrachtet man zu jedem,
betrachtet man immer diese einzelnen Zeitpunkte, betrachtet man alle Objekte,
die sich hier unter dieser Linie befinden.
Ja, das heißt, wir haben ein Endminus dimensionales Problem,
dann endminus einsteministales Problem zerlegt,
indem wir eine Dimension wegbekommen oder beziehungsweise durch die Zeit ersetzen,
die diese Scanline braucht, um von links nach rechts zu laufen.
Genau, also hier in diesem Beispiel ging es dann zum
Beispiel darum, welche Rechtecke sich an welchen Stellen überschneiden.
Gut, das wollen wir jetzt direkt anwenden, indem wir
einen Algorithmus entwickeln möchten, in dem es darum geht, vertikale Sichtbarkeit festzustellen.
Also das Problem, wir haben eine Reihe von horizontalen Liniensegmenten,
also hier A, B, C, D, E, F.
Und es geht darum, alle Paare von vertikaler Sichtbarkeit festzustellen.
Was ist eine vertikale Sichtbarkeit? Vertikale Sichtbarkeit ist zum Beispiel
die Linie C, C, C, C,
die Linie B. Oder die Linie C, sieht die Linie D.
Die Linie C sieht aber nicht die Linie eh,
weil die von D verdeckt ist
Gut, und die Idee ist hier angedeutet,
also man läuft mit einer Scan-Linie von links nach rechts
über die Linien drüber und betrachtet an bestimmten Eventpunkten.
Welche Linien überschneiden sich jetzt gerade unter der Scan-Linie?
Und Mann, Mann betrachtet dabei,
also wenn man diese Scan-Linie an diesem Zeitpunkt sich anschaut,
betrachtet man die Liniensegmente nach der Höhe sortiert.
Also in einer Datenstruktur wird dann drin stehen, C,
B, D steht noch nicht drin und A,
an dieser Stelle
Und wenn man diese Liniensegmente nach der Höhe sortiert hat,
ist es direkt klar, welche Liniensegmente sichtbar sind.
An diesem Zeitpunkt sind nämlich,
oder sehen sich die Linien, wenn man C betrachtet,
C sieht seinen Vorgänger und seinen Nachfolger, es hat keinen Nachfolger,
beziehungsweise B sieht halt den direkten Vorgänger in der Sortierung und den direkten Nachgänger,
also A und C.
So, jetzt könnte man natürlich drangehen und sagen,
was sind diese Events? Ich gehe da irgendwie in Schritten
drüber, wie groß ist die Schrittbreite oder was für Schritte
nehme ich
Was man stattdessen macht, man betrachtet, wo sind überhaupt
Events nötig. Also wo ändert sich was an der Vertikalen
Sichtbarkeit und die Vertikale Sichtbarkeit ändert sich nur dann,
wenn man an einem Anfangspunkt einer Linie oder an einem Endpunkt in einer Linie ist,
während man auf einer einem Liniensegment sich befindet,
ändert sich an der vertikalen Sichtbarkeit zwischen den Liniensegmenten nichts.
Das heißt, wir berechnen oder wir bekommen als Eingabe die Liniensegmente,
können aus diesen Liniensegmenten direkt die Zeitpunkte berechnen,
an denen sich der Inhalt der Scanline ändert
Und ja, damit ist die Anzahl auch direkt klar.
Also wir haben in Linien gegeben. Jede Linie hat einen
Start, einen Endpunkt. Daher haben wir zwei N-Events in
der Q. Und diese Events werden der Reihe nach abgearbeitet.
Also das simuliert dieses von links nach rechts gehen.
Man sortiert die nach der X-Koordinate und der Event mit der
kleinsten X-Koordinate wird zuerst genommen.
Und dann werden die der Reihe nach in einer Queue abgearbeitet
Genau, und der Algorithmus,
also das ist die grobe Beschreibung des Algorithmus,
also zuerst wird diese Eventcue initialisiert, die Punkte werden,
eine Eventcue eingefügt und dann wird eine Schleife durchlaufen,
die jeden Punkt oder so lange Punkte aus der Q vorne weg nimmt,
bis sie Culär ist und bei jedem Event,
der passiert,
immer die Scanline aktualisiert,
also die vertikalen Liniensegmente nach der Höhe sortiert und am Ende
die Sichtbarkeit ausgibt oder direkt schon während des Algorithmus
So, das ist der entsprechende Pseudo-Code dazu.
Also der erste Schritt sieht man in Zeile 1. Die,
die Eventpunkte werden in Quo-Kuh eingefügt. In a search three,
initialisiert nur einen Suchbaum, da kann man einen beliebigen Suchbaum nehmen,
das kann ein rot-schwarz-Baum sein, das kann eine unsortierter sein,
was natürlich nicht ganz effizient ist,
aber also man nimmt halt typischerweise einen sortierten Suchbaum.
Und die Hauptschleife läuft dann so lange, bis die Q leer ist.
Und in Zeile 4 sieht man das immer,
der nächste Eventpunkt aus der Q rausgenommen wird,
das ist das Hauptgerüst des Algorithmus. Und alles andere,
was jetzt hier drin passiert, Ist das,
was die Eventbehandlung, also was passiert bei einem Linien,
also beim Linien-Anfangsevent, was passiert bei einem Linien-Event?
Ja, und es passiert, dass in Zeile 5 sieht man,
also man holt sich das Segment, was zu einem bestimmten Eventpunkt gehört.
Und schaut einfach, ob es entweder das linke Ende oder
hier unten in Zeile 11 das rechte Ende ist.
Wenn es das linke Ende ist, heißt das,
wir sind in einem neuen Liniensegment angekommen.
Wir müssen dieses Liniensegment in die Scanline einfügen.
Das wird in Zeile 7 gemacht
Und wir wissen,
wenn wir das Element in diese Scanline eingefügt haben,
dass alle Elemente in der Scanline nach der Höhe sortiert sind,
das heißt, nachdem das Element eingefügt wurde,
der direkte obere Nachbar und der direkte untere Nachbar,
ist von dem Segment aus sichtbar, was wir gerade eingefügt haben.
Ja, das heißt, Strich,
wenn es existiert und es zwei Strich,
ebenfalls wenn es existiert, sind vom Segment S aus sichtbar.
Und dann gibt man einfach diese beiden Segmente aus
und macht halt weiter
Und der zweite Fall ist, wenn wir uns an einem rechten Ende befinden,
das heißt, eine Liniensegment ist zu Ende.
In diesem Fall ist es auch so, dass es wieder sein kann,
dass das der obere oder der untere Nachbar sind halt,
ne, aber hier ist es so, dass das,
wenn ich das Liniensegment esslösche, sehen sich der obere und der untere Nachbar,
sehen sich direkt.
Das heißt, ich berechne den Strich und S2-Strich
Und nachdem es gelöscht ist, sehen sich diese beiden Punkte.
Und daher, diese beiden Segmente. Und deswegen gibt man
halt erst Strich und erst zwei Strich aus.
Und in Zeile 13 wird die Scanline-Datenstruktur aktualisiert, indem halt
das Segment jetzt rausgenommen wird, was zu Ende ist.
So, ein Beispiel dazu. Das heißt,
man fängt links an. Der erste Eventpunkt ist,
dass das Segment G startet. Das heißt,
G wird in die Scanline-Datenstruktur eingeführt
Eingefügt, dann geht es weiter zum nächsten Punkt.
Das ist, wenn das Segment A startet,
in diesem Fall wird A in die Datenstruktur eingeführt.
Jetzt wird wieder geguckt, welche Elemente sind direkt über A,
welche sind direkt unter A. Unter A ist nur G,
deswegen wird AG ausgegeben. Dann geht es weiter,
also dann sind wir bei B, B wird eingefügt.
Wieder wird geguckt, welches Element ist oben drüber,
welches Element ist unten drunter.
Die beiden Elemente werden ausgegeben und dann geht es bei C weiter.
Das ist auch wieder dasselbe. Das heißt,
bei C kommen dann CB,
CG werden ausgegeben
Dann bei E wird CE und EG ausgegeben. Also CE,
CG, die beiden. Und dann befinden wir es an dieser Stelle,
wo das LERV sich, wo das Segment C aufhört.
Das heißt, in diesem Fall wird C aus der Scanline entfernt.
Und man schaut, welchen Vorgänger und welchen Nachfolger hatte C.
Das wären BE. Das heißt, in diesem Fall
sind dann auch BE sichtbar
Ja, also, diese Scanline-Datenstruktur, hatte ich bereits gesagt,
also typischerweise nimmt man einen sortierten Suchbaum.
Wir brauchen als Operation einfügen, löschen und Vorgänger und Nachfolger
finden. Und wenn man dafür einen balancierten Suchbaum,
wie einen rot-schwarz-Baum oder ähnliches benutzt,
gehen alle diese Operationen in der Sidelock von N. Und ja,
also wenn man sich jetzt den Algorithmus anguckt,
kann man halt die Gesamtlaufzeit relativ einfach Wir bestimmen,
nämlich zuerst müssen wir die Eventcue erstellen.
Das erstellende Eventcue. Dazu müssen wir die Punkte nach der X-Koordinate sortieren.
Dadurch kommt, haben wir die Zeit fürs Sortieren.
Also die ist natürlich end-lock-in. Dann gibt es maximal zwei N-Events
. Und pro Event, wenn wir uns das angucken,
was bei den Fällen passiert, also wird dreimal auf die Baum-Datenstruktur zugegriffen.
i3 ist egal. Das heißt, wir haben halt Lock-End-Zeit
für jede Abarbeitung eines Events. Wir haben zwei N-Events,
das heißt auch die Gesamtabarbeitung der Events braucht N-Lock-End-Laufzeit und wir kommen insgesamt mit N-Lock-End-Laufzeit aus.
Und ja, also man könnte halt auch gucken,
ob man, wenn man irgendwie die Events irgendwie vorsortiert bekommt,
ob man dann irgendwie ein bisschen Zeit sparen kann,
ist aber bis heute
nicht gelöst
So, dann geht's weiter mit dem etwas, mit dem allgemeinen Linie-Segmentschnitt-Problem.
Also wir beschränken uns jetzt nicht mehr nur auf Linien,
die horizontal liegen, sondern auch mit Linien,
die beliebig im Raum liegen. Das heißt,
in diesem Fall haben wir eine Menge von Liniensegmenten gegeben,
die, also Endliniensegmente, wobei die Fragestellung ist,
welcher,
also entweder welche Liniensegmente schneiden sich bzw. zuerst einmal schneiden sich
überhaupt irgendwelche dieser Liniensegmente in irgendeinem Punkt
Ja, man kann sich leichter in Algorithmus überlegen,
der das Problem löst, indem wir einfach ein paarweise alle Linien durchgehen,
gucken, dieses lineare gleiche System lösen, gucken,
gibt es einen Schnittpunkt, existiert der, ja,
nein und können das Problem damit relativ einfach lösen.
Das Problem ist in dem Fall nur die Laufzeit,
weil wir, es kann halt passieren,
dass man bis zur Endquadratschnitte bekommt.
Kann mir irgendjemand sagen, wie man das konstruiert kriegt,
wie kriegt man mit Endliniensegmenten Endquadratschnitte
Ja. Jeder andere Linie schneidet. Ja, und wie wird man
die halt anordnen, damit jede Linie, jeder andere, ja?
Die müssen nicht alle deinen Punkt schneiden. Da sind ja
jeder mit jeder anderen schneiden. Dann hätte man aber,
dann wird sich jeder mit, aber dann hätte man nur
einen Schnittpunkt und jeder hätte halt einen Schnittpunkt geben mit jeder anderen.
Das heißt,
man hat Endschnittpunkte
Einen gleichmäßigen NEC hat man, glaube ich, auch.
Da hätte man dann, also wenn die so aneinanderliegen,
hat man N-minus Einschnitte.
Ja. Inhalte zu berühren und melden. Genau, so
eine Raute. Also Mann, Mann. Man hat Liniensegmente,
die ein halbe in die Richtung und die anderen in die Richtung.
Und dann geben sich hier überall,
ergeben sich Schnittpunkte
Ja, und das heißt, also man sieht natürlich,
wenn man jetzt diesen Fall hat, kann es natürlich keinen Algorithmus geben,
der alle Linienschnitte ausgibt, der besser als Endquadrat ist.
Weil es kann ja maximal in der Worst-Case-Laufzeit Endquadratschnitte geben.
Und deswegen, also komme ich gleich nochmal zu,
also vorweg, also das nennt man halt Output sensitive Zeit.
Also man betrachtet diese Anzahl der Schnitte, die sie es
ja geben, betrachtet mal als zusätzlichen Parameter als K.
Und hat den in dieser Urlaubzeit getrennt von der Laufzeit des eigentlichen Algorithmus,
weil es halt, wie gesagt, je nachdem,
wie halt das Problem gegeben ist, macht man sich damit,
wenn man jetzt einen N-Log-N-Algorithmus für das Linienschnittproblem findet.
Man hat aber Endquadratschnitte, dann wird dieser Algorithmus halt
auch Endquadratzeit brauchen, weil er alle Linienschnitte zurückgeben muss.
Und wir wollen in diesem Fall jetzt auch wieder eine Scanline benutzen und als Notation nimmt man hier,
wenn, also dieses Zeichen heißt A, nicht oberhalb von B bezüglich der,
also an X-Koordinate X, also wenn man Also in diesem Fall,
wenn das hier A, wenn das hier B ist,
dann wird an dieser Stelle an dieser Stelle X,
wird halt A, in diesem Fall wird halt B,
oberhalb von A liegen.
Und ja, also man sieht an diesem Beispiel sieht man
auch direkt, dass diese Relation sich ändert.
Also wenn man hier an dieser Position X ist,
liegt hier B, oberhalb von A,
wenn man an dem Schnittpunkt ist,
kehrt sich diese Reihenfolge um und hier liegt dann A,
oberhalb von B danach
So, der erste Algorithmus gibt nur zurück. Gibt es
einen Schnitt oder gibt es keinen Schnitt? Und die Idee ist auch,
beziehungsweise das Prinzip ist auch wieder, genau wie bei einem vertikalen Sichtbarkeitsalgorithmus,
man geht mit einer Scanline von links nach rechts und arbeitet die Events der QU ab.
Die Events der Q sind wieder Anfang und Endpunkte der Liniensegmente und Ähm...
In diesem Fall müssen wir die Schnittpunkte noch nicht als eigene Events betrachten. Also,
wir fangen wieder an, indem wir alle Events nach ihrer X-Koordinate sortieren und in die Q einfügen,
dann wird der Suchbaum initialisiert und man benutzt halt diese Brutsche Variable Found,
um die Schleife frühzeitig abzubrechen zu können,
sobald man den ersten Schnitt gefunden hat.
So, das heißt, ja,
in Zeile 4 und 5 ist wieder, ähm,
dasselbe, bis auf das Found,
um früher abbrechen zu können,
dasselbe wie im Algorithmusfeuer,
man geht so lange durch die Q oder so lange
durch die Events durch bis Secure
leer ist
In Zeile 6 holt man sich wieder das Liniensegment,
was zu einem bestimmten Eventpunkt gehört.
Und wenn es in diesem Fall das linke Ende ist,
dann fügt man halt dieses Segment wieder in die Scanline-Datenstruktur ein.
Und schaut, ob sich die, ob sich die,
die der Vorgänger und der Nachfolger, ob die einen Schnitt
mit der gerade eingefüchten Leichung mit der gerade eingefügten Grade bilden.
Also es kann nämlich nicht sein,
wenn ich jetzt Ich habe hier so drei Linien.
Und hier oben vielleicht noch eine. Und wenn ich jetzt
hier eine Linie einfüge, jetzt zu einem späteren Zeitpunkt,
die entweder so schräg nach oben oder schräg nach unten geht,
dann kann es nämlich nicht sein.
Also ich muss, ich betrachte von dieser Linie,
muss ich mir nur den Vorgänger oder der Nachfolge angucken,
ob es da einen Schnitt gibt.
Ich muss nicht mehr gucken,
ob es hier oben einen Schnitt gibt,
weil wenn es nämlich hier oben einen Schnitt gibt,
dann hat es
auch hier einen Schnitt gegeben
Gut, also, ach so. Und in diesem Fall,
also sobald ein Schnitt gefunden wird,
bricht der Algorithmus ab und gibt am Ende aus,
ob es einen Schnitt gab oder ob es keinen Schnitt gab.
So, ja, das hatte ich vorhin schon erklärt,
also wenn man sich an einem Schnittpunkt befindet,
kehrt sich diese Ordnungsrelation um, das heißt,
danach ist sie umgekehrt und man muss diesen Zeitpunkt,
den muss man auch behandeln als Event.
Also wir können jetzt nicht mehr nur anfangen,
so einen Endpunkt anwenden, als Events behandeln,
sondern wir müssen auch diesen Schnittpunkt als Event behandeln.
Und das heißt, wir werden halt während der Algorithmus-Events abarbeitet,
werden neue Events generiert, die auch in diese Q eingefügt werden.
Und beim Einfügen muss man beachten,
dass diese Events auch an der richtigen Stelle eingefügt werden.
Also die Events haben wieder eine X-Koordinate, wo der Schnitt standfand.
Das heißt, die müssen auch,
also in diesem Fall müsste der Event SX,
der müsste vor dem Ende von B und vor dem Ende von A eingefügt werden,
beziehungsweise auch vor allen Events,
die durch irgendwelche anderen Linien oder anderen Liniensegmente
stattfinden können
Gut, und dann müssen wir uns noch überlegen,
was machen wir,
wenn so ein Schnittpunkt-Event auftritt, also wenn wir dann,
wenn wir den dann bearbeiten und was wir machen müssen ist,
wir müssen diese Ordnungsrelation, also AB war da vorher,
war vorher in der Scannline so geordnet,
dass B unter A ist, die müssen wir in der Scannline umdrehen,
dass nachdem der Event SX stattgefunden hat,
der die Ordnung andersrum ist,
also dass B über A liegt
Ja. Gut. Hier ist wieder Pseudo-Code dazu. Also
der erste Teil ist wieder exakt genauso wie in den Algorithmen davor.
Das heißt, wir initialisieren wieder die Eventcue mit allen Start- und Endpunkten der Liniensegmente.
Initialisieren den Suchbaum und laufen dann so lange weiter,
bis alle Events abgearbeitet sind.
So, und jetzt müssen wir uns wieder angucken,
was machen wir in den einzelnen Fällen.
Also in diesem Fall in Zeile 6 haben wir,
dass der Eventpunkt das linke Ende eines Liniensegmentes ist
Und in diesem Fall muss das Lehnensegment wieder eingefügt werden.
Man schaut sich den Vorgänger und den Nachfolger an und schaut,
ob dieses Liniensegment, den Vorgänger oder den Nachfolger schneidet.
Das ist hier dieses mit dem Mengensymbol dargestellt. Also wenn der Schnitt nicht leer ist,
dann wird dieser Schnitt als neuer Event in die Q-Q-Q eingefügt.
Und Genauso ist es jetzt wieder in dem Fall,
wenn ein Segment endet, wenn ein Segment endet,
schaut man sich auch wieder in den Vorgänger-Nachfolger an,
die könnten sich jetzt schneiden und löscht dieses Segment S aus der Scanline und schaut auch wieder,
ob jetzt der Vorgänger und Nachfolger,
ob die sich an einem neuen Schnittpunkt schneiden und fügt gegebenenfalls diesen neuen Schnittpunkt in die EventQ ein.
So, das Einzige, was jetzt neu ist, ist,
was passiert, wenn wir jetzt an einem Schnittpunkt uns befinden?
Das sieht man in Zeile 20. Und was da passiert ist,
dass man erstmal sich aus der Information,
die man in der Scanline hat,
ermittelt,
welche Segmente haben sich geschnitten
Die dann auch ausgibt. Also wir sind ja in einer
Aufzählung der Linienschnitte interessiert. Das heißt, wir geben auch
alle Segmente aus, die sich schneiden. Und dann,
wenn wir an diesem Punkt sind, passiert halt genau diese Operation.
Wir befinden uns an einem Schnittpunkt. Vorher war A unter B,
danach ist B unter A. Das heißt,
sie werden einfach in der, in dem Suchbaum ausgetauscht.
Und wir müssen dann schauen,
ob diese beiden Linien Ob die noch weitere, also ob die,
ob es jetzt hier oben noch irgendwelche Segmente gibt,
die auch noch geschnitten werden in der Scanline.
Also wenn das in diesem Fall,
ja, hier an der Position stattfindet. Das heißt,
wir müssen auch gucken, ob dieser Linienschnitt durch mehrere Segmente durchgeht.
Ja, also dafür nehmen wir wieder den Vorgänger und schauen,
ob der Schnitt stattfindet.
Und fügen halt diesen Schnitteventpunkt als neuen Event in die Q ein,
genau dasselbe gucken wir halt nach unten,
ob der Schnitt weitergeht
So, das Ganze wieder an einem Beispiel.
Scanline läuft wieder von links nach recht. Das heißt,
der erste Eventpunkt ist der am Startpunkt von Segment A.
Und ja, A wird einfach eingefügt. Der nächste ist halt
eh, wird einfach eingefügt, da passiert noch nichts.
Also die schneiden sich einfach nicht, die Segmente.
Dann wird B eingefügt, dann wird D eingefügt,
also immer in der Scanline nach ihrer jeweiligen Y-Koordinate sortiert
Dann wird C eingefügt, bei D passiert jetzt was.
Also da wird halt, bei D guckt man halt,
welche Segmente liegen oben drüber und welche liegen unten drunter.
Also es liegen die Segmente A und E,
oberhalb und unterhalb von D. Und das heißt, wir gucken,
ob der Schnitt zwischen diesen Segmenten nicht leer ist.
Und in diesem Fall finden wir halt den Schnitt Punkt 1. Und ja,
man berechnet die Koordinaten von dem Schnittpunkt und fügt diesen Schnittpunkt in die Scanline,
in die Event Cue, an die richtige Stelle ein.
Genau, der nächste, aber der Schnittpunkt S,
der wird halt Der wird jetzt zwar hier eingefügt,
der wird aber erst nach dem Punkt C eingefügt und nach dem Ende von Segment A. Das heißt,
die beiden Events werden noch entsprechend abgearbeitet.
Also hier kommt C zu, hier wird A aus der Scanline rausgenommen. So,
und hier passiert es jetzt,
dass da mal den Schnitt zwischen den Segmenten D und E betrachtet hat,
dass in diesem Fall das D und E und das D und E,
die werden einfach vertauscht in der Scanline und mit der richtigen Reihenfolge nach dem Schnitt weitergemacht.
Und hier wird dann auch ausgegeben,
es gibt einen Schnitt zwischen Segment E und Zwischensegment
So, dann der nächste interessante Fall ist dann,
wenn das F hier hinzukommt. Wenn das F hinzukommt,
es wird halt, der Startpunkt wird ganz oben einsortiert.
Das heißt, man schaut nur, ob das F sich
mit dem direkt da drunter liegenden Segment MB in diesem Fall
schneidet und es wird der Schnittpunkt F2 hinzugefügt werden in die Eventcue.
Also das ist in dem Fall alles,
was bei dieser Eventbehandlung passiert. Das nächste passiert erst wieder,
wenn hier der Schnittpunkt S2 bearbeitet wird,
wenn man nämlich Schnittpunkt S2 bearbeitet,
wird die Reihenfolge von B&F vertauscht
Und nach... Ach so, von hier. Da ist FB
und da ist BF. Die werden an dem Schnittpunkt S2
, sind die vertauscht worden. Und es wird dann hier
weiter geguckt. Also F schneidet das mit dem direkten Vorgänger,
also mit B, beziehungsweise schneidet es mit dem direkten Nachfolger C.
Und in diesem Fall wird halt der Schnittpunkt S3 entdeckt und
in die Eventcue eingefügt
Das, also in diesem Fall ist das Beispiel ein bisschen ungeschickt gemalt,
weil hier zwei Events an derselben Stelle stattfinden.
Also einmal das Ende von Segment B und der Schnittpunkt S3. Also
da passieren halt zwei Sachen gleichzeitig oder die werden halt kurz nacheinander abgearbeitet, die Events,
also SWB rausgenommen und dann wird C und F vertauscht und der Schnittpunkt S4 gefunden und ja,
also hier läuft er dann noch so weiter,
wird Schnittpunkt S4 bearbeitet, da werden wieder,
das wird hier getauscht, FE und F werden getauscht
Und dann hier werden beide E und F rausgenommen.
Und am Ende wird noch das Segment C rausgenommen und
die Q ist leer und Algorithmus zu Ende.
So, ja, also, hier sieht man jetzt direkt, ja.
Ist es im Allgemeinen, wenn sowas gleichzeitig passiert ist,
kann doch wichtig sein, in welcher Reihenfolge ich das mache, oder?
Ja. Wie könnte das ja,
also an Nummer F würde jetzt so hinaufgehen oder so,
und da irgendwas schreiben, was über Weh ist.
Und ich übe dann gerade entfernt, sondern wenn ich die,
also erst, wenn ich erst mal Schrittpunkten gucke, und dann die Entferne,
dann kannst du dann sich irgendwie vorm Bild Singletten ausgeben,
dann aber gar nicht mehr da sein.
Ich weiß nicht, gleichzeitig draußen. Ja, genau,
also das wollte ich eigentlich gleich auch als Frage stellen,
was ist das Problem von diesem Algorithmus beziehungsweise was kann noch an Sachen hier auftreten,
die irgendwie einem einen Strich durch die Rechnung machen könnte?
Also es kann passieren, dass irgendwie Events gleichzeitig passieren.
Es kann passieren, dass sich zum Beispiel drei Grad in einem Punkt schneiden.
Es kann passieren, dass anfangs sind Endpunkte direkt aufeinander liegen.
Also all solche Sachen, da steht dann typischerweise in Sachen,
wo diese Algorithmen beschrieben werden, steht drin.
Man nimmt an, die Liniensegmente befinden sich in allgemeiner Lage
und damit sind all diese Fälle ausgeschlossen. Das heißt,
es sind einmal diese degenerierten Fälle, man muss irgendwelche Sonderfälle behandeln,
von wegen kommt der Event vor dem, kommt der vor dem.
Die schließt man halt aus, weil diese Behandlung,
also wenn man das wirklich programmieren will, ist das deutlich komplizierter,
weil man dann natürlich all diese Fälle beachten muss,
schneiden sich drei in einem, schneiden sich zwei in einem,
treten Events gleichzeitig auf.
Das macht man einfach der Vereinfachung halt halber, damit man,
damit der Algorithmus schön kurz ist und nicht 10.000 Sonderfälle behandeln muss,
weil man diese Sonderfälle oder diese degenerierten Fälle immer in konstanter Zeit beheben kann.
Also man muss dann halt immer aufpassen, irgendwie Fallunterscheidungen machen,
was wird jetzt vor welchem Event behandelt, welcher wird nach dem behandelt.
Also man kann das entweder durch konstante Laufzeit immer verändern oder man verändert,
wenn man solche Sachen hat wie,
es wäre zum Beispiel wahrscheinlich in dem Fall mit der vertikalen Sichtbarkeit,
was passiert, wenn zwei Linien direkt übereinander liegen oder irgendwie nicht richtig liegen.
Also man kann halt zum Beispiel auch die Koordinaten einfach
so leicht verändern, um solche Fälle zu beheben.
Also da gibt es einige Tricks,
um das zu machen und da muss man relativ aufpassen,
wenn man die Sachen wirklich implementieren möchte
Ja. Das, was ich jetzt anbekommen habe,
das funktioniert aber erst mal mit zwei dimensionalen Formen, oder?
Und jetzt sind es die drei dimensionalen Formen,
dann habe ich ja schon ein Problem, das ist jetzt da, Nachfolger.
Genau, im dreidimensionalen Raum kriegt man nämlich mit dieser Scanline
die Dimension halt nicht genügend runter.
Also hier wird halt mir das Scanline auf eins. Ich weiß,
ich weiß ehrlich gesagt gar nicht, ehrlich gesagt gar nicht,
was, also ich habe noch nie einen Linienschnittalgorithmus zum 3D gesehen.
Also man kann natürlich, was man natürlich machen kann,
man kann natürlich im 3D auch einfach paarweise
alle Linien schneiden
Es geht auf jeden Fall, aber man will vielleicht da auch irgendwie einen Scanner-Algorithmus.
Also im 3D werden die Sachen typischerweise wesentlich komplizierter als im
2D. Direkt eingangs hatten, ja, funktioniert.
Bei M, die mit Suite, mit M, gute Eins.
Und hier für mehr als zwei Dimensionen, da gibt es eine Vorstellung.
Wie gesagt, das ist ja eh ein Problem,
weil er zu sagen, das ist eine Varmina-Nachfolger.
Also eine Offensichtbarkeit, was ist denn jetzt da drüber,
warum was es da drin hat?
Ja, ja
Ich glaube, ich glaube, auch im ganzen Kapitel kommt kein 3D-Algorithmus vor.
Ich habe mir das jetzt gerade nicht fürs ganz zum Ende angeguckt,
aber ich glaube, da sind alles nur 2D-Algorithmen,
die man, wo irgendwelche gometrischen Sachen gemacht werden.
Also gerade aus diesem Grund weit 3,
die halt immer noch eine Stufe komplizierter ist als 2D. Ach so,
im 3D wird man wahrscheinlich mit einer Ebene über die Liniensegmente drüber gehen.
Ja, und dann müsste man innerhalb dieser Ebene,
hat man eine 2D-Ebene und wird halt in dieser 2D-Ebene
mit einer Scanline
drüber gehen
Ja. So, hier in diesem Fall sieht man dann
auch bei der Laufzeit wieder dieses typisch Output-Sensitive. Das heißt,
wir haben in den zusätzlichen Parameter K,
der einfach die Anzahl der Ergebnisse repräsentiert,
die wir zurückbekommen können, weil wir natürlich,
wenn wir halt ein ungünstiger Anordnung von Liniensegmenten haben, bis zu Endquadrat,
Schnitte haben und dann wird uns diese Laufzeit von Endlock-in,
wird uns einfach kaputt gemacht werden.
Beziehungsweise, also das ist halt wirklich der Worst Case,
man kann natürlich auch einfach wählen,
also typischerweise hat man deutlich weniger Linienschnitte oder irgendwie wie Endlinienschnitte.
Und wenn man Endlinien-Schnitte hat, wird halt diese Laufzeit von N-Log-In,
wird halt dann dann die Ausschlaggebende sein, beziehung, ja.
So, also ja, dasselbe ist eigentlich genau wieder,
wie die Laufzeit bei dem Algorithmus davor. Das heißt,
wir haben ein Event-Cue, in die wir halt verwalten müssen.
In diesem Fall müssen wir die Event-Cue auch so machen,
dass wir, also es müssen wir als Heat machen,
weil die Events nach Ex-Koordinate in dieser Event-Cue
halt auch eingefügt werden und wieder rausgelöscht werden
Wir scannen nein, deswegen, also brauchen wir halt irgendwie
einen Hieb, der irgendwie lockerithmische Laufzeit hat.
Für die typischen Operationen, dann brauchen wir eine Scanline.
Ist wieder ein Suchbaum. Und als Gesamtlaufzeit ergibt sich in
diesem Fall halt auch wieder N plus K, mal Lock N.
Ja, man kann bei diesem Algorithmus auch immer noch betrachten,
den Speicher betrachten, wie viele Elemente muss ich in der Scanline
zu einem bestimmten Zeitpunkt oder maximal irgendwie angesammelt haben.
Und dann kann man halt auch noch gucken,
ob man solche Sachen halt noch optimieren kann.
Also hier die Laufzeit ist halt auch besser,
weil dieses K aus dem Endlock-In rausgewandert ist und hier nur
noch als Parameter da hinten steht.
Und in diesem Fall wird halt auch der Speicher,
ist halt auch linear in der Größe der Lilien-Segmente.
Und da bei dem Algorithmus ist der Speicher dann auch
nicht mehr abhängig von der Anzahl der Schnittpunkte,
die man während des Algorithmus rausbekommt
Gut, ja, das war's zu den, erstmal zu den Linienschnitten.
Das nächste Algorithmus, äh, der nächste Algorithmus ist einer, um konvexe Hüllen zu berechnen.
Ähm, Konvechsehülde, also einfach jetzt hier die Definition wieder.
Also wir haben eine Menge von Punkten gegeben. Ähm,
in diesem Fall auch wieder 2D. Im 3D kann man auch eine Konvechsehülle berechnen,
ist natürlich auch wieder komplizierter als in 2D. Ähm,
und wir suchen ein Polygon, was diese Punkte,
ja, möglichst minimal umschließt, beziehungsweise wir suchen,
die Punkte aus dieser Menge aus der Eingabemenge,
die direkt auf dieser Konvexenhülle liegen.
Was heißt Convex, Convex heißt, wenn ich,
wenn ich dieses Gebilde betrachte, ich nehme mir zwei beliebige Punkte aus diesem Polygon,
verbinde die mit einer Linie und dann müssen alle Punkte,
die auf dieser Linie sich befinden, müssen in diesem Polygon enthalten sein.
Ja, das heißt,
also es funktioniert halt bei Convexen Sachen funktioniert das halt mit allen Punkten,
das heißt, ich kann diese beiden Endpunkte nehmen oder die beiden Endpunkte und dann sieht man halt auch direkt den Unterschied zu,
wenn irgendwas Conkav ist, also wann,
wann ist es nicht konvex, nicht konvex ist es,
wenn es Ja,
also wenn halt einfach so eine Delle drin ist.
Ja, in diesem Fall könnte ich diese beiden Punkte nehmen.
Und die Punkte, die auf dieser Linie draufliegen,
wären nicht mehr in den Polygonen selber enthalten.
Das heißt, dieses Polygon ist nicht konvex, sondern in dem Fall dann Concav.
Gut. Ja, also das ist im Prinzip das,
was in dieser Definition drinsteht. So, die Idee,
die sieht jetzt zwar anders aus, also als Feuer,
weil wir jetzt in diesem Fall,
wir machen halt so eine Rotation um den Ursprung
Im Endeffekt ist es aber auch wieder ein Scanner-Algorithmus. Das heißt,
in diesem Fall wandert die Scannenline nicht von links nach rechts über die Punkte,
sondern die Scannline rotiert einmal um den Ursprung,
um halt alle Punkte zu erwischen, die man bekommt.
Gut, und die Idee dabei ist,
dass man die Punkte in einer Reihenfolge ordnet,
in der sie in dieser Konvexenhülle überhaupt vorkommen können.
Das heißt, wenn man so eine Menge von Punkten hat,
das heißt, wenn man rechts rumgeht,
dann wird man die halt einfach nach dem Polarwinkel sortieren.
Und man versucht, in diesem Fall dann Punkte,
Wenn man jetzt hier sich vorstellt,
ich gehe von dem Punkt zu dem und dann kann ich ja zu dem und zu dem,
da mache ich halt jetzt so eine Delle rein.
Das heißt, ich würde von dem eher direkt zu dem laufen.
Also diese inneren Punkte, die inliegenden Punkte,
die versucht man halt zu verhindern oder gar nicht erst zu betrachten.
Und genau, also dafür werden halt die Eingabepunkte,
die man bekommt, werden erstmal nach Polarwinkel sortiert.
Das kann man ganz am Anfang mit diesem Kreuzprodukt machen,
was halt einem sagt, ist das jetzt eine Rechtsbiege oder
Linksbiegung mit dieser Funktion oder mit diesem Operator kann man halt einfach diese Punkte sortieren.
Man kann natürlich auch die Polarwinkel ausrechnen,
aber das andere ist einfach einfacher
Und wenn wir diese Punkte haben, dann betrachten wir halt aufeinander folgende Punkte. Und je nachdem,
in welche Richtung man geht, also entweder,
wenn man so rumgeht, schaut man sich alle Punkte an,
die eine Linksbindung haben, wenn man andersrum geht,
müsste man sich Punkte anschauen, die eine Rechtsbindung haben.
Wir gehen jetzt immer gegen den Uhrzeigersinn. Das heißt,
wir schauen immer an jedem Punkt gibt es eine Linksbiegung. Ja,
weil in diesem Fall,
also wenn wir jetzt diesen innen liegenden Punkt genommen hätten,
hätten wir hier, also hier,
wenn man hier langkommt, ist eine Linksbiegung, Linksbiegung,
also beziehungsweise das ist eine Linksbiegung,
das ist aber auch eine Linksbiegung,
aber hier wäre dann auf einmal
eine Rechtsbiegung
Und das ist direkt das Kriterium, mit dem man entscheiden kann,
ob ein Punkt ein innen liegender Punkt ist oder ob ein Punkt
ein Punkt ist, der auf der Hülle außen liegt.
Ja, das ist direkter Algorithmus. Das heißt,
wir starten mit einem Punkt, der auf jeden Fall auf
der konvexen Hülle liegen muss. Das ist ein Punkt,
der also minimale Y-Koordinate und von, wenn mehrere gleiche Y-Koordinate haben,
der, der am weitesten links liegt.
Dieser Punkt muss auf jeden Fall auf der konvexen Hülle liegen.
Das heißt, wir sortieren die verbleibenden Punkte, dann die Winkel zu diesem Punkt.
Also wir betrachten diesen Punkt als neuen Ursprung in Betracht,
sortieren die anderen nach dem Polarwinkel um diesen Punkt herum.
Und in dieser Reihenfolge werden die dann einfach durchlaufen.
Also die Punkte sind P1 bis PN. Und die werden einfach in einer Vorschleife,
wird von, in dem Fall jetzt drei, bis N gelaufen,
weil wir, wir betrachten immer drei aufeinanderfolgende Punkte.
Was ist jetzt jetzt ein Beispiel vielleicht?
Ich glaube, das ist noch
ein Beispiel
Wir schauen uns immer sukzessive drei Punkte an,
sind diese drei Punkte jetzt eine Rechtskurve oder sind diese drei Punkte eine Linkskurve?
Und wenn diese drei Punkte eine Rechtskurve sind, dann wissen wir,
dass wir da, dass dieser Punkte nicht auf der Höhle liegt.
Das heißt, wir nehmen ihn vom Steck,
vom Stack runter und gehen so lange zurück,
bis wir wieder an einem Punkt haben,
von dem wir wissen,
dass er keine Rechtskurve gebildet hat und nehmen dann den wieder
dazu,
der danach kommt
Man packt drei Punkte auf den Stack und schmeißt die runter,
die eine Rechtskurve ergeben, so lange,
bis sich wieder eine Linkskurve ergibt und nimmt dann in der
nächsten Iteration den nächsten Punkt.
Also am Beispiel wird das, denke ich, deutlicher.
Man fängt halt bei einem Punkt Penol an und schaut,
hat die nach Polarkoordinaten sortiert und schaut sich dann die Punkte P1 P2 an.
In diesem Fall, jetzt bei B sieht man,
die Punkte sind eine Linkskurve.
Fall A, die Punkte sind eine Linkskurve,
also ist das okay.
Dann nimmt man
den Punkt P3 dazu
Und wenn man, dann betrachtet man P3, P2,
P1, sieht, das ist eine Rechtskurve,
man nimmt den Punkt P2 vom Stack runter und schaut dann,
ob P3, P1, P0, ob das eine Linkskurve ist,
in dem Fall ist es eine Linkskurve.
Also geht die nächste Iteration weiter. So, das,
also P3, dann kommt P4 dazu,
P4 wird auch erstmal hinzugenommen, wird hier aber bei D wieder verworfen,
weil wir den Punkt P5 angeguckt haben.
Dann, ja, P6 funktioniert, P7 funktioniert.
P8 funktioniert
Das heißt, hier, wir laufen da in so
eine Spirale rein, die eigentlich alle falsch sind.
Und in dem Fall wird man dann halt sehen, aha,
P9, ist halt, wir haben halt eine Rechtskurve und
wir müssen dann halt zwei Elemente vom Stack runterschmeißen,
damit wir wieder eine Linkskurve bekommen.
Dann funktioniert erstmal P9 im Falle von PC, ist es aber,
müssen wir dann tatsächlich drei Elemente vom Stack runterwerfen,
damit wir wieder eine Linkskurve bekommen, anstatt eine Rechtskurve.
Und PL funktioniert wieder und bei P12 ist halt auch wieder
der Fall, dass ein Element vom Stack runtergeschmissen wurde.
Und nachdem man alle Punkte durchgelaufen ist,
ist man wieder am Anfangspunkt angekommen und hat damit die Punkte,
die auf der Hülle draufliegen.
Ja, okay, also, man, ja.
Er muss so mit einem Knoten anfangen,
ja schon auf der Gewinn zu erkunden drauf bleiben.
Man muss mit einem Knoten anfangen, der auf der Hülle liegt,
weil wenn man mit einem innenliegenden Knoten anfängt, dann,
was wird dann passieren? Also ich glaube,
Mir fällt gerade, man kann dann, glaube ich,
so eine Spirale bauen, aber mir fällt gerade kein konkretes Gegenbeispiel ein.
Ich bin aber relativ sicher, dass der auf der Hülle
draufliegen muss. Ich soll wahrscheinlich gerade einfach mal gucken,
ob das von mir zuletzt noch was kann.
Ich scheine müsste die Steinbildung ein Stück weit her machen.
Ich habe es auf was valider ist. Also der erste,
der Stadtpunkt, den man nimmt,
also wenn man wirklich den Punkt nimmt, der,
man schaut sich die Y-Kordinaten an neben dem Punkt,
der am untersten liegt und am weitesten nach rechts,
dann weiß man,
dass dieser Punkt auf jeden Fall auf der Hülle liegen muss.
Und von dem startet man dann
Es hat die Frage genannt. Und man muss gemeinsam aufhören,
wenn man wieder am Start kommt,
das geht es natürlich nicht, aber wenn man weiter wird,
wenn man die Fehler doch bemerken will.
Also wenn man jetzt weiterhin anfängt, merkt man die Fehler doch,
wenn man einmal rum ist, wenn man dann in der Rechtskurve kommt.
Du musst gute Skalinenschriften geben, also man muss ja auch nicht scheinen,
wie soll man so eine Flender ausgeben, du auf der Spirale hast.
Und so ändert das so oft eine Linkskurve,
die du zugesprungen hast.
Dann ist das eingekommen
Also ich, wie gesagt, mir fällt gerade kein konkretes Beispiel an,
da es aber einfach möglich ist, einen Punkt zu finden,
der auf jeden Fall auf der konvexen Hülle liegen muss,
kann man auch direkt mit diesem Punkt anfangen und man läuft ja dann auch nur,
man läuft ja dann nicht so lange,
bis man einmal rum ist, sondern man behandelt jeden Punkt genau einmal,
wodurch halt die Laufzeit zustande kommt.
Also man, die Laufzeit kommt eigentlich durchs Sortieren zustande,
man muss nach Polarkoordinaten sortieren,
also dadurch hat man halt wieder N-Log-in,
aber eigentlich der eigentliche Algorithmus benötigt halt nur Endschritte,
also da muss jeden Punkt
genau sich einmal angucken
Und ein alternativer Algorithmus, weil dieser Grand Scan,
wenn ich mich recht erinnere, läuft da manchmal in so numerische Ungenauigkeiten.
Wir haben ja Floating-Point-Zahlen berechnet. Da gibt es dann
so Fälle, wo der irgendwie so Spiralen bildet.
Und ein alternativer Algorithmus ist halt, ja,
das heißt Gift-Rapping oder Javis, Darvest March.
Das Gift-Rapping kommt daher, dass man halt sagt,
ich packe diese Punkte wie ein Geschenk ein. Ja,
also ich nehme, man nimmt halt diese beiden Startpunkte,
P0, P3 und man klappt dann immer an denen so um,
dass man halt das irgendwie so zusammengepackt hat.
Beziehungsweise was man halt hier macht, ist,
man sucht halt diese maximalen und den minimalen Punkt.
Also P.0, P1, P3. Und in diesem Fall sind
die anderen Punkte restlichen Punkte auch wieder nach Polarkoordinaten sortiert.
Und man sucht von dem Punkt P.0 den aus,
der den minimalen Polarwinkel von P.0 aus hat.
Und geht dann halt hier, also man versucht halt,
wenn man sich das hier vorstellt,
ich habe hier ein Blatt Papier,
ich versuche das
möglichst weit nach oben
zu knicken
Und dann finde ich halt den Punkt P1. Und dann Punkt P1
mache ich dann dasselbe wieder. Ich versuche halt dieses Blatt Papier,
hier will er möglichst weit nach oben zu klicken,
zu knicken, finde den Punkt P2 und laufe so lange,
also laufe einmal rechts rum, bis nach P3.
Und man läuft einmal dann auch andersrum, also von dem
Punkt P3 aus läuft man halt links rum, um nach P0 zu kommen.
In diesem Fall ist die Laufzeit, die die Anzahl der Punkte mal,
weil ich an jedem Punkt Gucke ich mir alle anderen Punkte an,
um diesen Punkt P1 zu finden, beziehungsweise die Punkte,
die auf der Hülle liegen oder Hülle liegen könnten.
Und man kommt halt auf eine Laufzeit von N mal A. Ja,
und ja, das Ganze N-Locker. Genau,
also das ist halt auch ein Konflexe Hülle-Algorithmus,
der halt noch ein bisschen effizienter ist,
weil der ist halt auch wieder output-sensitiv, also Anzahl der Punkte Hardy auf der Hülle liegen.
Dadurch, und vorher hatte er N-Lock N und möglicherweise,
also eurer typischerweise liegen, alle Punkte,
die man hat auf der Hülle, sondern nur ein kleiner Teil.
Und dann ist dieses Haar kleiner als N. Ja,
gut, dann wäre ich soweit am Ende.
Und Selbstmeistern wieder Professor Rarada. Gibt es soweit Fragen?