<?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[Gauss Algorithmus]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>mein Problem: Ich wollte den Schnitt von zwei Dreiecken im Raum berechnen. Dazu habe ich die entsprechenden Ebenengleichungen in Parameterdarstellung aufgestellt und anschließend das LGS aufgestellt und versucht mittels Gauss zu lösen.</p>
<p>Leider sind die Ergebnisse nicht wie gewünscht. Angeblich schneiden sich alle Dreiecke.</p>
<p>Hier mal mein Code:</p>
<pre><code class="language-cpp">#define NMAX 10

for(it=list_triangles-&gt;begin(); it!=list_triangles-&gt;end();it++)
{
       for(iit=list_triangles-&gt;begin(); iit!=list_triangles-&gt;end();iit++)
		{
				if(*it != *iit)
				{
					double a[NMAX][NMAX];         

					const float* t1_v1 = (*it)-&gt;vertices[0]-&gt;floatData(); // A1
					const float* t1_v2 = (*it)-&gt;vertices[1]-&gt;floatData(); // B1
					const float* t1_v3 = (*it)-&gt;vertices[2]-&gt;floatData(); // C1

					const float* t2_v1 = (*iit)-&gt;vertices[0]-&gt;floatData(); // A2
					const float* t2_v2 = (*iit)-&gt;vertices[1]-&gt;floatData(); // B2
					const float* t2_v3 = (*iit)-&gt;vertices[2]-&gt;floatData(); // C2

					//lies Matrix
					// r2
					a[0][0] = t2_v2[0] - t2_v1[0];
					a[1][0] = t2_v2[1] - t2_v1[1];
					a[2][0] = t2_v2[2] - t2_v1[2];
					// s2
					a[0][1] = t2_v3[0] - t2_v1[0];
					a[1][1] = t2_v3[1] - t2_v1[1];
					a[2][1] = t2_v3[2] - t2_v1[2];
					// r1
					a[0][2] = t1_v2[0] - t1_v1[0];
					a[1][2] = t1_v2[1] - t1_v1[1];
					a[2][2] = t1_v2[2] - t1_v1[2];
					// s1
					a[0][3] = t1_v3[0] - t1_v1[0];
					a[1][3] = t1_v3[1] - t1_v1[1];
					a[2][3] = t1_v3[2] - t1_v1[2];
					//b
					a[0][4] = t1_v1[0] - t2_v1[0];
					a[1][4] = t1_v1[1] - t2_v1[1];
					a[2][4] = t1_v1[2] - t2_v1[2];

					double x[NMAX];
					if(Gaussalg(a,3, x))
					{
                                        }
                                 }
                  }
}

//	Gauss'sches Eliminationsverfahren mit Zeilenpivotisierung
//    Argumente:
//    double a[N][N+1] erweiterte Koeffizientenmatrix   Read/Write
//    int n            Anzahl der Gleichungen           Read
//    double x[N]      Loesungen                        Write
//  Resultat:
//  int Fehlercode  0 fuer Fehler, 1 fuer Erfolg 

