<?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=Raycasting</id>
	<title>Raycasting - 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=Raycasting"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Raycasting&amp;action=history"/>
	<updated>2026-05-21T04:54:18Z</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=Raycasting&amp;diff=368295&amp;oldid=prev</id>
		<title>imported&gt;Maximum 2520: /* Anwendungen */ /* Berechnen von Schatten */ hinzugefügt</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Raycasting&amp;diff=368295&amp;oldid=prev"/>
		<updated>2026-03-14T14:28:06Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Anwendungen: &lt;/span&gt;  &lt;span class=&quot;autocomment&quot;&gt;Berechnen von Schatten: &lt;/span&gt; hinzugefügt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Raycasting&amp;#039;&amp;#039;&amp;#039; (in englischer Schreibweise meist &amp;#039;&amp;#039;ray casting&amp;#039;&amp;#039;) ist ein Begriff aus der [[Computergrafik]]. Er bezeichnet Techniken zur schnellen Darstellung ([[Bildsynthese|Rendern]]) einer dreidimensionalen [[Szenengraph|Szene]], wird aber inzwischen hauptsächlich im [[Kontext (Sprachwissenschaft)|Kontext]] der [[Volumengrafik|Volumenvisualisierung]] verwendet. Die genaue Definition des Begriffs variiert kontextabhängig.&lt;br /&gt;
