一致させようとしている一連の対応するポイント (摂動の可能性あり) については、numpy に存在するように見える SVD (特異値分解) を使用しました。
この手法の例 (Python でも) はこちらにありますが、正確性については評価していません。
あなたが目指しているのは、変換行列として表される「基底変換」または「基底の変更」です。既知の 3 点が同一線上にないと仮定すると、次の方法で初期基底を作成できます。
- ベクトルの計算: x=(ba) および y=(ca)
- x の正規化 (x = x / マグニチュード(x))
- y を x に射影 (proj_y = x DOT y * x)
- y から投影を減算します (y = y - proj_y)
- y を正規化する
- z = x CROSS y を計算します。
これにより、最初の x、y、z 座標の基底 A が得られます。新しい点に対して同じことを行うと、2 番目の基底 B が得られます。次に、A の点を取り、それを B に変換する変換 T を見つけたいとします (ベースの変更)。その部分は簡単です。A を反転して点を標準基底に変換し、次に B を使用して 2 番目の基底に変換できます。A は正規直交であるため、A を転置して逆数を取得できます。したがって、「新しい d」は d * inverse(A) * B に等しくなります (ただし、表現によっては、B * inverse(A) * d を使用する必要がある場合があります)。
それをすべて取得するには、行列にある程度精通している必要があります。ベクトルと行列の表現は、T を取得するために行列を乗算する順序を通知します (T は inverse(A)*B または B*inverse(A) のいずれかです)。
ベクトル x=(x1,x2,x3), y=(y1,y2,y3), z=(z1,z2,z3) から基底行列を計算するには、次のように入力します。
| x1 y1 z1 |
| x2 y2 z2 |
| x3 y3 z3 |