<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Half-Edge-Datenstruktur</id>
	<title>Half-Edge-Datenstruktur - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Half-Edge-Datenstruktur"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Half-Edge-Datenstruktur&amp;action=history"/>
	<updated>2026-06-03T03:49:50Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Half-Edge-Datenstruktur&amp;diff=2386426&amp;oldid=prev</id>
		<title>imported&gt;Invisigoth67: typo</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Half-Edge-Datenstruktur&amp;diff=2386426&amp;oldid=prev"/>
		<updated>2024-06-30T15:51:58Z</updated>

		<summary type="html">&lt;p&gt;typo&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Eine &amp;#039;&amp;#039;&amp;#039;Half-Edge-Datenstruktur&amp;#039;&amp;#039;&amp;#039; oder auch &amp;#039;&amp;#039;&amp;#039;Doubly-Connected Edge List&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;DCEL&amp;#039;&amp;#039;&amp;#039;) ([[Englische Sprache|engl.]] Doppelt verkettete Kantenliste) ist eine [[Datenstruktur]] für [[Planarer Graph|planare Graphen]]. Sie besteht aus [[Knoten (Graphentheorie)|Knoten]], Halbkanten (half-edges) und Flächen. Dabei wird jede Kante durch zwei gerichtete gegenläufige Halbkanten repräsentiert, denen jeweils ihr Startknoten, angrenzende Fläche, andere Halbkante derselben Kante und die nächste Halbkante derselben Fläche zugeordnet sind. Umgekehrt „kennen“ auch Knoten und Flächen ihre jeweiligen Nachbarn.&lt;br /&gt;