int Gaussalg (double a[][NMAX], int n, double x[]) 
{
	int   i, j;                    // Zeile, Spalte
	int   s;                       // Elimininationsschritt
	int   pzeile;                  // Pivotzeile
	int   fehler = 0;              // Fehlerflag
	double f;                      // Multiplikationsfaktor
	const double Epsilon = 0.01;   // Genauigkeit
	double Maximum;                // Zeilenpivotisierung
	//extern FILE *fout;

	s = 0;
	do {             // die einzelnen Eliminationsschritte
		//fprintf(fout, &quot;Schritt %2i von %2i\n&quot;, s+1, n-1);
		//cout &lt;&lt; (&quot;Schritt %1 von %2\n&quot;).arg(s+1).arg(n-1) &lt;&lt; endl;
		Maximum = fabs(a[s][s]);   // groesstes Element
		pzeile = s ;               // suchen
		for (i = s+1; i &lt; n; i++)
			if (fabs(a[i][s]) &gt; Maximum) {
				Maximum = fabs(a[i][s]) ;
				pzeile = i;
			}
			fehler = (Maximum &lt; Epsilon);
			if (fehler) break;           // nicht loesbar 

			if (pzeile != s)  // falls erforderlich, Zeilen tauschen
			{ double h;
			for (j = s ; j &lt;= n; j++) {
				h = a[s][j];
				a[s][j] = a[pzeile][j];
				a[pzeile][j]= h;
			}
			}

			// Elimination --&gt; Nullen in Spalte s ab Zeile s+1
			for (i = s + 1; i &lt; n; i++ ) {
				f = -(a[i][s]/a[s][s]);       // Multiplikationsfaktor
				a[i][s] = 0.0;
				for (j = s+1; j &lt;= n ; j++)   // die einzelnen Spalten
					a[i][j] += f*a[s][j];       // Addition der Zeilen i, s
			}
			s++;
	} while ( s &lt; n-1 ) ;

	if (fehler) 
	{
		cout &lt;&lt; &quot;gauss: Gleichungssystem nicht loesbar\n&quot; &lt;&lt; endl;
		//fprintf (fout, &quot;gauss: Gleichungssystem nicht loesbar\n&quot;);
		return 0; 
	}
	else 
	{
		// Berechnen der Loesungen aus der entstandenen Dreiecksmatrix
		// letzte Zeile
		x[n-1] =  a[n-1][n] / a[n-1][n-1];       
		// restliche Zeilen
		for (i = n-2 ; i &gt;= 0; i-- ) 
		{
			for (j = n-1 ; j &gt; i ; j-- ) 
			{
				a[i][n] -= x[j]*a[i][j];    // rechte Seite berechnen
			} 
			x[i] = a[i][n] / a[i][i];       // Loesung
		}
		return 1;  
	}
}
</code></pre>
<p>Warum sind alle Schnittests positiv?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/234727/gauss-algorithmus</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 08:25:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/234727.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 21 Feb 2009 17:20:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gauss Algorithmus on Sat, 21 Feb 2009 17:20:14 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>mein Problem: Ich wollte den Schnitt von zwei Dreiecken im Raum berechnen. Dazu habe ich die entsprechenden Ebenengleichungen in Parameterdarstellung aufgestellt und anschließend das LGS aufgestellt und versucht mittels Gauss zu lösen.</p>
<p>Leider sind die Ergebnisse nicht wie gewünscht. Angeblich schneiden sich alle Dreiecke.</p>
<p>Hier mal mein Code:</p>
<pre><code class="language-cpp">#define NMAX 10

for(it=list_triangles-&gt;begin(); it!=list_triangles-&gt;end();it++)
{
       for(iit=list_triangles-&gt;begin(); iit!=list_triangles-&gt;end();iit++)
		{
				if(*it != *iit)
				{
					double a[NMAX][NMAX];         

					const float* t1_v1 = (*it)-&gt;vertices[0]-&gt;floatData(); // A1
					const float* t1_v2 = (*it)-&gt;vertices[1]-&gt;floatData(); // B1
					const float* t1_v3 = (*it)-&gt;vertices[2]-&gt;floatData(); // C1

					const float* t2_v1 = (*iit)-&gt;vertices[0]-&gt;floatData(); // A2
					const float* t2_v2 = (*iit)-&gt;vertices[1]-&gt;floatData(); // B2
					const float* t2_v3 = (*iit)-&gt;vertices[2]-&gt;floatData(); // C2

					//lies Matrix
					// r2
					a[0][0] = t2_v2[0] - t2_v1[0];
					a[1][0] = t2_v2[1] - t2_v1[1];
					a[2][0] = t2_v2[2] - t2_v1[2];
					// s2
					a[0][1] = t2_v3[0] - t2_v1[0];
					a[1][1] = t2_v3[1] - t2_v1[1];
					a[2][1] = t2_v3[2] - t2_v1[2];
					// r1
					a[0][2] = t1_v2[0] - t1_v1[0];
					a[1][2] = t1_v2[1] - t1_v1[1];
					a[2][2] = t1_v2[2] - t1_v1[2];
					// s1
					a[0][3] = t1_v3[0] - t1_v1[0];
					a[1][3] = t1_v3[1] - t1_v1[1];
					a[2][3] = t1_v3[2] - t1_v1[2];
					//b
					a[0][4] = t1_v1[0] - t2_v1[0];
					a[1][4] = t1_v1[1] - t2_v1[1];
					a[2][4] = t1_v1[2] - t2_v1[2];

					double x[NMAX];
					if(Gaussalg(a,3, x))
					{
                                        }
                                 }
                  }
}

