<?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[Kollisionerkennung]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>ich muss eine Simulation für Mehrkörperstöße schreiben in C++. Nun habe ich schon einiges geschafft, aber mir will es nicht kollidieren.</p>
<p>So direkt mal etwas Code:</p>
<pre><code>//Hauptschleife	
while(true)
	{
		fTime+=1.0f;
		pApp-&gt;Loop();

		if(BallPhysics::IsKollisionBall(pBall1, pBall2) == false)
		{
			pBall1-&gt;Update(fTime);
			pBall2-&gt;Update(fTime);
		}
		else
		{
			BallPhysics::Kollision(pBall1, pBall2, fTime);
			pBall1-&gt;Update(fTime);
			pBall2-&gt;Update(fTime);
		}

		pApp-&gt;DrawLinie(pBall1-&gt;GetXFirstPosition(), pBall1-&gt;GetYFirstPosition(), pBall1-&gt;GetXPosition(), pBall1-&gt;GetYPosition(), BLACK);
		pApp-&gt;DrawLinie(pBall2-&gt;GetXFirstPosition(), pBall2-&gt;GetYFirstPosition(), pBall2-&gt;GetXPosition(), pBall2-&gt;GetYPosition(), RED);
	}
</code></pre>
<p>Hier wird alles zusammengebracht.</p>
<p>Hier mein Code zur Kollisionerkennung:</p>
<pre><code>bool IsKollisionBall(CBall* A, CBall* B)
{
	//Es muss gelten d &lt;= R_1 + R_2 (d: Abstand der Mittelpunkte der Kreise)
	//d^2 = Delta(y)^2 + Delta(x)^2
	//Delta(y) = y_1 - y_2, Delta(x) = x_2 - x_1
	float fX = B-&gt;GetXPosition() - A-&gt;GetXPosition();
	float fY = A-&gt;GetYPosition() - B-&gt;GetYPosition();

	float fDis = sqrt(fX*fX + fY*fY);

	if(fDis &lt; (A-&gt;GetRadius() + B-&gt;GetRadius()))
	{
		return true;
	}
	else if(fDis == (A-&gt;GetRadius() + B-&gt;GetRadius()))
	{
		return true;
	}
	else if(fDis &gt; (A-&gt;GetRadius() + B-&gt;GetRadius()))
	{
		return false;
	}
}
</code></pre>
<p>Hintergrund ist halt, dass der Abstand zwischen den beiden Mittelpunkte der Kugeln gleich kleiner der Summe der beiden Radien sein sollte damit die kollidieren.<br />
Es ist halt eingestellt, dass Kugel 1 mit x = 0 und y = 300 und Kugel 2 mit x = 300 und y = 300 ihre Position haben aber sollten sie schon nach einer Zeit kollidieren, aber das tut es nicht!</p>
<p>Hier noch die Update Methoden von CBall:</p>
<pre><code>void CBall::Update(float fTime)
{
	//Geschwindigkeit = Beschleunigung * Zeit = (F / m) * t
	m_fXSpeed += (m_fXForce / m_fMass) * fTime;
	m_fYSpeed += (m_fYForce / m_fMass) * fTime;

	//Bewegung = Geschwindigkeit * Zeit
	m_fXPosition += (m_fXSpeed * fTime);
	m_fYPosition += (m_fYSpeed * fTime);
}
</code></pre>
<p>und was passiert wenn beide Kugeln kollidieren:</p>
<pre><code>void Kollision(CBall* A, CBall* B, float fTime)
{
	//v_12 = (m_1 - m2) / (m_1 + m_2) * v_11
	//v_22 = 2*m_1 / (m_1 + m_2) * v_11
	//Geschwindigkeit von Ball A überträgt sich auf Ball B, durch Impuls- und Energieerhaltung
	//Da m und R gleich sind, ist v_12 = 0 und v_22 = v_11
	//F=m*a = m*v/t
	B-&gt;SetSpeed(A-&gt;GetXSpeed(), A-&gt;GetYSpeed());
	float fXAcc = A-&gt;GetXSpeed()/fTime; 
	float fYAcc = A-&gt;GetYSpeed()/fTime; 
	B-&gt;SetFirstForce(fXAcc, fYAcc);

	//Geschwindigkeit von Ball A ist gleich Null
	A-&gt;SetSpeed(0, 0);
	A-&gt;SetFirstForce(0, 0);
}
</code></pre>
<p>Physikalisch gilt halt nach Energie- und Impulserhaltung, dass die erste Kugeln nach der Kollision halt die Geschwindigkeit 0 hat und die zweite Kugel die Geschwindigkeit von Kugel 1 vor der Kollision (Natürlich gilt das nur, wenn beide Radien und Massen gleich sind, aber das ist hier der Fall).</p>
<p>Ich hoffe ihr sieht wo mein Problem ist, da ich nicht mehr weiter weiß warum mit die Kollisionerkennung nichts als false ausgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247214/kollisionerkennung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 15:57:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247214.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 07 Aug 2009 17:13:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kollisionerkennung on Fri, 07 Aug 2009 17:13:41 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>ich muss eine Simulation für Mehrkörperstöße schreiben in C++. Nun habe ich schon einiges geschafft, aber mir will es nicht kollidieren.</p>
<p>So direkt mal etwas Code:</p>
<pre><code>//Hauptschleife	
while(true)
	{
		fTime+=1.0f;
		pApp-&gt;Loop();

		if(BallPhysics::IsKollisionBall(pBall1, pBall2) == false)
		{
			pBall1-&gt;Update(fTime);
			pBall2-&gt;Update(fTime);
		}
		else
		{
			BallPhysics::Kollision(pBall1, pBall2, fTime);
			pBall1-&gt;Update(fTime);
			pBall2-&gt;Update(fTime);
		}

		pApp-&gt;DrawLinie(pBall1-&gt;GetXFirstPosition(), pBall1-&gt;GetYFirstPosition(), pBall1-&gt;GetXPosition(), pBall1-&gt;GetYPosition(), BLACK);
		pApp-&gt;DrawLinie(pBall2-&gt;GetXFirstPosition(), pBall2-&gt;GetYFirstPosition(), pBall2-&gt;GetXPosition(), pBall2-&gt;GetYPosition(), RED);
	}
