<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Graham scan]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>Mein aktuelles Projekt ist die Umsetzung des Graham scan Algorithmus, die Sortierung der Einzelpunkte nach dem Winkel funktioniert soweit, wobei die Punkte dabei in eine doppelt verkettete Liste eingetragen werden. Das löschen der nicht konvexen Eckpunkte funktioniert allerdings nicht Ordnungsgemäß und frage deshalb hier ob jemand den Fehler in meiner Implementierung finden könnte.</p>
<p>Definition der Listeneinträge:</p>
<pre><code class="language-cpp">template &lt;class Datentyp&gt; struct Dpointer //definiert die pointerbasierte suchliste
{
       Dpointer* nächster;
       Dpointer* letzter;

       unsigned int refid;
       Datentyp x;
       Datentyp y;
       Datentyp abstand;
       Datentyp winkel;

       Dpointer()
       {
               letzter = 0;
               nächster = 0;

               refid = 0;
               x = 0;
               y = 0;
               abstand = 0;
               winkel = 0;
       }

};
</code></pre>
<p>Dementsprechend befindet sich nach der Sortierung diese Belegungssituation in der verketteten Liste wieder:</p>
<p>erstes Element[pivot]-&gt;nächster[kleinster winkel rel pivot]-&gt;nächster[zweitkleinster rel pivot...]-&gt;usw</p>
<p>um nun aus dieser liste die konvexe Hülle zu erhalten durchlaufe ich diese Liste und verändere nebenbei einen array in das die konvexe Hülle eingetragen werden soll[indices die die punkte der konvexen Hülle adressieren] (wird direkt zurückgegeben)</p>
<pre><code class="language-cpp">//Dpoint = sortierte Liste (erster Listeneintrag)
//Anzahl = Anzahl der sich in der Liste befindlichen Punkte
					unsigned int* returnindices = new unsigned int[anzahl + 1]; //zurückzugeben
					Datentyp* konvexpunkte = new Datentyp[anzahl * 2]; //punktearray in das die konvexe Hülle ausgebildet werden soll 

					unsigned int* pointerint = returnindices + 2;//erster unbeschriebener index
					Datentyp* konvexpointer = konvexpunkte + 4; //erster unbeschriebener Punkt in der konvexen Hülle

					Datentyp* iterierer = konvexpunkte;
					Datentyp* iterierer2 = konvexpunkte + 2;		
					Dpointer&lt;Datentyp&gt;* iterierer3 = Dpoint-&gt;nächster-&gt;nächster;
					//definiert ein Punkttripel über das die zugehörigkeit zur konvexen Hülle bestimmt wird

					#pragma region Daten aus der Liste in ein array umschichten

					returnindices[0] = Dpoint-&gt;refid;
					returnindices[1] = Dpoint-&gt;nächster-&gt;refid;

					konvexpunkte[0] = Dpoint-&gt;x;
					konvexpunkte[1] = Dpoint-&gt;y;
					konvexpunkte[2] = Dpoint-&gt;nächster-&gt;x;
					konvexpunkte[3] = Dpoint-&gt;nächster-&gt;y;

					#if 1
					unsigned int sucher = 2; //durchlaufene Punkte
					while (sucher != anzahl)
					{			

						while ((*iterierer2 - *iterierer) * (iterierer3-&gt;y - *(iterierer + 1)) - (iterierer3-&gt;x - *iterierer) * (*(iterierer2 + 1) - *(iterierer + 1)) &gt;= 0) //letzte einträge solange löschen bis eine konvexe ecke gefundne wird
						{
							//pointer versetzen (zu löschende Ecken werden später überschrieben)
							pointerint--;
							konvexpointer -= 2;
							//die Vektoren A und B (das ende des konvex-Stacks folgt früher)
							iterierer2 -= 2;
							iterierer -= 2;
						}
						//punktid eintragen
						*pointerint = iterierer3-&gt;refid;
						pointerint++;
						//punkte eintragen
						*konvexpointer = iterierer3-&gt;x;
						konvexpointer++;
						*konvexpointer = iterierer3-&gt;y;
						konvexpointer++;

						//nächsten punkt verarbeiten
						iterierer += 2;
						iterierer2 += 2;
						iterierer3 = iterierer3-&gt;nächster;			
						sucher++;

					}
                           *pointerint = Dpoint-&gt;refid;//vom letzten Eintrag wieder zum ersten (Polygon schliesen)
