
Ich möchte eine rigide Transformation auf einen Punkt anwenden. Dafür erzeuge ich eine die notwendige Transformationsmatrix und wende diese auf den Punkt an. An sich funktioniert alles, nur stimmt das Ergebnis nicht...
Den Fehler kann ich bisher nicht ausmachen, vielleicht übersehe ich was offensichtliches!?
Code: Alles auswählen
def trig(angle):
r = angle
return cos(r), sin(r)
def matrix(rotation, translation):
xC, xS = trig(rotation[0])
yC, yS = trig(rotation[1])
zC, zS = trig(rotation[2])
dX = translation[0]
dY = translation[1]
dZ = translation[2]
Translate_matrix = np.array([[1, 0, 0, dX],
[0, 1, 0, dY],
[0, 0, 1, dZ],
[0, 0, 0, 1]])
Rotate_X_matrix = np.array([[1, 0, 0, 0],
[0, xC, -xS, 0],
[0, xS, xC, 0],
[0, 0, 0, 1]])
Rotate_Y_matrix = np.array([[yC, 0, yS, 0],
[0, 1, 0, 0],
[-yS, 0, yC, 0],
[0, 0, 0, 1]])
Rotate_Z_matrix = np.array([[zC, -zS, 0, 0],
[zS, zC, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]])
print np.dot(Rotate_Z_matrix,np.dot(Rotate_Y_matrix,np.dot(Rotate_X_matrix,Translate_matrix)))
return np.dot(Rotate_Z_matrix,np.dot(Rotate_Y_matrix,np.dot(Rotate_X_matrix,Translate_matrix)))
def transform(point, TransformArray):
p = np.array([0,0,0,1])
for i in range (0,len(point)-1):
p[i] = point[i]
p=np.dot(TransformArray,np.transpose(p))
for i in range (0,len(point)-1):
point[i]=p[i]
return point
if __name__ == '__main__':
point
matrix = matrix(rotation, translation)
print transform(point, matrix)
Hier mal ein Ergebnis:
Code: Alles auswählen
rotation = [0.0226817, -0.00242333, -0.00649134]
translation = [-0.19502307185234014, 0.9954635344879247, -9.30521311620628]
[[ 9.99975995e-01 6.43466541e-03 -2.56987423e-03 -1.64699688e-01]
[ -6.49127535e-03 9.99722075e-01 -2.26635509e-02 1.20734199e+00]
[ 2.42332763e-03 2.26796887e-02 9.99739846e-01 -9.28068813e+00]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
Anfangspunkt: [123.44655, 191.39461, 16.75809 ]
Endpunkt: [124.06136880554668, 191.35583140470374, 16.75809]
UPDATE:
Folgendes habe ich jetzt geändert und die Ergebnisse sehen nun besser aus:
Code: Alles auswählen
def transform(point, TransformArray):
p = np.array([0.,0.,0.,1.])
for i in range (0,len(point)):
p[i] = float(point[i])
print p
p=np.dot(TransformArray,np.transpose(p))
for i in range (0,len(point)):
point[i]=p[i]
return point