Kugelschnittberechnung liefert falsche Werte

mamelinchen

Bekanntes Mitglied
Ich habe eine Kugeklasse, und diese Kugel
hat 3 Koordinaten, einen Strahl mit Ursprung und Richtung.

Ich will jetzt berechnen, ob die kugel von dem Strahl getroffen wird oder nicht.

Java:
public Hit intersect(Ray ray) {
		System.out.println("  SPHERE_______________________________");
		// Verschiebung des Mittelpunktes
		Vector x0 = ray.getOrigin().sub(offset);
		System.out.println(x0 + "  Mittelpunkt verschoben");
		// b: x0*d
		float b = (float) x0.dot(ray.getDirection());
		System.out.println(b + "  B");
		System.out.println(ray.getDirection() + "  RayDirection()");
		// c: x02 * r2
		System.out.println(r + "  Radius");
		float c = (float) (x0.dot(x0)) - (r * r);
		System.out.println(c + "  C");
		// Kein Treffer
		float treffertest = (b * b) - c;
		System.out.println(treffertest + "  Treffertest (b*b-c)");
		if (treffertest < 0) {
			return new Hit(0, false, null);
		} else {
			// Ein Treffer
			// return new Hit(t, false, this);
			float t = (float) (-b - (Math.sqrt(treffertest)));
			System.out.println(t + "  T");
			return new Hit(t, true, this);
		}

Es klappt aber nicht.

Bei der Beispielrechnung:
Strahl(0,0,0->0,0,-5)
Kugel: (x,y,z,radius)
Kugel(0,0,-5,2)

liefert t nicht den Abstand zur Kugel beim ersten Trefferpunkt 3(5-2 für Radius),
sondern 0.423..., wie die Ausgabe zeigt:
Code:
  SPHERE_______________________________
(0.0, 0.0, 5.0)  Mittelpunkt verschoben
-25.0  B
(0.0, 0.0, -5.0)  RayDirection()
2.0  Radius
21.0  C
604.0  Treffertest (b*b-c)
0.42358854  T
5.0 Länge des Richtungsvektors

Ich seh den Fehler nicht...
 
Zuletzt bearbeitet:
Ich habe eine Kugeklasse, und diese Kugel
hat 3 Koordinaten, einen Strahl mit Ursprung und Richtung.


Ich seh den Fehler nicht...

Die Kugel muss sicher noch einen Radius haben, sonst ist es keine Kugel.

Wo ist die Formel für die Durchdringung (Anzahl Punkte in denen der Strahl die Kugelhülle durchdringt muss > 0 sein) oder die Abstandsberechnung (Abstand Strahl - Mittelpunkt <= Radius) ?

Vor lauter sysouts ist es etwas schwieirig den Überblick zu behalten ...
--
Zitat: "Mathematiker sterben nicht, sie verlieren nur einige ihrer Funktionen"

Hier sind fehlt auch schon einiges, wer ist am Sterben 🙂
 
Zuletzt bearbeitet:
Wenn deine Formeln richtig sind, solltest du mal dein Augenmerk auf numerische Probleme (Genauigkeit und Rundung) legen. Verwende z.B. double und achte darauf, dass du keine Vermengung mit ints produzierst.
Die Rechnung mit Fließkomma ist immer ein wenig problematisch, sollte aber in einem defnierten Wertebereich für dein Vorhaben ausreichend sein.
 
Wenn deine Formeln richtig sind, solltest du mal dein Augenmerk auf numerische Probleme (Genauigkeit und Rundung) legen. Verwende z.B. double und achte darauf, dass du keine Vermengung mit ints produzierst.
Der Kreis hat die Instanzvariablen Vector(float x,float y,float z) als Mittepunkt(offset), den radius float r und ne Farbe.

Ich verwende überall nur float zur Berechnung, das habe ich schön überprüft.
Ich habe ja alles per Hand mit Taschenrechner ausgerechnet,
der liefert das gleiche Ergebnis:S

Der Radius ist r im Code,

oder die Abstandsberechnung (Abstand Strahl - Mittelpunkt <= Radius) ?

Der Abstand soll t sein, also durch die p-q-Formel berechnet werden,

das wäre t= -b +- Wurzel aus(b*b-c)

Je nachdem b*b-c ergibt(kleiner als null= kein Schnittpunkt, grösser gleich)

Das wird aber mit der Formel nie erreicht,
und die Formel hab ich von meinem Professor.
 

Zurück
Oben