</code></pre>
<p>über Hilfe wäre ich wirklich dankbar ich stehe nämlich schon seit 2 Wochen auf dem Schlauch.</p>
<p>PS: Könnte auch sein das der Algorithmus an sich schon von der Quelle aus nicht funktionsfähig ist was ich aber eigentlich ausschliesen würde (hier die Quelle( PDF)</p>
<p><a href="http://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=3&amp;ved=0CDYQFjAC&amp;url=http%3A%2F%2Fwwwisg.cs.uni-magdeburg.de%2Fag%2Flehre%2FWS0304%2FThICV%2Fslides%2Fgraham.pdf&amp;ei=uEORUP78PI3NswbH84CIBw&amp;usg=AFQjCNEQnrl4wc3tH2ru9coZGrzhlT0CBw&amp;sig2=AxblcKkz9gvTTXDqgbp8HQ&amp;cad=rja" rel="nofollow">http://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=3&amp;ved=0CDYQFjAC&amp;url=http%3A%2F%2Fwwwisg.cs.uni-magdeburg.de%2Fag%2Flehre%2FWS0304%2FThICV%2Fslides%2Fgraham.pdf&amp;ei=uEORUP78PI3NswbH84CIBw&amp;usg=AFQjCNEQnrl4wc3tH2ru9coZGrzhlT0CBw&amp;sig2=AxblcKkz9gvTTXDqgbp8HQ&amp;cad=rja</a>)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309965/graham-scan</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 00:11:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309965.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 31 Oct 2012 15:27:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Graham scan on Wed, 31 Oct 2012 15:31:56 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>Mein aktuelles Projekt ist die Umsetzung des Graham scan Algorithmus, die Sortierung der Einzelpunkte nach dem Winkel funktioniert soweit, wobei die Punkte dabei in eine doppelt verkettete Liste eingetragen werden. Das löschen der nicht konvexen Eckpunkte funktioniert allerdings nicht Ordnungsgemäß und frage deshalb hier ob jemand den Fehler in meiner Implementierung finden könnte.</p>
<p>Definition der Listeneinträge:</p>
<pre><code class="language-cpp">template &lt;class Datentyp&gt; struct Dpointer //definiert die pointerbasierte suchliste
{
       Dpointer* nächster;
       Dpointer* letzter;

       unsigned int refid;
       Datentyp x;
       Datentyp y;
       Datentyp abstand;
       Datentyp winkel;

       Dpointer()
       {
               letzter = 0;
               nächster = 0;

               refid = 0;
               x = 0;
               y = 0;
               abstand = 0;
               winkel = 0;
       }

};
</code></pre>
<p>Dementsprechend befindet sich nach der Sortierung diese Belegungssituation in der verketteten Liste wieder:</p>
<p>erstes Element[pivot]-&gt;nächster[kleinster winkel rel pivot]-&gt;nächster[zweitkleinster rel pivot...]-&gt;usw</p>
<p>um nun aus dieser liste die konvexe Hülle zu erhalten durchlaufe ich diese Liste und verändere nebenbei einen array in das die konvexe Hülle eingetragen werden soll[indices die die punkte der konvexen Hülle adressieren] (wird direkt zurückgegeben)</p>
<pre><code class="language-cpp">//Dpoint = sortierte Liste (erster Listeneintrag)
//Anzahl = Anzahl der sich in der Liste befindlichen Punkte
					unsigned int* returnindices = new unsigned int[anzahl + 1]; //zurückzugeben
					Datentyp* konvexpunkte = new Datentyp[anzahl * 2]; //punktearray in das die konvexe Hülle ausgebildet werden soll 

					unsigned int* pointerint = returnindices + 2;//erster unbeschriebener index
					Datentyp* konvexpointer = konvexpunkte + 4; //erster unbeschriebener Punkt in der konvexen Hülle

					Datentyp* iterierer = konvexpunkte;
					Datentyp* iterierer2 = konvexpunkte + 2;		
					Dpointer&lt;Datentyp&gt;* iterierer3 = Dpoint-&gt;nächster-&gt;nächster;
					//definiert ein Punkttripel über das die zugehörigkeit zur konvexen Hülle bestimmt wird

					#pragma region Daten aus der Liste in ein array umschichten

					returnindices[0] = Dpoint-&gt;refid;
					returnindices[1] = Dpoint-&gt;nächster-&gt;refid;

					konvexpunkte[0] = Dpoint-&gt;x;
					konvexpunkte[1] = Dpoint-&gt;y;
					konvexpunkte[2] = Dpoint-&gt;nächster-&gt;x;
					konvexpunkte[3] = Dpoint-&gt;nächster-&gt;y;

					#if 1
					unsigned int sucher = 2; //durchlaufene Punkte
					while (sucher != anzahl)
					{			

						while ((*iterierer2 - *iterierer) * (iterierer3-&gt;y - *(iterierer + 1)) - (iterierer3-&gt;x - *iterierer) * (*(iterierer2 + 1) - *(iterierer + 1)) &gt;= 0) //letzte einträge solange löschen bis eine konvexe ecke gefundne wird
						{
							//pointer versetzen (zu löschende Ecken werden später überschrieben)
							pointerint--;
							konvexpointer -= 2;
							//die Vektoren A und B (das ende des konvex-Stacks folgt früher)
							iterierer2 -= 2;
							iterierer -= 2;
						}
						//punktid eintragen
						*pointerint = iterierer3-&gt;refid;
						pointerint++;
						//punkte eintragen
						*konvexpointer = iterierer3-&gt;x;
						konvexpointer++;
						*konvexpointer = iterierer3-&gt;y;
						konvexpointer++;

						//nächsten punkt verarbeiten
						iterierer += 2;
						iterierer2 += 2;
						iterierer3 = iterierer3-&gt;nächster;			
						sucher++;

					}
                           *pointerint = Dpoint-&gt;refid;//vom letzten Eintrag wieder zum ersten (Polygon schliesen)
</code></pre>
<p>über Hilfe wäre ich wirklich dankbar ich stehe nämlich schon seit 2 Wochen auf dem Schlauch.</p>
<p>PS: Könnte auch sein das der Algorithmus an sich schon von der Quelle aus nicht funktionsfähig ist was ich aber eigentlich ausschliesen würde (hier die Quelle( PDF)</p>
<p><a href="http://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=3&amp;ved=0CDYQFjAC&amp;url=http%3A%2F%2Fwwwisg.cs.uni-magdeburg.de%2Fag%2Flehre%2FWS0304%2FThICV%2Fslides%2Fgraham.pdf&amp;ei=uEORUP78PI3NswbH84CIBw&amp;usg=AFQjCNEQnrl4wc3tH2ru9coZGrzhlT0CBw&amp;sig2=AxblcKkz9gvTTXDqgbp8HQ&amp;cad=rja" rel="nofollow">http://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=3&amp;ved=0CDYQFjAC&amp;url=http%3A%2F%2Fwwwisg.cs.uni-magdeburg.de%2Fag%2Flehre%2FWS0304%2FThICV%2Fslides%2Fgraham.pdf&amp;ei=uEORUP78PI3NswbH84CIBw&amp;usg=AFQjCNEQnrl4wc3tH2ru9coZGrzhlT0CBw&amp;sig2=AxblcKkz9gvTTXDqgbp8HQ&amp;cad=rja</a>)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265973</guid><dc:creator><![CDATA[c++neuling2]]></dc:creator><pubDate>Wed, 31 Oct 2012 15:31:56 GMT</pubDate></item><item><title><![CDATA[Reply to Graham scan on Wed, 31 Oct 2012 17:02:49 GMT]]></title><description><![CDATA[<p>Warum programmierst du dir eine verkettete Liste selbst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266021</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Wed, 31 Oct 2012 17:02:49 GMT</pubDate></item><item><title><![CDATA[Reply to Graham scan on Wed, 31 Oct 2012 17:28:05 GMT]]></title><description><![CDATA[<p>Weil es mich interessiert hat und ich mir dachte das Insertionsort (Ich weiß das geht noch schneller aber war erstmal einfacher zu implementieren) mit einer verketteten Liste bei größeren Datenmenegen effizienter ist, da keine Elemente im Array hin und her kopiert werden müssen. Außerdem geht es mir nicht darum das man sich die Arbeit auch von einer Api abnehmen lassen könnte, ich versuche möglichst viel selber zu implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266029</guid><dc:creator><![CDATA[c++neuling2]]></dc:creator><pubDate>Wed, 31 Oct 2012 17:28:05 GMT</pubDate></item><item><title><![CDATA[Reply to Graham scan on Wed, 31 Oct 2012 18:02:21 GMT]]></title><description><![CDATA[<p>c++neuling2 schrieb:</p>
<blockquote>
<p>und ich mir dachte das Insertionsort (Ich weiß das geht noch schneller aber war erstmal einfacher zu implementieren) mit einer verketteten Liste bei größeren Datenmenegen effizienter ist, da keine Elemente im Array hin und her kopiert werden müssen.</p>
</blockquote>
<p>Daher hat std::list auch eine eigene sort-Methode <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
<p>'Tschuldigung, aber für mehr Hilfe als dumme Bemerkungen habe ich gerade keine Zeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266045</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 31 Oct 2012 18:02:21 GMT</pubDate></item><item><title><![CDATA[Reply to Graham scan on Wed, 31 Oct 2012 18:47:20 GMT]]></title><description><![CDATA[<p>ok gut, vergesst die doppelt verkettete Liste und achtet nur auf den Algorithmus im zweiten Codeblock. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Is halt so wie es ist ich mach mir gerne mehr Arbeit als nötig.</p>
<p>PS: abgesehen davon hab ichs nachgeprüft die Liste liegt letztendlich korrekt vor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266052</guid><dc:creator><![CDATA[c++neuling2]]></dc:creator><pubDate>Wed, 31 Oct 2012 18:47:20 GMT</pubDate></item><item><title><![CDATA[Reply to Graham scan on Thu, 01 Nov 2012 13:00:01 GMT]]></title><description><![CDATA[<p>Durch die Verwendung anstaendiger Datenstrukturen wie beispielsweise eines Stacks wird der ganze Algorithmus uebersichtlicher. Herzstueck dabei ist eine Funktion left_of, sie gibt an, ob ein Punkt links von zwei weiteren Punkten liegt. Hast du diese bereits?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266213</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 01 Nov 2012 13:00:01 GMT</pubDate></item></channel></rss>