&lt;br /&gt;
== Raycasting in der Volumenvisualisierung ==&lt;br /&gt;
Raycasting bezeichnet eine Methode, skalare Funktionen in einem [[Voxel|dreidimensionalen Volumen]], die in vielen wissenschaftlichen Anwendungen auftreten, zu [[visualisieren]]. Im medizinischen Bereich sind Beispiele hierfür: [[Computertomographie]] (CT), [[Magnetresonanztomographie]] (MRT) oder [[Positronen-Emissions-Tomographie]] (PET); im Bereich der numerischen Simulation, bei einer [[Finite-Elemente-Methode]] (FEM) für [[Computational Fluid Dynamics]] (CFD), bei der das Strömungsverhalten von Gasen und Flüssigkeiten berechnet wird. Die hier gewonnenen skalaren Daten, zum Beispiel die [[Dichte]] oder [[Temperatur]], können mit verschiedenen Verfahren visualisiert werden, hierzu zählt auch das Raycasting. Hierbei unterscheidet man zwischen direkten und indirekten Verfahren. Indirekte Verfahren visualisieren das Volumen mit Hilfe einer polygonalen Zwischenrepräsentation. [[Marching Cubes]] zählt zu diesen indirekten Verfahren. Direkte Verfahren visualisieren das Volumen ohne die Erzeugung solcher Zwischendaten. Zu diesen Verfahren zählen Raycasting und [[Splatting]]. Weiter unterscheidet man noch zwischen bildraumorientierten Verfahren (Image-Order) und objektraumorientierten Verfahren (Object-Order).&lt;br /&gt;
&lt;br /&gt;
In der [[Computergrafik]] werden [[Dreidimensional|dreidimensionale]] Objekte überwiegend durch Oberflächendarstellungen visualisiert. Diese Visualisierung bieten sich in den Bereichen an, in denen regelmäßige Strukturen auftreten. Diese können dann recht einfach in Form von [[Polygon]]en dargestellt werden. Bei Daten mit unregelmäßigen Strukturen z. B. aus numerischen Simulationen oder Scans von dreidimensionalen Volumen ist es schwierig diesen eine eindeutige Oberfläche zuzuordnen, weil die Strukturen fließend ineinander übergehen. Bei einer Oberflächendarstellung würden feine Strukturen verloren gehen. Deshalb geschieht die Visualisierung dieser Daten durch [[Volume rendering|Volume Rendering]]. Mittlerweile gewinnt diese Volumen Rendering auch bei der Visualisierung von Effekten in Computerspielen immer mehr an Bedeutung. Mit ihnen lassen sich Objekte wie Flüssigkeiten, Gase oder andere Naturphänomene realistisch darstellen.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Oberflächenvisualisierung bieten diese Verfahren den weiteren Vorteil, mehrschichtige oder transparente Informationen darstellen zu können. Allerdings war bisher durch eine aufwendige Berechnung für das [[Volume rendering|Volume Rendering]] die [[Bildwiederholungsrate]] für eine flüssige [[Animation]] zu gering. Deswegen wurden unterschiedliche Verfahren entwickelt, die durch eine Vereinfachung der Berechnungen eine schnelle Darstellung ermöglichten, oder es wurde spezielle und somit auch teure [[Hardware]] für die Darstellung eingesetzt. Erst durch die Entwicklung von programmierbaren [[Grafikprozessor]]en ist es möglich eine gute Bildqualität in Echtzeit auch kostengünstig umzusetzen.&amp;lt;ref&amp;gt;Frank Sawitzki, Universität Koblenz-Landau: [https://www.uni-koblenz.de/~cg/Studienarbeiten/SA_Sawitzki.pdf GPU-basiertes Raycasting]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Raycasting als Verfahren in der Volumenvisualisierung ==&lt;br /&gt;
Grundlegende Idee ist, wie Volumendaten mit Hilfe des Raycasting-Verfahrens visualisiert werden können. Die theoretische Grundlage ist die Volumen-Rendering-Gleichung, eine Zusammensetzung aus [[Spontane Emission|Emission]] und [[Absorption (Physik)|Absorption]]. Raycasting löst ([[Approximation|approximiert]]) dieses Problem.&amp;lt;ref name=&amp;quot;Watt&amp;quot;&amp;gt;Alan Watt, Mark Watt: &amp;#039;&amp;#039;Advanced Animation and Rendering Techniques Theory and Practice.&amp;#039;&amp;#039; Addison-Wesley, Reading 1992, ISBN 0-201-54412-1, S.&amp;amp;nbsp;305–312.&amp;lt;/ref&amp;gt;&lt;br /&gt;
[[Datei:High Definition Volume Rendering.JPG|mini|Schädel, visualisiert aus einem Voxeldatensatz unter Verwendung von Raycasting]]&lt;br /&gt;
&lt;br /&gt;
=== Raycasting-Verfahren ===&lt;br /&gt;
Raycasting schickt für jedes Pixel des Betrachters (des zu berechnenden Bilds) einen Sehstrahl (Primärstrahlen) durch das Volumen. Der Strahl wird innerhalb des Volumens verfolgt und die Farb- und [[Opazität]]swerte in regelmäßigen Abständen an den Abtastpunkten auf dem Strahl bestimmt. Es wird ebenfalls die [[Shading|Schattierung]] für die Farbwerte an allen Abtastpunkten berechnet. Der für den Sehstrahl so erhaltene Vektor enthält die geordneten Abtast-Werte (Farb-, Opazitätswerte), wobei die Farbwerte dem Quellterm und die Opazitätswerte dem Extinktionskoeffizienten entsprechen. In einem letzten Schritt, dem [[Compositing#Volumengrafik|Compositing]], werden dann die Farb- und Opazitätswerte kombiniert und das aus dem Sehstrahl resultierende Pixel in der Bildebene errechnet.&lt;br /&gt;
&lt;br /&gt;
== Raycasting als einfaches Raytracing ==&lt;br /&gt;
Raycasting bezeichnet oftmals eine einfache Form des [[Raytracing]]s, eines bekannten Renderverfahrens.&amp;lt;ref name=&amp;quot;foley&amp;quot;&amp;gt;James Foley u. a.: &amp;#039;&amp;#039;Computer Graphics: Principles and Practice.&amp;#039;&amp;#039; Addison-Wesley, Reading 1995, ISBN 0-201-84840-6, S.&amp;amp;nbsp;701.&amp;lt;/ref&amp;gt; Die dreidimensionale Szene wird entsprechend festgelegter Vorgaben wie Betrachterstandpunkt und Perspektive regelmäßig abgetastet, sodass eine zweidimensionale Abbildung eines Ausschnitts entsteht. Im Gegensatz zu erweiterten Raytracing-Varianten ist das Abtasten eines Strahls mit dem Aufeinandertreffen von Strahl und Objekt beendet, es findet also lediglich eine [[Sichtbarkeitsproblem|Verdeckungsberechnung]] statt. Die an diesem Schnittpunkt festgestellte Farbe bildet den Bildpunktfarbwert. Spiegelungen, Brechungen und Transmissionen des Objekts werden nicht beachtet. Diese Technik ermöglicht eine sehr schnelle Vorschau auf eine Szene.&lt;br /&gt;
&lt;br /&gt;
Gelegentlich wird Raycasting auch synonym zu Raytracing verwendet.&amp;lt;ref name=&amp;quot;foley&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Filterung ==&lt;br /&gt;
Zwei Probleme ergeben sich bei der Rekonstruktion des abgetasteten [[Volumen]]s, die durch eine Filterung der Daten ausgeglichen werden:&lt;br /&gt;
* Nach dem [[Abtasttheorem]] benötigt die exakte Rekonstruktion des Signals eine [[Faltung (Mathematik)|Faltung]] durch eine [[Sinusfunktion]], die für den [[Eindimensional|eindimensionalen]] Fall lautet:&lt;br /&gt;
::&amp;lt;math&amp;gt;\operatorname{sinc}(x) = \frac{\sin(\pi \cdot x)}{\pi \cdot x}&amp;lt;/math&amp;gt;&lt;br /&gt;
:Im [[Dreidimensional|dreidimensionalen]] Fall geschieht die [[Faltung (Mathematik)|Faltung]] über ein [[Tensorprodukt]]. Es werden die gesamten Abtastpunkte berücksichtigt. Dies ist rechnerisch aufwendig zu lösen.&lt;br /&gt;
* Es entstehen [[Alias-Effekt]]e, falls ein Signal rekonstruiert wird, welches nicht bandlimitiert gewesen ist.&lt;br /&gt;
Um das kontinuierliche Signal mittels eines Arrays von [[Voxel]] rekonstruieren zu können, wird die [[Sinc-Funktion|Sinc]]-Faltung durch einen [[Boxfilter]] oder Tent-Filter ersetzt. Der Boxfilter interpoliert nach dem [[Nearest-Neighbor-Heuristik|Nearest-Neighbor]]-Verfahren. Dieses erzeugt allerdings Unterbrechungen zwischen Nachbarwerten und eine insgesamt blockartige Erscheinung. Der Tent-Filter [[Interpolation (Mathematik)|interpoliert]] trilinear. Dadurch erhält man ein gutes Verhältnis zwischen [[Rechenzeit]] und Qualität des rekonstruierten Signals.&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
&lt;br /&gt;
=== Entfernen verdeckter Flächen ===&lt;br /&gt;
Wenn ein Strahl von der Kamera auf die Oberfläche geworfen wird, ist alles sichtbar, was der Strahl zuerst trifft und alles dahinter bleibt verdeckt. Beim Raycasting zun Entfernen verdeckter Oberflächen wird für jedes Pixel auf dem Bildschirm geprüft, was der Strahl als Erstes trifft, wenn er von der Kamera ausgeht.&lt;br /&gt;
&lt;br /&gt;
Der [[Algorithmus]] läuft in folgenden Schritten ab:&lt;br /&gt;
&lt;br /&gt;
* Für jedes [[Pixel]] im Ausgabebild wird ein Strahl konstruiert, der an der Kameraposition beginnt, durch die Position dieses Pixels auf der Bildebene verläuft und dann in die aufgenommene Szene hineinführt.&lt;br /&gt;
* Der Strahl wird auf [[Schnittpunkt|Schnittpunkte]] mit jedem Objekt in der Szene getestet. Dadurch erhält man eine Liste aller Oberflächen, die der Strahl durchquert, jeweils mit einem Entfernungswert, wie weit entlang des Strahls der Treffer erfolgte.&lt;br /&gt;
* Der Schnittpunkt mit dem geringsten [[Abstand]] von der Kamera ist die sichtbare Oberfläche. Alles dahinter wird verworfen. Dies ist der entscheidende Schritt, der das Entfernen verdeckter Flächen bewirkt. Weiter entfernte Objekte werden automatisch durch das nächstgelegene Objekt verdeckt.&lt;br /&gt;
* Das Pixel wird mit der Farbe, Textur und Beleuchtung an diesem ersten Schnittpunkt schattiert. Die anderen Objekte der Szene tragen nichts zum endgültigen Bild für diesen Strahl bei.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu älteren Techniken muss Raycasting keine Informationen über die Tiefenreihenfolge im Voraus kennen. Es ermittelt die Sichtbarkeit automatisch, indem es einfach den minimalen Schnittpunktabstand ermittelt. Es ist nicht notwendig, Objekte zu sortieren, und es besteht kein Risiko von Sortierfehlern bei überlappenden [[Polygon|Polygonen]].&amp;lt;ref&amp;gt;Scribd, Inc.: [https://www.scribd.com/document/215655380/Hidden-Surface-Removal-Techniques &amp;#039;&amp;#039;Hidden Surface Removal Techniques&amp;#039;&amp;#039;]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Berechnen von Schatten ===&lt;br /&gt;
Um die Schatten einer aufgenommenen Szene zu berechnen, kann folgender [[Algorithmus]] verwendet werden:&lt;br /&gt;
&lt;br /&gt;
* Die Kamera sendet einen Primärstrahl senkrecht aus. Dieser trifft an einem Punkt P auf eine Oberfläche.&lt;br /&gt;
* Von P aus wird ein neuer Strahl in Richtung der Lichtquelle ausgesendet. Dies ist der Schattenstrahl.&lt;br /&gt;
* Der Schattenstrahl prüft, ob er mit der gesamten Geometrie der Szene schneidet. Entscheidend ist nur das Vorhandensein eines Schnittpunkts, aber nicht, welcher am nächsten liegt. Befindet sich ein Objekt zwischen P und der Lichtquelle, liegt der Punkt im Schatten.&lt;br /&gt;
* Trifft der Schattenstrahl ungehindert auf die Lichtquelle, wird die volle direkte Beleuchtung angewendet. Wird er blockiert, werden die diffusen und gerichteten Lichtanteile der Lichtquelle auf null gesetzt. Es bleibt nur das Umgebungslicht übrig.&lt;br /&gt;
&lt;br /&gt;
Der oben beschriebene [[Algorithmus]] erzeugt harte Schatten, d. h. ein Punkt ist entweder vollständig beleuchtet oder vollständig im Schatten. Da liegt daran, dass die [[Lichtquelle]] als einzelner Punkt behandelt wird. Reale Lichtquellen haben jedoch eine Fläche. Um weiche Schatten mit einer Halbschattenzone zu simulieren, wird die Lichtquelle an mehreren Positionen auf ihrer Oberfläche abgetastet. Pro Abtastpunkt werden mehrere Schattenstrahlen erzeugt, einer pro Punkt. Der Anteil der Strahlen, die die Lichtquelle ungehindert erreichen, bestimmt, wie stark der Punkt beleuchtet ist. So entsteht ein weicher Übergang von vollständig beleuchtet über die Halbschattenzone bis hin zum tiefen Schatten. Dies ist rechenintensiv. Um die Schattenstrahlen effizient zu verteilen, werden [[Monte-Carlo-Simulation|Monte-Carlo-Simulationen]] verwendet.&amp;lt;ref&amp;gt;[[Stanford University]]: [https://graphics.stanford.edu/courses/cs348b-03/papers/mc-course.pdf &amp;#039;&amp;#039;State of the Art in Monte Carlo Ray Tracing for Realistic Image Synthesis&amp;#039;&amp;#039;]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im zweiten Schritt des [[Algorithmus]] tritt ein Problem auf. Der Schattenstrahl beginnt genau am Oberflächenpunkt P, d. h., er schneidet die Oberfläche, die er gerade getroffen hat, sofort und meldet fälschlicherweise, dass der Punkt sich selbst beschattet. Dies erzeugt ein verrauschtes [[Artefakt (Computergrafik)|Artefakt]], das als &amp;#039;&amp;#039;Schattenakne&amp;#039;&amp;#039; bezeichnet wird. Die Lösung besteht darin, den Ursprung des Schattenstrahls leicht entlang der Oberflächennormalen zu verschieben, ihn also vor dem Auslösen minimal von der Oberfläche wegzubewegen. Die Verschiebung ist winzig, aber ihre Genauigkeit ist entscheidend. Ist sie zu klein, bleiben Artefakte bestehen. Ist sie zu groß, verlieren Objekte fälschlicherweise ihre Schatten an Kanten.&amp;lt;ref&amp;gt;[[Stanford University]]: [https://graphics.stanford.edu/courses/cs348b-03/papers/veach-chapter9.pdf &amp;#039;&amp;#039;Multiple Importance Sampling&amp;#039;&amp;#039;]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[[Stanford University]]: [https://graphics.stanford.edu/courses/cs348b-03/papers/veach-chapter10.pdf &amp;#039;&amp;#039;Bidirectional Path Tracing&amp;#039;&amp;#039;]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Raycasting bei Computerspielen ==&lt;br /&gt;
[[Datei:Raycasting.svg|mini|Raycasting in Computerspielen: Abtasten einer zweidimensionalen Karte mit regelmäßigen Strahlen]]&lt;br /&gt;
In der [[Computerspiel]]entwicklung bezeichnet der Begriff &amp;#039;&amp;#039;Raycasting&amp;#039;&amp;#039; das auf einer zweidimensionalen Karte basierte Berechnen einer Pseudo-3D-Ansicht.&amp;lt;ref&amp;gt;Stefan Becker: &amp;#039;&amp;#039;Virtuelle Welten mit der Raycasting-Technik darstellen.&amp;#039;&amp;#039; In: &amp;#039;&amp;#039;[[c’t]]&amp;#039;&amp;#039; 2/1996, {{ISSN|0724-8679}}, S.&amp;amp;nbsp;246.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Boris Bertelsons u. a.: &amp;#039;&amp;#039;PC Underground.&amp;#039;&amp;#039; Data Becker, Düsseldorf 1995, ISBN 3-8158-1185-6.&amp;lt;/ref&amp;gt; Auf Basis der Entfernung zu einem Objekt, den ein „Sichtstrahl“ trifft, wird zum einen die Objektfarbe vertikal zentriert dargestellt und zum anderen der Anteil an Decke oder Boden der entsprechenden Pixel-Spalte berechnet. Im Gegensatz zur normalen Raytracing-Technik wird hier nur eine einzelne Bildzeile abgetastet, um das gesamte Bild zu berechnen; die [[Sichtbarkeitsproblem|Verdeckungsberechnung]] findet also nur in einer Ebene und nicht im Raum statt. Populär wurde das Raycasting durch frühe [[Ego-Shooter]] wie [[Catacomb (Computerspiel)|Catacomb]] und Wolfenstein&amp;amp;nbsp;3D, da es erheblich weniger Berechnungszeit benötigt als [[Polygon|polygonales]]&amp;amp;nbsp;3D.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Raycasting2.png|mini|Entsprechend der oberen Grafik wird die Bildpunktfarbe festgestellt (oberer „Streifen“) und entsprechend der Entfernung wird ein vertikaler Bereich in dieser Farbe gezeichnet. Alle übrigen Bereiche sind Himmel bzw. Decke oder Boden.]]&lt;br /&gt;
Diese Technik unterliegt modernen Verfahren gegenüber diversen Einschränkungen: Es werden keine dreidimensionalen Objekte wie Personen und Gegenstände dargestellt, Boden und Decke sind immer gleich hoch und Schrägen sind nicht möglich. Es wurden diverse Umgehungslösungen gefunden, so werden zweidimensionale Grafiken, auch [[Sprite (Computergrafik)|Sprites]] genannt, für beliebige Objekte verwendet, die skaliert in das berechnete Bild eingefügt werden. Diese wurden winkelabhängig ausgewählt, sodass ein Objekt von vorne anders aussieht als von hinten.&lt;br /&gt;
&lt;br /&gt;
Verwandt mit dem Raycasting ist der mit dem Spiel [[Comanche: Operation White Lightning]] eingeführte [[Voxel Space|Voxel-Space]]-Algorithmus zur Visualisierung von [[Höhenfeld]]ern. Darauf basierende [[Grafik-Engine]]s werden oft schlicht als [[Voxel]]-Engines bezeichnet, obwohl keine Voxel visualisiert werden.&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Das folgende Beispiel in der [[Programmiersprache]] [[C++]] zeigt eine Implementierung des Raycasting-Algorithmus, die prüft, ob Punkte innerhalb von gegebenen geometrischen Figuren liegen. Bei der Ausführung des Programms wird die [[Funktion (Mathematik)|Funktion]] &amp;#039;&amp;#039;main&amp;#039;&amp;#039; verwendet, die die Ergebnisse auf der Konsole ausgibt.&amp;lt;ref&amp;gt;Rosetta Code: [https://rosettacode.org/wiki/Ray-casting_algorithm Ray-casting algorithm]&amp;lt;/ref&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;list&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
struct Point { const double x, y; };&lt;br /&gt;
&lt;br /&gt;
struct Edge&lt;br /&gt;
{&lt;br /&gt;
    const Point point1, point2;&lt;br /&gt;
&lt;br /&gt;
    bool operator()(const Point&amp;amp; point) const&lt;br /&gt;
    {&lt;br /&gt;
        if (point1.y &amp;gt; point2.y) return Edge{ point2, point1 }(point);&lt;br /&gt;
        if (point.y == point1.y || point.y == point2.y) return operator()({ point.x, point.y + numeric_limits&amp;lt;float&amp;gt;().epsilon() });&lt;br /&gt;
        if (point.y &amp;gt; point2.y || point.y &amp;lt; point1.y || point.x &amp;gt; max(point1.x, point2.x)) return false;&lt;br /&gt;
        if (point.x &amp;lt; min(point1.x, point2.x)) return true;&lt;br /&gt;
        double blue = abs(point1.x - point.x) &amp;gt; numeric_limits&amp;lt;double&amp;gt;::min() ? (point.y - point1.y) / (point.x - point1.x) : numeric_limits&amp;lt;double&amp;gt;::max();&lt;br /&gt;
        double red = abs(point1.x - point2.x) &amp;gt; numeric_limits&amp;lt;double&amp;gt;::min() ? (point2.y - point1.y) / (point2.x - point1.x) : numeric_limits&amp;lt;double&amp;gt;::max();&lt;br /&gt;
        return blue &amp;gt;= red;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Figure&lt;br /&gt;
{&lt;br /&gt;
    const string name;&lt;br /&gt;
    const list&amp;lt;Edge&amp;gt; edges;&lt;br /&gt;
&lt;br /&gt;
    bool contains(const Point&amp;amp; point) const&lt;br /&gt;
    {&lt;br /&gt;
        int c = 0;&lt;br /&gt;
        for (Edge edge : edges)&lt;br /&gt;
        {&lt;br /&gt;
            if (edge(point))&lt;br /&gt;
            {&lt;br /&gt;
                c++;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return c % 2 != 0;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    const list&amp;lt;Point&amp;gt; points = { { 5.0, 5.0}, {5.0, 8.0}, {-10.0, 5.0}, {0.0, 5.0}, {10.0, 5.0}, {8.0, 5.0}, {10.0, 10.0} };&lt;br /&gt;
    const Figure square = { &amp;quot;Quadrat&amp;quot;,&lt;br /&gt;
        {&lt;br /&gt;
            {{0.0, 0.0}, {10.0, 0.0}}, {{10.0, 0.0}, {10.0, 10.0}}, {{10.0, 10.0}, {0.0, 10.0}}, {{0.0, 10.0}, {0.0, 0.0}}&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    const Figure square_hole = { &amp;quot;Quadrat mit Loch&amp;quot;,&lt;br /&gt;
        {&lt;br /&gt;
            {{0.0, 0.0}, {10.0, 0.0}}, {{10.0, 0.0}, {10.0, 10.0}}, {{10.0, 10.0}, {0.0, 10.0}}, {{0.0, 10.0}, {0.0, 0.0}},&lt;br /&gt;
                {{2.5, 2.5}, {7.5, 2.5}}, {{7.5, 2.5}, {7.5, 7.5}}, {{7.5, 7.5}, {2.5, 7.5}}, {{2.5, 7.5}, {2.5, 2.5}}&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    const Figure strange = { &amp;quot;Strange&amp;quot;,&lt;br /&gt;
        {&lt;br /&gt;
            {{0.0, 0.0}, {2.5, 2.5}}, {{2.5, 2.5}, {0.0, 10.0}}, {{0.0, 10.0}, {2.5, 7.5}}, {{2.5, 7.5}, {7.5, 7.5}},&lt;br /&gt;
                {{7.5, 7.5}, {10.0, 10.0}}, {{10.0, 10.0}, {10.0, 0.0}}, {{10.0, 0}, {2.5, 2.5}}&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    const Figure exagon = { &amp;quot;Exagon&amp;quot;,&lt;br /&gt;
        {&lt;br /&gt;
            {{3.0, 0.0}, {7.0, 0.0}}, {{7.0, 0.0}, {10.0, 5.0}}, {{10.0, 5.0}, {7.0, 10.0}}, {{7.0, 10.0}, {3.0, 10.0}},&lt;br /&gt;
                {{3.0, 10.0}, {0.0, 5.0}}, {{0.0, 5.0}, {3.0, 0.0}}&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    for (Figure figure : { square, square_hole, strange, exagon })&lt;br /&gt;
    {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;Liegt der Punkt der innerhalb vom &amp;quot; &amp;lt;&amp;lt; figure.name &amp;lt;&amp;lt; &amp;#039;?&amp;#039; &amp;lt;&amp;lt; endl;&lt;br /&gt;
        for (Point point : points)&lt;br /&gt;
        {&lt;br /&gt;
            cout &amp;lt;&amp;lt; &amp;quot;(&amp;quot; &amp;lt;&amp;lt; point.x &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; point.y &amp;lt;&amp;lt; &amp;quot;): &amp;quot; &amp;lt;&amp;lt; boolalpha &amp;lt;&amp;lt; figure.contains(point) &amp;lt;&amp;lt; endl;&lt;br /&gt;
        }&lt;br /&gt;
        cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
{{Wikibooks|Spielewelten mit Raycasting}}&lt;br /&gt;
* [https://permadi.com/1996/05/ray-casting-tutorial-table-of-contents/ Raycasting-Tutorial von F. Permadi] (englisch)&lt;br /&gt;
* [https://www.pouet.net/prod.php?which=78044 Interaktiver Raycaster für MSDOS in 64 Bytes (mit Quellcode)]&lt;br /&gt;
* Matthias Teschner, Albert-Ludwigs-Universität Freiburg: [https://cg.informatik.uni-freiburg.de/course_notes/graphics_01_raycasting.pdf Computer Graphics Ray Casting]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bildsynthese]]&lt;br /&gt;
[[Kategorie:Algorithmus (Computergrafik)]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Maximum 2520</name></author>
	</entry>
</feed>