S1 = (x1,y1,x2,y2) と S2 = (a1,b1,a2,b2) の 2 つの正方形があります。
A * S1 = S2 となる A 変換行列を探しています
私が見る限り、A はアフィン 3x3 行列なので、9 つの未知の値があります。
これらの値はどのように計算できますか?
ありがとう、そして最高、ヴィクトル
S1 = (x1,y1,x2,y2) と S2 = (a1,b1,a2,b2) の 2 つの正方形があります。
A * S1 = S2 となる A 変換行列を探しています
私が見る限り、A はアフィン 3x3 行列なので、9 つの未知の値があります。
これらの値はどのように計算できますか?
ありがとう、そして最高、ヴィクトル
ここには、不明な値が 4 つしかありません。回転角度、倍率、および x と y の平行移動。3 行 3 列の行列のうち、一番下の行は常に0,0,1
6 つの未知数に減少します。右側の列Tx,Ty,1
は、あなたの翻訳 (および私たちが既に知っているもの) です。
左の 2 x 2 の「行列」は、回転とスケーリングになります。これは(私の頭の上から)次のようになります。
ACos(B), -Asin(B)
ASin(B), aCos(B)
合計で:
ACos(B), -Asin(B), Tx
ASin(B), ACos(B), Ty
0 , 0 , 1
各座標の末尾にある 1 を使用して座標行列を拡張して 2x3 行列を作成し、それらを乗算して 4 つの変数について解く必要がある 4 つの方程式を作成します。それは読者の演習として残されています。
変換行列は、スケーリング行列 Ss、遷移行列 St、および回転行列 Sr の要素です。
古い点 Po が (Xo,Yo) であると仮定すると、ベクトルは (Xo Yo 1)' と表されます。新しい点 Pn についても同じです Pnv =Ss St SrPov ここで、Sx は
Sx 0 0
0 Sy 0
0 0 1
セントは
1 0 Tx
0 1 Ty
0 0 1
Srは
Cos(th) -Sin(th) 0
Sin(th) Cos(th) 0
0 0 1
あなたの質問に戻りましょう。2 つの点が長方形を表す場合、2 つの行列のパラメーターを見つけるだけで、3 つ目の行列は恒等行列になります。
Rect1 は、左上の点 P11 と右下の点 P12 として表されます。 Rect2 は、左上の点 P21 と右下の点 P22 として表されます。
S=Ss*St
Sx 0 Tx
0 Sy Ty
0 0 1
これで、4 つの欠落したパラメーターと 4 つの方程式のセットができました。
P21=S*P11
P22=S*P12
X[P21] =Sx*X[P11]+Tx
Y[P21] =Sy*Y[P11]+Ty
X[P22] =Sx*X[P12]+Tx
Y[P22] =Sy*Y[P12]+Ty
それを解けば答えが得られます。
遷移と回転がある場合、S=Sr*St.
Cos(th) -Sin(th) Tx
Sin(th) Cos(th) Ty
0 0 1
これで、3 つの欠落したパラメーターと 4 つの方程式のセットができました。
P21=S*P11
P22=S*P12
X[P21] =Cos(th)*X[P11]-Sin(th)*Y[P11]+Tx
Y[P21] =Sin(th)*X[P11]+Cos(th)*Y[P11]+Ty
X[P22] =Cos(th)*X[P11]-Sin(th)*Y[P12]+Tx
Y[P22] =Sin(th)*X[P11]+Cos(th)*Y[P12]+Ty
Cos(th) を A に、Sin(th) を B に置き換えて、方程式を解きます。
X[P21] =A*X[P11]-B*Y[P11]+Tx
Y[P21] =B*X[P11]+A*Y[P11]+Ty
X[P22] =A*X[P11]-B*Y[P12]+Tx
Y[P22] =B*X[P11]+A*Y[P12]+Ty
正しいA^2+B^2 =? 1
かどうかを確認するth = aCos(A)
解の最後の部分で、3 つの行列がすべてある場合、S=Sr St Ss は次のとおりです。
Sx*sin(th) -Sx*cos(th) Tx
Sy*cos(th) Sy*sin(th) Ty
0 0 1
これで 5 つの欠落変数があり、それを解くには 6 つの異なる方程式セットが必要です。これは、各長方形からの平均 3 ポイントです。
これらの値はどのように計算できますか?
2d/3d 変換に適用すると、射影について話している場合を除き、行列を座標系として表すことができます。
行列の行 (表記によっては列) は新しい座標系の軸を形成し、すべてのオブジェクトの頂点に行列が掛けられた場合にオブジェクトが配置されます。最後の行 (表記によっては列) は、新しい座標系の中心を指します。
標準の OpenGL/DirectX 変換行列 (射影行列ではありません):
class Matrix{//C++ code
public:
union{
float f[16];
float m[4][4];
};
};
vx(新座標系のx軸)、vy(新座標系のy軸)、vz(新座標系のz軸)、vp(新座標系の中心)の4つのベクトルの組み合わせで表現可能. このような:
vx.x vx.y vx.z 0
vy.x vy.y vy.z 0
vz.x vz.y vz.z 0
vp.x vp.y vp.z 1
「回転行列を計算する」、「スケール行列を計算する」などはすべて、この考えに基づいています。
したがって、2d 行列の場合、2d には z ベクトルがないため、vx、vy、vp の 3 つのベクトルで構成される 3x3 行列が得られます。すなわち:
vx.x vx.y 0
vy.x vy.y 0
vp.x vp.y 1
四角形 A を四角形 B に変換する変換を見つけるには、次の 2 つの変換を見つける必要があります。
クワッドの反対側のエッジが平行でない場合、このようにすることはできません。つまり、平行四辺形は問題ありませんが、ランダムな 4 辺の多角形はそうではありません。
クワッドは、クワッドの任意の頂点である基点 (vp) と、クワッドのサイズ (エッジの長さを乗じたエッジの方向) を定義する 2 つのベクトルによって表すことができます。つまり、「上」ベクトルと「横」ベクトルです。それは行列になります:
side.x side.y 0
up.x up.y 0
vp.x vp.y 1
したがって、クワッド (vp.x = 0、vp.y = 0、side.x = 1、side.y = 0、up.x = 0、up.y = 1) をこの行列で乗算すると、元のクワッドは次のようになります。あなたのクワッド。つまり、クワッド A をクワッド B に変換するには、次のようにする必要があります。
1) 「base 1unit quad」を quad A に変換する行列を作成します。これを matA と呼びましょう。
2) 「base 1 unit quad」を quad B に変換する行列を作成します。これを matB と呼びましょう。
3) matA を反転し、結果を invMatA に格納します。
4) 結果の行列は invMatA * matB です。
終わり。四角形 A を結果行列で乗算すると、四角形 B が得られます。四角形の幅または高さがゼロの場合、これは機能しません。また、四角形が平行四辺形でない場合は機能しません。
これは理解するのが難しいですが、簡単にすることはできません。
どういう意味S1 = (x1,y1,x2,y2)
ですか?
それらは正方形の左上隅と右下隅を表していますか?
また、正方形の間に回転のみがあることを保証できますか、それともスケーリング、スキュー、および変換を可能にする完全なアフィン変換が必要ですか?
それとも、遠近法の変換も必要ですか?
パースペクティブ変換の場合のみ、投稿で述べたように、8dofの3x3マトリックスが必要になります。