Schnittpunkt zwischen einer Linie und einer Kugel
Ich versuche zu finden, den Schnittpunkt zwischen einer Kugel und einer Linie, aber ehrlich gesagt, habe ich keine Idee, wie dies zu tun.
Könnte mir jemand helfen dazu ?
InformationsquelleAutor Tanguy | 2011-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Express der Linie als eine Funktion von
t
:Wenn
t = 0
es wird an einem Ende-Punkt(x0,y0,z0)
. Wennt = 1
werden, wird es am anderen Ende-Punkt(x1,y1,z1)
.Schreiben Sie eine Formel für den Abstand zum Zentrum der Kugel (zum Quadrat) in
t
(wo(xc,yc,zc)
ist der Kugelmittelpunkt):Lösen für
t
wennf(t)
gleichR^2
(R
wird der radius der Kugel):Lösen
A + B*t + C*t^2 = 0
fürt
. Dies ist eine normale quadratische Gleichung.Können Sie bis zu zwei Lösungen. Jede Lösung, wo
t
liegt zwischen 0 und 1 gültig.Wenn du eine gültige Lösung für
t
, stecken Sie es in die ersten Gleichungen um den Schnittpunkt.Bin ich davon ausgegangen, du meintest ein Liniensegment (zwei end-Punkte). Wenn Sie stattdessen möchten Sie eine vollständige Zeile (unendliche Länge), dann könnten Sie wählen Sie zwei Punkte entlang der Linie (nicht zu nah), und verwenden Sie Sie. Auch lassen
t
wirklichen Wert, nicht nur zwischen 0 und 1.Edit: ich der festen Formel für
B
. Ich war die Vermischung der Zeichen. Dank M Katz, zu erwähnen, dass es nicht funktioniert.InformationsquelleAutor Markus Jarderot
Ich glaube, es ist ein Fehler in der Lösung von Markus Jarderot. Nicht sicher, was das problem ist, aber ich bin mir ziemlich sicher, dass ich ihn übersetzt treu zu code, und als ich versuchte zu finden, der Schnittpunkt einer Zeile segment bekannt zu überqueren, in eine Sphäre, bekam ich eine negative diskriminante (keine Lösungen).
Fand ich dies: http://www.codeproject.com/Articles/19799/Simple-Ray-Tracing-in-C-Part-II-Triangles-Intersec gibt, die eine ähnliche, aber etwas anders Ableitung.
Drehte ich Sie in das folgende C# - code, und es funktioniert für mich:
B
im meine Antwort war falsch. Ich habe es jetzt behoben.Dies funktionierte perfekt für mich, ich war in der Lage, schnell konvertieren Sie es in Java auch.
InformationsquelleAutor M Katz
Nicht genug Ruf zu kommentieren, M Katz Antwort, aber seine Antwort wird davon ausgegangen, dass die Linie gehen kann stufenlos in jede Richtung. Wenn Sie müssen nur das line-SEGMENT intersection Punkte, die Sie benötigen, t1 und t2 weniger als ein (basierend auf der definition eines parametrisierten Gleichung). Bitte siehe meine Antwort in C# unter:
vielen Dank für das einfügen in Ihren code ein. Vielleicht habe ich einen Fehler gefunden in der es aber. Ich freue mich auf ein Liniensegment beginnt außerhalb einer Sphäre in eine Sphäre, aber die Schnittmenge ist null zurückgeben (leeres array). Siehe: paste.ofcode.org/aJSjXFpXvvRGf5hYcn8M9Q. Ich würde sehr schätzen jeden Kommentar zu dieser, ich danke Ihnen!
InformationsquelleAutor Ashavsky
Look up "ray-sphere-intersection" - der gleiche test wird für die ray-tracing-und es gibt viele Beispiele online, und sogar ganz wenige hier auf stackoverflow.
InformationsquelleAutor Alnitak
Können Sie die Verwendung von Wolfram Alpha zu lösen, es in das Koordinaten-system, in dem die Kugel zentriert ist.
In diesem system, die Gleichungen sind:
Kugel:
Gerade:
und danach ändern Sie wieder zu Ihrem ursprünglichen Koordinatensystem (einfache übersetzung)
InformationsquelleAutor Dr. belisarius
Finden Sie die Lösung der beiden Gleichungen in (x,y,z) beschreiben Sie die Linie und die Kugel.
Kann es 0, 1 oder 2 Lösungen.
InformationsquelleAutor pavium
Hier ist eine genauere Formulierung mit inneren Produkten, die weniger als 100 Loks, und keine externen links. Auch die Frage wurde gebeten, eine Zeile, eine Zeile segment.
Davon ausgehen, dass die Kugel, zentriert auf
C
mit radiusr
. Die Linie wird beschrieben durchP+l*D
woD*D=1
.P
undC
sind Punkte, dieD
ist ein Vektor,l
ist eine Zahl.Setzen wir
PC = P-C
,pd = PC*D
unds = pd*pd - PC*PC + r*r
. Wenns < 0
es gibt keine Lösungen, wenns == 0
gibt es nur eins, ansonsten sind es zwei. Für die Lösungen, die wir setzenl = -pd +- sqrt(s)
, dann Stecker inP+l*D
.InformationsquelleAutor Andreas Haferburg
Oder Sie können einfach nur die Formel finden sowohl:
line:
(x-x0)/a=(y-y0)/b=(z-z0)/c
, die symmetrischen Gleichungen der das Liniensegment zwischen den Punkten, die Sie finden können.Bereich:
(x-xc)^2+(y-yc)^2+(z-zc)^2 = R^2
.Verwenden Sie die symmetrische Gleichung zu finden, die Beziehung zwischen x und y, und x und z.
Dann den Stecker in y und z in Bezug auf x in der Gleichung der Sphäre.
Suchen Sie dann x, und dann kann man y und z.
Wenn x ermöglicht Ihnen ein imaginäres Ergebnis bedeutet das, dass die Linie und die Kugel nicht schneiden.
InformationsquelleAutor Fiona
Habe ich nicht den Ruf zu kommentieren Ashavsky Lösung, aber die Prüfung am Ende brauchte ein bisschen mehr tweaken.
InformationsquelleAutor Nate Pink