&lt;br /&gt;
Diese Struktur erlaubt eine schnelle Beantwortung von Nachbarschaftsfragen und effiziente Iteration um Flächen und Knoten insbesondere auch auf [[Meshing#Unstrukturierte Gitter|unstrukturierten]] Gittern. Sie eignet sich daher besonders für unstrukturierte räumliche Datensätze, wie sie in [[Finite-Elemente-Methode]]n zum Einsatz kommen, sowie [[Computergrafik]] und [[Polygonnetz]]e im Allgemeinen.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
Eine Half-Edge-Datenstruktur besteht aus Knoten, Halbkanten und Flächen, die jeweils in einer Liste abgelegt sind.&amp;lt;ref name=&amp;quot;Mark&amp;quot;&amp;gt;Mark de Berg, Otfried Cheong, Marc van Kreveld, Mark Overmars: &amp;#039;&amp;#039;Computational Geometry: Algorithms and Applications&amp;#039;&amp;#039;. Springer-Verlag, Berlin / Heidelberg / New York 2000, ISBN 3-540-65620-0, S. 31–32&amp;lt;/ref&amp;gt; Zu jedem einzelnen dieser Elemente sind zumindest einige seiner „Nachbarn“ gespeichert, d.&amp;amp;nbsp;h. angrenzende ([[Inzidenz (Graphentheorie)|„inzidente“]]) Elemente. Beispielsweise ist zu jeder Halbkante ihre angrenzende Fläche gespeichert (bzw. ein [[Zeiger (Informatik)|Zeiger]] auf diese Fläche).&lt;br /&gt;
&lt;br /&gt;
=== Halbkanten ===&lt;br /&gt;
[[Datei:Dcel-halfedge-connectivity.svg|mini|Ausschnitt einer DCEL. Exemplarisch gekennzeichnet sind eine Kante e, ihr Nachfolger next(e), ihr Vorgänger prev(e), sowie ihr Zwilling twin(e)]]&lt;br /&gt;
&lt;br /&gt;
Charakteristisch und namengebend für die &amp;#039;&amp;#039;Half-Edge&amp;#039;&amp;#039;-Datenstruktur ist der Umstand, dass Verbindungen zwischen zwei Punkten nicht durch eine einzelne („volle“) Kante repräsentiert werden, sondern aus genau &amp;#039;&amp;#039;zwei&amp;#039;&amp;#039; sogenannten &amp;#039;&amp;#039;Halb&amp;#039;&amp;#039;kanten bestehen. Diese sind gegenläufig [[Gerichtete Kante|gerichtet]], d.&amp;amp;nbsp;h. der Zielknoten der einen Halbkante ist der Startknoten der anderen Halbkante und umgekehrt.&lt;br /&gt;
Der Vorteil dieses Vorgehens besteht unter anderem darin, dass jeder Halbkante Vorgänger, Nachfolger und angrenzende Fläche eindeutig zugeordnet werden können. Solche Beziehungen werden in den nächsten Abschnitten genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:dcel-nexts.svg|mini|Die grauen Pfeile symbolisieren die Verknüpfung der jeweiligen Halbkante zu dessen Nachfolger. Unten rechts tritt ein Spezialfall auf: Der Nachfolger der Halbkante ist gleichzeitig ihr Zwilling!]]&lt;br /&gt;
&lt;br /&gt;
Jeder Halbkante werden bis zu drei weitere Kanten zugeordnet, in Klammern stehen jeweils die englischen Bezeichnungen:&amp;lt;ref name=&amp;quot;Mark&amp;quot; /&amp;gt;&lt;br /&gt;
* Nachfolger („next half-edge“): die &amp;#039;&amp;#039;nachfolgende&amp;#039;&amp;#039; zur selben Fläche inzidente Kante.&lt;br /&gt;
* Zwilling („twin“): Die andere, gegenläufige Halbkante derselben Kante.&lt;br /&gt;
* Vorgänger („previous half-edge“): Die &amp;#039;&amp;#039;vorhergehende&amp;#039;&amp;#039; zur selben Fläche inzidente Kante.&lt;br /&gt;
&lt;br /&gt;
Als „nächste“ Kante wird anschaulich diejenige Kante definiert, auf die man zuerst trifft, wenn man im Uhrzeigersinn &amp;#039;&amp;#039;um den Zielknoten&amp;#039;&amp;#039; herumläuft.&lt;br /&gt;
&lt;br /&gt;
Man kann es sich auch so vorstellen, dass die Halbkanten &amp;#039;&amp;#039;gegen&amp;#039;&amp;#039; den Uhrzeigersinn um die inzidente Fläche herumlaufen. Dabei ist jedoch zu beachten, dass diese Anschauung für [[Zusammenhang von Graphen|isolierte Teilgraphen]], die ihrerseits in einer anderen Fläche liegen &amp;#039;&amp;#039;(Siehe [[#Flächen|Abschnitt Flächen]])&amp;#039;&amp;#039;, unintuitiv sein kann, da die äußeren Halbkanten dieses Teilgraphen scheinbar &amp;#039;&amp;#039;im&amp;#039;&amp;#039; Uhrzeigersinn verlaufen.&lt;br /&gt;
&lt;br /&gt;
Weiter werden zu jeder Kante gespeichert:&lt;br /&gt;
* Startknoten („origin“, „source“)&lt;br /&gt;
* inzidente Fläche („face“): die Fläche auf der linken Seite der Halbkante.&lt;br /&gt;
&lt;br /&gt;
=== Knoten ===&lt;br /&gt;
Da der Großteil der Konnektivitätsinformationen bereits in den Halbkanten steckt, wird zu den einzelnen Knoten lediglich eine&lt;br /&gt;
* Ausgehende Kante („Incident Edge“)&lt;br /&gt;
gespeichert.&amp;lt;ref name=&amp;quot;Mark&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da Knoten meist Punkte in einem Raum sind, werden meist zusätzlich die Koordinaten gespeichert.&lt;br /&gt;
&lt;br /&gt;
=== Flächen ===&lt;br /&gt;
[[Datei:Dcel-components.svg|mini|Fläche &amp;#039;&amp;#039;F&amp;#039;&amp;#039; in hellgrau und ihre äußere Komponente und die, in diesem Fall zwei, inneren Komponenten – jeweils identifiziert über eine zur Fläche inzidente Halbkante der Komponente.]]&lt;br /&gt;
Flächen werden durch die sie berandenden Zyklen aus Halbkanten definiert. Das können mehrere Zyklen sein, wenn in der Fläche selbst weitere [[Zusammenhang von Graphen|Komponenten]] liegen. Statt diese Zusammenhangskomponenten als separates Objekt zu behandeln, wird einfach je eine Halbkante dieser Zyklen gespeichert.&amp;lt;ref name=&amp;quot;Mark&amp;quot; /&amp;gt;&lt;br /&gt;
* Äußere Komponente („Outer Component“): Zyklus, der die Fläche nach außen hin umrandet&lt;br /&gt;
* Innere Komponenten („Inner Components“): Liste von Zyklen, die innerhalb der Fläche liegen.&lt;br /&gt;
&lt;br /&gt;
== Kombinierte Anfragen bzw. Operationen ==&lt;br /&gt;
&lt;br /&gt;
Mittels Kombination der verschiedenen Relationen können komplexe Anfragen beantwortet werden:&lt;br /&gt;
* Zielknoten einer Halbkante = Startknoten des Zwillings&lt;br /&gt;
* Nachbarfläche entlang einer Halbkante = inzidente Fläche des Zwillings der Halbkante&lt;br /&gt;
* Alle zu einer Fläche inzidenten Halbkanten:&lt;br /&gt;
** erste Halbkante = äußere Komponente der Fläche (innere Komponenten analog)&lt;br /&gt;
** So lange jeweils dem Nachfolger folgen, bis man wieder an der ersten Halbkante angelangt ist.&lt;br /&gt;
* Alle zu einem Knoten inzidenten Flächen: Siehe Beispielcode unten.&lt;br /&gt;
&lt;br /&gt;
=== Beispielcode ===&lt;br /&gt;
Beispielcode für die Iteration über alle zu einem Knoten inzidenten Flächen. Der Algorithmus entspricht dem für die Iteration über alle inzidenten Halbkanten, mit dem Unterschied, dass jeweils noch die Fläche der aktuellen Halbkante ermittelt werden muss, mit der dann irgendetwas getan werden kann.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
erste_halbkante = incidentEdge(knoten);&lt;br /&gt;
aktuelle_halbkante = erste_halbkante;&lt;br /&gt;
do {&lt;br /&gt;
    tue_irgendwas( incidentFace(aktuelle_halbkante));&lt;br /&gt;
    aktuelle_halbkante = next(twin(aktuelle_halbkante));&lt;br /&gt;
} while( aktuelle_halbkante != erste_halbkante)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Siehe auch [[Polygonnetz#Laufzeitvergleich]] für weitere Anfrageklassen und Laufzeitvergleiche.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Redundanz und implizite Informationen ==&lt;br /&gt;
&lt;br /&gt;
Selbst eine Datenstruktur, die nur aus Halbkanten, der Zwillings- und der Nachfolger-Relation besteht, bietet bereits einen Großteil des Funktionsumfangs! So ist eine [[Traversierung]] des Graphen bereits möglich. Auch Flächen und Knoten sind implizit bereits enthalten. Der Zyklus, der sich ergibt, wenn man von einer Halbkante aus so lange die Nachfolger entlanggeht, bis man wieder an derselben Kante angelangt ist, berandet eine Fläche. Ein etwas komplizierterer Zyklus, der entsteht, indem man abwechselnd Zwilling und Nachfolger entlanggeht, identifiziert einen Knoten.&lt;br /&gt;
&lt;br /&gt;
Solche minimalistischen Lösungen sind in seltenen Fällen bereits ausreichend. Beispielsweise wenn die von den Kanten berandeten Flächen keine praktische Rolle spielen wie im Falle von Straßennetzen oder Flüssen.&amp;lt;ref name=&amp;quot;Mark33&amp;quot;&amp;gt;Mark de Berg, Otfried Cheong, Marc van Kreveld, Mark Overmars: &amp;#039;&amp;#039;Computational Geometry: Algorithms and Applications&amp;#039;&amp;#039;. Springer-Verlag, Berlin / Heidelberg / New York 2000, ISBN 3-540-65620-0, S. 33&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.pmp-library.org/ Polygon Mesh Processing Library]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{SORTIERUNG:Halfedgedatenstruktur}}&lt;br /&gt;
[[Kategorie:Algorithmische Geometrie]]&lt;br /&gt;
[[Kategorie:Datenstruktur]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Invisigoth67</name></author>
	</entry>
</feed>