</code></pre>
<p>Hier wird alles zusammengebracht.</p>
<p>Hier mein Code zur Kollisionerkennung:</p>
<pre><code>bool IsKollisionBall(CBall* A, CBall* B)
{
	//Es muss gelten d &lt;= R_1 + R_2 (d: Abstand der Mittelpunkte der Kreise)
	//d^2 = Delta(y)^2 + Delta(x)^2
	//Delta(y) = y_1 - y_2, Delta(x) = x_2 - x_1
	float fX = B-&gt;GetXPosition() - A-&gt;GetXPosition();
	float fY = A-&gt;GetYPosition() - B-&gt;GetYPosition();

	float fDis = sqrt(fX*fX + fY*fY);

	if(fDis &lt; (A-&gt;GetRadius() + B-&gt;GetRadius()))
	{
		return true;
	}
	else if(fDis == (A-&gt;GetRadius() + B-&gt;GetRadius()))
	{
		return true;
	}
	else if(fDis &gt; (A-&gt;GetRadius() + B-&gt;GetRadius()))
	{
		return false;
	}
}
</code></pre>
<p>Hintergrund ist halt, dass der Abstand zwischen den beiden Mittelpunkte der Kugeln gleich kleiner der Summe der beiden Radien sein sollte damit die kollidieren.<br />
Es ist halt eingestellt, dass Kugel 1 mit x = 0 und y = 300 und Kugel 2 mit x = 300 und y = 300 ihre Position haben aber sollten sie schon nach einer Zeit kollidieren, aber das tut es nicht!</p>
<p>Hier noch die Update Methoden von CBall:</p>
<pre><code>void CBall::Update(float fTime)
{
	//Geschwindigkeit = Beschleunigung * Zeit = (F / m) * t
	m_fXSpeed += (m_fXForce / m_fMass) * fTime;
	m_fYSpeed += (m_fYForce / m_fMass) * fTime;

	//Bewegung = Geschwindigkeit * Zeit
	m_fXPosition += (m_fXSpeed * fTime);
	m_fYPosition += (m_fYSpeed * fTime);
}
</code></pre>
<p>und was passiert wenn beide Kugeln kollidieren:</p>
<pre><code>void Kollision(CBall* A, CBall* B, float fTime)
{
	//v_12 = (m_1 - m2) / (m_1 + m_2) * v_11
	//v_22 = 2*m_1 / (m_1 + m_2) * v_11
	//Geschwindigkeit von Ball A überträgt sich auf Ball B, durch Impuls- und Energieerhaltung
	//Da m und R gleich sind, ist v_12 = 0 und v_22 = v_11
	//F=m*a = m*v/t
	B-&gt;SetSpeed(A-&gt;GetXSpeed(), A-&gt;GetYSpeed());
	float fXAcc = A-&gt;GetXSpeed()/fTime; 
	float fYAcc = A-&gt;GetYSpeed()/fTime; 
	B-&gt;SetFirstForce(fXAcc, fYAcc);

	//Geschwindigkeit von Ball A ist gleich Null
	A-&gt;SetSpeed(0, 0);
	A-&gt;SetFirstForce(0, 0);
}
</code></pre>
<p>Physikalisch gilt halt nach Energie- und Impulserhaltung, dass die erste Kugeln nach der Kollision halt die Geschwindigkeit 0 hat und die zweite Kugel die Geschwindigkeit von Kugel 1 vor der Kollision (Natürlich gilt das nur, wenn beide Radien und Massen gleich sind, aber das ist hier der Fall).</p>
<p>Ich hoffe ihr sieht wo mein Problem ist, da ich nicht mehr weiter weiß warum mit die Kollisionerkennung nichts als false ausgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757046</guid><dc:creator><![CDATA[Physiker04]]></dc:creator><pubDate>Fri, 07 Aug 2009 17:13:41 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisionerkennung on Fri, 07 Aug 2009 21:00:06 GMT]]></title><description><![CDATA[<p>1. Bist du in einem völlig falschen Forum. Hier geht es um Standard C++ Fragen und nicht um andere Probleme. Dafür gibt es die anderen Unterforen..</p>
<p>2. Erklärst du überhaupt nicht, wo genau dein Problem ist. Findet die Kollision nicht statt? Stimmen nach der Kollision die Werte nicht? Bewegen sich die Bälle nicht? usw.</p>
<p>3. Kleine, gänige Optimierung</p>
<pre><code class="language-cpp">bool IsKollisionBall(CBall* A, CBall* B)
{
    //Es muss gelten d &lt;= R_1 + R_2 (d: Abstand der Mittelpunkte der Kreise)
    //d^2 = Delta(y)^2 + Delta(x)^2
    //Delta(y) = y_1 - y_2, Delta(x) = x_2 - x_1
    float fX = B-&gt;GetXPosition() - A-&gt;GetXPosition();
    float fY = A-&gt;GetYPosition() - B-&gt;GetYPosition();

    float fDis = (fX*fX + fY*fY);

    if(fDis &lt;= (pow(A-&gt;GetRadius(),2) + pow(B-&gt;GetRadius(),2) ) )
    {
        return true;
    }
    else
    {
        return false;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1757132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757132</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 07 Aug 2009 21:00:06 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisionerkennung on Fri, 07 Aug 2009 21:40:38 GMT]]></title><description><![CDATA[<p><strong>Lemma 2.1.7</strong><br />
Sei eine Abfrage nach folgendem Schema gegeben, wobei der Ausdruck &quot;Bedingung&quot; einen boolschen Wahrheitswert repräsentiert:</p>
<pre><code class="language-cpp">if (Bedingung)
{
    return true;
}
else
{
    return false;
}
</code></pre>
<p>So lässt sich eine äquivalente Schreibweise finden, für die die gegebenen Gesetze in gleichem Masse gelten. Diese lautet:</p>
<pre><code class="language-cpp">return Bedingung;
</code></pre>
<p>Ein Beweis sei an dieser Stelle dem Leser überlassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757154</guid><dc:creator><![CDATA[Konvergenztheoretiker]]></dc:creator><pubDate>Fri, 07 Aug 2009 21:40:38 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisionerkennung on Fri, 07 Aug 2009 22:00:27 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>3. Kleine, gänige Optimierung</p>
<pre><code class="language-cpp">//(...)
    if(fDis &lt;= (pow(A-&gt;GetRadius(),2) + pow(B-&gt;GetRadius(),2) ) )
    //(...)
</code></pre>
</blockquote>
<p>a² + b² != (a + b)²<br />
Und 2x pow() statt 1x sqrt() ist keine Optimierung.<br />
Also wenn dann</p>
<pre><code class="language-cpp">//(...)
    float const rsum = fabs(A-&gt;GetRadius()) + fabs(B-&gt;GetRadius()); // fabs vermutlich überflüssig, Radien sollten ja nie negativ werden.. hm...
    float const rsumsquared = rsum * rsum;
    if (fDis &lt;= rsumsquared)
    //(...)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1757162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757162</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 07 Aug 2009 22:00:27 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisionerkennung on Fri, 07 Aug 2009 22:16:51 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Ah mist. Ja, ich habe es eigentlich anders rum gemeint.. -.-</p>
<p>Das pow war eigl. nur da, weil ich zu faul war das ganze nochmal hinzuklatschen, oder den Code oben in eine Variable zu packen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757174</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 07 Aug 2009 22:16:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisionerkennung on Sat, 08 Aug 2009 10:13:17 GMT]]></title><description><![CDATA[<p>Das Problem liegt darin, dass mit die Funktion IsKollisionBall kein true zurückgibt. Ich habe jetzt schon im paar Mal im Inet nachgeschaut, aber überall ist es gang und gäbe so die Kollisionserkennung zwischen zwei Kreisen zu machen.</p>
<p>Und ich wusste selbst das sqrt ziemlich unoptimiert ist und man da lieber die Quadrate nehmen sollte, aber bevor man an die Optimierung denken sollte, muss es ja erstmal richtig funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757294</guid><dc:creator><![CDATA[Physiker04]]></dc:creator><pubDate>Sat, 08 Aug 2009 10:13:17 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisionerkennung on Sat, 08 Aug 2009 10:34:55 GMT]]></title><description><![CDATA[<p>Dann schau da doch mal mit dem Debugger. Die Funktion sieht soweit richtig aus. Was jetzt halt sein könnte ist, dass die beiden übergebenen Zeiger nicht die richtigen sind. Oder die getter etwas falsches zurückgeben.</p>
<p>Ich würde mal darauf tippen, dass die Werte, die du für x und y in Ball gespeichert hast nicht aktuell sind.</p>
<p>Das ist jetzt etwas, was sehr gut mit dem Debugger überprüft werden kann. Schalt den einfach mal an, wenn du glaubst, dass eine Kollision stattfindet und überprüf die Werte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757300</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 08 Aug 2009 10:34:55 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisionerkennung on Sun, 09 Aug 2009 10:32:11 GMT]]></title><description><![CDATA[<p>Nun, ich habe das Problem selbst gelöst und zwar ist der Algorithmus zur Kollisionserkennung nicht gerade der beste ist.<br />
Das Problem liegt hier:</p>
<pre><code>float fX = B-&gt;GetXPosition() - A-&gt;GetXPosition();
    float fY = A-&gt;GetYPosition() - B-&gt;GetYPosition();

    float fDis = (fX*fX + fY*fY);
</code></pre>
<p>Wenn nämlich fX negativ wird, wird durch das Quadrat das Vorzeichen zerstört und daher wird die kleiner gleich abfrage auch verfälscht.<br />
Übrigens bin ich selbst schon längst auf die Idee gekommen mit dem Debugger drüber zu schauen und wusste daher das die (x,y) Koordinaten und die Zeiger richtig sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757786</guid><dc:creator><![CDATA[Physiker04]]></dc:creator><pubDate>Sun, 09 Aug 2009 10:32:11 GMT</pubDate></item><item><title><![CDATA[Reply to Kollisionerkennung on Sun, 09 Aug 2009 10:42:52 GMT]]></title><description><![CDATA[<p>Physiker04 schrieb:</p>
<blockquote>
<p>Wenn nämlich fX negativ wird, wird durch das Quadrat das Vorzeichen zerstört und daher wird die kleiner gleich abfrage auch verfälscht.</p>
</blockquote>
<p>Wie kann eine Distanz denn ein Vorzeichen haben?<br />
Wie hast du das Problem gelöst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757791</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Sun, 09 Aug 2009 10:42:52 GMT</pubDate></item></channel></rss>