2017-07-17 4 views
1

私はカーブを表す3Dデータ点の2つの別々のベクトルを持っています。これらをmatplotlibを使った3Dプロットのスキャッタデータとしてプロットしています。回転行列を計算して、2つのベクトルを3D空間に整列させますか?

両方のベクトルは原点から始まり、両方とも単位長さです。曲線は互いに似ていますが、通常は2つの曲線の間に回転があります(テスト目的では、実際には1つの曲線を使用して、2つ目の曲線を作成するために回転行列を適用しています)。

2つの曲線が3Dに並ぶように調整したいとします。曲線bを回転させると、その開始点と終了点が曲線aと整列する。私はこれを最初の点から引いて、各曲線の始めから終わりまでの直線を表す方向ベクトルを取得し、これらを単位ベクトルに変換してから、十字形と四角形の積を計算し、この回答(https://math.stackexchange.com/a/476311/357495)で概説されている方法を使用して回転行列を計算します。

しかし、私がこれを行うと、計算された回転行列が間違っていて、どうしてわからないのですか?

マイコードが(私は、Python 2.7を使用している)は、以下である:私のテストケースにおいて

# curve_1, curve_2 are arrays of 3D points, of the same length (both start at the origin) 

curve_vec_1 = (curve_1[0] - curve_1[-1]).reshape(3,1) 
curve_vec_2 = (curve_2[index][0] - curve_2[index][-1]).reshape(3,1) 
a,b = (curve_vec_1/ np.linalg.norm(curve_vec_1)).reshape(3), (curve_vec_2/ np.linalg.norm(curve_vec_2)).reshape(3) 
v = np.cross(a,b) 
c = np.dot(a,b) 
s = np.linalg.norm(v) 
I = np.identity(3) 
vXStr = '{} {} {}; {} {} {}; {} {} {}'.format(0, -v[2], v[1], v[2], 0, -v[0], -v[1], v[0], 0) 
k = np.matrix(vXStr) 
r = I + k + np.square(k) * ((1 -c)/(s**2)) 

for i in xrange(item.shape[0]): 
    item[i] = (np.dot(r, item[i]).reshape(3,1)).reshape(3) 

、曲線2は、単に印加次回転行列と曲線1:

[[1 0  0 ] 
[ 0 0.5  0.866] 
[ 0 -0.866 0.5 ]] 

( x軸を中心にちょうど60度の回転)。

再び二つのベクトルを整列させるために自分のコードによって計算された回転行列である:

[[ 1.   -0.32264329 0.27572962] 
[ 0.53984249 1.   -0.35320293] 
[-0.20753816 0.64292975 1.  ]] 

元の2つの曲線(青と緑A及びBそれぞれ)用の方向ベクトルと結果のプロット計算された回転行列(赤色)で変換されたbの値は以下の通りです。私は緑のベクトルを青に揃えるために回転行列を計算しようとしています。 Curve plot

答えて

2

問題はここにある:

r = I + k + np.square(k) * ((1 -c)/(s**2)) 

np.square(k)正方形行列の各要素。 np.matmul(k,k)またはk @ kが、それ自体で乗算された行列になります。

また、その回答のコメントに記載されているサイドケース(特にs=0)を実装すると、かなりのケースでエラーが発生します。

+0

ありがとうございます。これで解決します。 numpy <1.10を使用しているので、私はmatmulの代わりにnp.dot(k、k)を使いました。私はエッジケースを実装するつもりです。ベースケースを最初に動作させるだけです。 :) – Mark

関連する問題