19

私はいくつかの 2D 描画を行いたいので、いくつかの行列変換を実装したいと考えています。私の軽い数学のバックグラウンドで、C#でこれを行う方法を理解しようとしています(他のoop言語は明らかにそれを行います)。

私が読んだのは、翻訳に対処できるようにするには 3x3 マトリックスを使用する必要があるという説明だけです。掛け算では翻訳できないからです。しかし、これは変換を作成する行列の乗算によるものです。したがって、次のようなものを使用します。

{ x1, x2, tx }
{ y1, y2, ty }
{ 0,  0,  1  }

3 列目の平均はわかりましたが、なぜ 3 行目が必要なのですか? 回転、スケール、または回転と同様に恒等行列では、最後の行は同じです。まだ到達していない操作はありますか? 一部の言語 (Java) は「二乗次元」配列でパフォーマンスが向上するためですか? その場合、C# で 3 列と 2 行を使用できます (ギザギザの配列も同様またはそれ以上に機能するため)。

たとえば、回転 + 平行移動の場合、次のような行列があります

{ cos(rot)*x1, (-sin(rot))*x2, tx }
{ sin(rot)*y1, cos(rot)*y2,    ty }
{ 0,           0,              1  }

最後の行は必要ありません。

4

2 に答える 2

33

これは、変換を作成する行列の乗算によるものです

これが正方行列が必要な理由です。

あなたが提案したことを行い、変換に 2x3 行列を使用したとします。

次に、回転は次のようになります

( x1, x2, 0 )
( y1, y2, 0 )

そして翻訳は

( 1, 0, tx )
( 0, 1, ty )

また、行列に点を表す列ベクトルを掛けることで、回転または平行移動を実行できます。

    ( x )
M   ( y )
    ( 0 )

正しい答えを得るために。

しかし、変換を構成するにはどうすればよいでしょうか。確かに、「回転と平行移動の場合、このようなマトリックスがあります」の例では、どのようにしてそのマトリックスにたどり着きましたか? 確かに、この場合はそのまま書き出すことができますが、一般的には? さて、あなたは答えを知っています:

これは、変換を作成する行列の乗算によるものです

したがって、2 つの変換行列を乗算して別の変換行列を得ることが可能でなければなりません。そして、行列の乗算の規則は、次のことを示しています。

( . . . ) ( . . . )
( . . . ) ( . . . ) = ???

は有効な行列乗算ではありません。変換を構成可能にするために、乗算できる行列が必要です。したがって、余分な行があります。


さて、ここで私が表現した方法は、実際には標準的な数学的表現から完全に逆行しています。そこでは、よく知られた回転と平行移動の変換は、射影平面上の同次座標変換のフルパワーの特殊なケースにすぎません。追加の行が必要な理由を示すのに役立ちます-行列を正方形にして、同様の行列で乗算できるようにするためです。

于 2012-05-22T12:23:00.530 に答える
6

答えは同次座標です。1 回の操作で回転と平行移動を組み合わせるには、モデルが必要とするよりも 1 つの余分な次元が必要です。平面的なものでは 3 つのコンポーネントであり、空間的なものでは 4 つのコンポーネントです。演算子は 3 つのコンポーネントを取り、3x3 行列を必要とする 3 つのコンポーネントを返します。

于 2012-05-22T11:59:30.757 に答える