Test, ob ein Liniensegment schneidet eine Kugel
Ich versuche, um zu bestimmen, ob ein Linien-segment (d.h. zwischen zwei Punkten) schneidet eine Kugel. Ich bin nicht daran interessiert, die position der Kreuzung, nur ob oder nicht das segment schneidet die Kugeloberfläche. Hat jemand irgendwelche Vorschläge, was die meisten effizienten Algorithmus für diese wäre? (Ich Frage mich, ob es irgendwelche algorithmen, die sind einfacher als die übliche ray-sphere-intersection-algorithmen, da bin ich nicht interessiert an der Kreuzung position)
Meinst du das wirklich für einen Linienabschnitt oder eine unendliche Linie? Alle Antworten beziehen sich auf unendliche Linien.
InformationsquelleAutor astrofrog | 2010-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, was der standard-Weg, es zu tun ist, aber wenn du nur möchten wissen, OB zur Kreuzung, hier ist was ich tun würde.
Regel ... vermeiden, sqrt() oder eine andere kostspielige Operationen. Wenn möglich, befassen sich mit dem Quadrat des radius.
Ab hier, Ihr Startpunkt ist außerhalb der Sphäre.
Von hier an sind Sie in die kompliziertere phase. Ihr Ausgangspunkt ist zwischen den imaginären Feld und die Kugel. Sie können einen vereinfachten Ausdruck mithilfe der Infinitesimalrechnung und geometrie.
Den Kern dessen, was Sie tun möchten, ist zu bestimmen, wenn die kürzeste Entfernung zwischen dem Strahl und der Kugel kleiner ist als der radius der Kugel ist.
Lassen Sie Ihre ray-vertreten durch (x0 + it, y0 + jt, z0 + kt), und der Mittelpunkt der Kugel bei (xS, yS, zS). So wollen wir suchen t so, dass es geben würde, die kürzeste (xS - x0 - icht, yS - y0 - jt, zS - z0 - kt).
Let x = xS - x0, y = yX - y0, z = zS - z0, D = Größe des Vektors quadriert
D = (x^2) -2*xicht + (i*t)^2 + y^2 - 2*yjt + (j*t)^2 + z^2 - 2*zkt + (k*t)^2
D = (i^2 + j^2 + k^2)t^2 - (xi + yj + zk)*2*t + (x^2 + y^2 + z^2)
dD/dt = 0 = 2*t*(i^2 + j^2 + k^2) - 2*(xi + yj + z*k)
t = (xi + yj + z*k) /(i^2 + j^2 + k^2)
Stecker t wieder in die Gleichung für D = .... Wenn das Ergebnis kleiner ist als oder gleich dem Quadrat des Kugel-radius, Sie haben eine Schnittmenge. Wenn es größer ist, dann gibt es keinen Schnittpunkt.
InformationsquelleAutor Sparky
Wenn Sie nur daran interessiert, wenn man weiß, ob man schneidet oder nicht, dann ist Ihre grundlegende Algorithmus wird so Aussehen...
Betrachten Sie den Vektor Ihrer ray-Linie, A -> B.
Wissen Sie, dass der kürzeste Abstand zwischen diesem Vektor und dem Mittelpunkt der Kugel, tritt an der Kreuzung der Ihre ray-Vektor und einem Vektor, das ist bei 90 Grad auf diese, die geht durch den Mittelpunkt der Kugel.
Ihnen deshalb haben zwei Vektoren aus den Gleichungen, welche vollständig vollständig definiert. Sie können arbeiten aus dem Schnittpunkt der Vektoren über lineare algebra, und damit die Länge der Linie (oder effizienter mit dem Quadrat der Länge der Linie) und zu testen, ob diese kleiner ist als der radius (oder das Quadrat des radius) der Kugel.
Danke für, die. Ich habe kopfschüttelnd auf die andere höher-ranking Antworten auf dieser Seite für eine Weile. Vor allem diejenigen, die beginnen mit "ich weiß nicht, der standard-Weg, dies zu tun', wenn die Antwort, die ich geben, ist der standard-Weg, dies zu tun 🙂
Diese Antwort ergibt sich der "aha" - moment, sind Sie wahrscheinlich auf der Suche für.
InformationsquelleAutor Cruachan
Auf dieser Seite hat eine genaue Lösung für dieses problem. Im wesentlichen, Sie sind setzt man die Gleichung für die Linie in die Gleichung für die Kugel, dann berechnet die diskriminante der resultierenden quadratischen. Die Werte der diskriminante angeben, Kreuzung.
Link ist tot 🙁
Aktualisiert, um eine live-link.
InformationsquelleAutor plinth
Sie sorta arbeiten müssen, dass die position jedenfalls, wenn Sie wollen, Genauigkeit. Der einzige Weg, um die Geschwindigkeit zu erhöhen algorithmisch ist der Umstieg von ray-sphere intersection ray-bounding-box-intersection.
Oder Sie könnte tiefer gehen und versuchen zu verbessern, sqrt und andere innere Funktion ruft
http://wiki.cgsociety.org/index.php/Ray_Sphere_Intersection
InformationsquelleAutor CVertex