2017-05-02 2 views
3

Mit der 4x4-Transformationsmatrix einer Kugel und einem Punkt im Raum möchte ich den nächsten Punkt auf der Kugeloberfläche finden.Abfrage des nächsten Punkts einer transformierten Kugel

Normalerweise würde ich eine Linie zwischen dem Punkt und der Kugelmitte ziehen und den Radius der Kugel verwenden, um meine Lösung zu erhalten, aber hier habe ich es mit einer nicht gleichmäßig skalierten Kugel zu tun. Hier ist ein kurzes Beispiel in Python:

import numpy as np 
from numpy.core.umath_tests import inner1d 

# 4x4 transform matrix of a sphere with the following components: 
# Scale XYZ = 1,5,1 (Scaled only in Y axis to keep this example simple) 
# Rotation XYZ = 0,0,45 (Simple tilt for this example) 
# Position XYZ = -1,3,0 (Position along XY plane, again for simplicity) 
M = np.array([[ 0.70710678, 0.70710678, 0.  , 0.  ], 
       [-3.53553391, 3.53553391, 0.  , 0.  ], 
       [ 0.  , 0.  , 1.  , 0.  ], 
       [-1.  , 3.  , 0.  , 1.  ]]) 

# Query point p0 
p0 = np.array([-2,6,0]) 

# Transform the point into a unit sphere 
I = np.linalg.inv(M) 
p1 = np.array(p)-M[3,:3] 
p1 = np.dot(p1,I) 

# Normalize the point so it is on the surface of the unit sphere 
mag = np.sqrt(inner1d(p1,p1)) # magnitude 
p1 /= mag 

# Transform back into 3D space 
p1 = np.dot(p1,M[:3,:3]) + M[3,:3] #result [-1.65653216, 4.96959649, 0.] 

enter image description here

Diese Lösung ist schnell und funktioniert gut, wenn die Abfrage Punkt auf den Bereich bereits in der Nähe ist, aber nicht so viel, wenn es entfernt ist. Siehe im Bild oben: Punkt p2, was das gewünschte Ergebnis wäre.

+0

sehen Sie meine Suche nach [Ray und Ellipsoid Kreuzungsgenauigkeit Verbesserung] (http://stackoverflow.com/q/25470493/2521214) – Spektre

Antwort

3

Sie wollen bei David Eberley der „Abstand von einem Punkt auf einer Ellipse, ein Ellipsoid oder eine Hyperellipsoid“ suchen (PDF download.) Letztlich Wurzeln eines vierten Grades Polynom Sie für eine 2D-Ellipse zu finden, und Wurzeln eines 6. Grad Polynoms für ein 3D-Ellipsoid, so ist dies keineswegs ein einfaches Problem.

Angesichts dieser Komplexität möchten Sie vielleicht stattdessen ein ungefähres Ergebnis suchen, z. B. durch Vermaschen des Ellipsoids und Suchen nach dem nächsten Netzknoten.

3

Ich weiß nicht, ob das iterative Verfahren unten funktioniert, aber es kommt intuitiv in den Sinn. Vielleicht ist es einen Versuch wert.

  • Zeichnen Sie vom gegebenen Punkt eine Linie zum Zentrum des Elliposids und erhalten Sie den Schnittpunkt mit der Oberfläche.

  • Konstruieren Sie die Normalebene am Schnittpunkt und projizieren Sie den gegebenen Punkt darauf.

  • Verbinden Sie die Projektion mit der Mitte, finden Sie den Schnittpunkt mit der Oberfläche und wiederholen Sie von 2. bis zur Konvergenz.

  • Ich kann nicht sagen, ob Konvergenz zum nächsten Punkt garantiert werden kann. Alles, was ich sagen kann, ist, dass, wenn es Konvergenz gibt, Sie eine orthogonale Projektion des gegebenen Punktes auf die Oberfläche gefunden haben.

    Das Bild zeigt die ersten Iterationen (Schnittpunkte in Grün, Projektionen in Orange).

    enter image description here

    Dies ist wahrscheinlich äquivalent zu Newtons Iterationen.

    Verwandte Themen