//	Gauss'sches Eliminationsverfahren mit Zeilenpivotisierung
//    Argumente:
//    double a[N][N+1] erweiterte Koeffizientenmatrix   Read/Write
//    int n            Anzahl der Gleichungen           Read
//    double x[N]      Loesungen                        Write
//  Resultat:
//  int Fehlercode  0 fuer Fehler, 1 fuer Erfolg 

int Gaussalg (double a[][NMAX], int n, double x[]) 
{
	int   i, j;                    // Zeile, Spalte
	int   s;                       // Elimininationsschritt
	int   pzeile;                  // Pivotzeile
	int   fehler = 0;              // Fehlerflag
	double f;                      // Multiplikationsfaktor
	const double Epsilon = 0.01;   // Genauigkeit
	double Maximum;                // Zeilenpivotisierung
	//extern FILE *fout;

	s = 0;
	do {             // die einzelnen Eliminationsschritte
		//fprintf(fout, &quot;Schritt %2i von %2i\n&quot;, s+1, n-1);
		//cout &lt;&lt; (&quot;Schritt %1 von %2\n&quot;).arg(s+1).arg(n-1) &lt;&lt; endl;
		Maximum = fabs(a[s][s]);   // groesstes Element
		pzeile = s ;               // suchen
		for (i = s+1; i &lt; n; i++)
			if (fabs(a[i][s]) &gt; Maximum) {
				Maximum = fabs(a[i][s]) ;
				pzeile = i;
			}
			fehler = (Maximum &lt; Epsilon);
			if (fehler) break;           // nicht loesbar 

			if (pzeile != s)  // falls erforderlich, Zeilen tauschen
			{ double h;
			for (j = s ; j &lt;= n; j++) {
				h = a[s][j];
				a[s][j] = a[pzeile][j];
				a[pzeile][j]= h;
			}
			}

			// Elimination --&gt; Nullen in Spalte s ab Zeile s+1
			for (i = s + 1; i &lt; n; i++ ) {
				f = -(a[i][s]/a[s][s]);       // Multiplikationsfaktor
				a[i][s] = 0.0;
				for (j = s+1; j &lt;= n ; j++)   // die einzelnen Spalten
					a[i][j] += f*a[s][j];       // Addition der Zeilen i, s
			}
			s++;
	} while ( s &lt; n-1 ) ;

	if (fehler) 
	{
		cout &lt;&lt; &quot;gauss: Gleichungssystem nicht loesbar\n&quot; &lt;&lt; endl;
		//fprintf (fout, &quot;gauss: Gleichungssystem nicht loesbar\n&quot;);
		return 0; 
	}
	else 
	{
		// Berechnen der Loesungen aus der entstandenen Dreiecksmatrix
		// letzte Zeile
		x[n-1] =  a[n-1][n] / a[n-1][n-1];       
		// restliche Zeilen
		for (i = n-2 ; i &gt;= 0; i-- ) 
		{
			for (j = n-1 ; j &gt; i ; j-- ) 
			{
				a[i][n] -= x[j]*a[i][j];    // rechte Seite berechnen
			} 
			x[i] = a[i][n] / a[i][i];       // Loesung
		}
		return 1;  
	}
}
</code></pre>
<p>Warum sind alle Schnittests positiv?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667669</guid><dc:creator><![CDATA[rafilis1982]]></dc:creator><pubDate>Sat, 21 Feb 2009 17:20:14 GMT</pubDate></item><item><title><![CDATA[Reply to Gauss Algorithmus on Sat, 21 Feb 2009 17:29:18 GMT]]></title><description><![CDATA[<p>Ich hab mir das jetzt nicht alles durchgelesen (Quelltext).<br />
Aber so wie ich dich verstehe stellst du Ebenengleichungen auf. Diese beschreiben aber Ebenen und keine Dreiecke.<br />
Dass sich Ebenen irgendwann schneiden, ist wohl klar (außer die sind parallel).</p>
<p>Vllt. solltest du prüfen, ob die entstehende Schnittgerade durch die beiden am Schnitt beteiligten Dreiecke läuft, und erst dann ein 1 zurück geben.</p>
<p>Grüße<br />
Franz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667676</guid><dc:creator><![CDATA[franz]]></dc:creator><pubDate>Sat, 21 Feb 2009 17:29:18 GMT</pubDate></item><item><title><![CDATA[Reply to Gauss Algorithmus on Sat, 21 Feb 2009 22:51:23 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ja ich dachte mir ich nehm die 3 Punkte der Dreiecke und stellen jeweils Ebenengleichungen auf um dann den Schnitt berechnen zu können.</p>
<p>Ich hab mittlerweile die Fälle isoliert in denen die Dreiecke die gleichen Punkte oder Kanten haben können. Dennoch zeigt er mir immer noch Dreiecke an, die eigentlich keinen Schnitt haben dürften.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667832</guid><dc:creator><![CDATA[rafilis1982]]></dc:creator><pubDate>Sat, 21 Feb 2009 22:51:23 GMT</pubDate></item><item><title><![CDATA[Reply to Gauss Algorithmus on Sun, 22 Feb 2009 16:12:27 GMT]]></title><description><![CDATA[<p>Ich hab dieses Problem auch mal lösen sollen... Evtl bringt dich der Quelltext ja ein Stückchen weiter - mir ist damals zumindest kein besserer Weg eingefallen - ich guck mal, ob ich noch paar Kommentare hinterlasse ^^</p>
<pre><code class="language-cpp">template &lt;typename Tpt&gt;
bool TriangleHits(const my::TTriangle&lt;Tpt&gt; &amp;dreieck1, const my::TTriangle&lt;Tpt&gt; &amp;dreieck2) //vorrausgesetzt, die beiden Dreiecke sind beides auch wirklich dreiecke und nicht nur eine Gerade - weiß zwar net mehr genau, wieso das so wichtig war, aber irgendwas war da ^^
{
	typedef typename Tpt::ValueType						valtype;
	typedef Tpt											point;

	const size_t										dimension = point::dimension;
	typedef my::TVector &lt;dimension, valtype&gt;			vector;
	typedef my::TLine_Segment&lt;point, vector&gt;			line_segment; //strecke
	typedef my::TPlain &lt;vector&gt;							plain;

	plain E1 = my::GetPlainFromPoints &lt;point, vector&gt; ( dreieck1.GetA(), dreieck1.GetB(), dreieck1.GetC() ); //übers Kreuzprodukt ausrechnen und dann exception werfen, wenns 0 ist (also die vectoren linear abhängig sind)
	line_segment g[3] =	{
		line_segment ( dreieck1.GetA(), vector (dreieck1.GetB()-dreieck1.GetA()) ),
		line_segment ( dreieck1.GetB(), vector (dreieck1.GetC()-dreieck1.GetB()) ),
		line_segment ( dreieck1.GetC(), vector (dreieck1.GetA()-dreieck1.GetC()) )
	};

	plain E2 = my::GetPlainFromPoints &lt;point, vector&gt; ( dreieck2.GetA(), dreieck2.GetB(), dreieck2.GetC() );
	line_segment g2[3] = {
		line_segment ( dreieck2.GetA(), vector (dreieck2.GetB()-dreieck2.GetA()) ),
		line_segment ( dreieck2.GetB(), vector (dreieck2.GetC()-dreieck2.GetB()) ),
		line_segment ( dreieck2.GetC(), vector (dreieck2.GetA()-dreieck2.GetC()) )
	};

	for(size_t i(0); i != 3; ++i)
	{
		math::intersection::result res = math::intersects &lt;plain, line_segment, point&gt; (E2, g[i]);
		if (res == math::intersection::yes || res == math::intersection::contains) //schneiden sich oder sind identisch
		{
			for(size_t j(0); j != 3; ++j)
			{
				res = math::intersects &lt;plain, line_segment, point&gt; (E1, g2[j]);
				if (res == math::intersection::yes || res == math::intersection::contains)
					return true;
			}
		}
	}

	return false;
}
</code></pre>
<p>Kann dir zwar nicht mehr alles ganz genau ausm Kopf erklären, aber wenn du Fragen hast, könnte ich noch mal überlegen und ggf. versuchen zu erklären ^^</p>
<p>Ums Zusammenzufassen:<br />
Es reicht nicht, zu überprüfen, ob sich die beiden Ebenen schneiden...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1668160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1668160</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 22 Feb 2009 16:12:27 GMT</pubDate></item></channel></rss>