1

ポリゴンを描画するカスタム コントロールを作成しています。マトリックス計算を使用して、ポリゴンがコントロールに収まるようにスケーリングおよびせん断します。

いずれかのポリゴン内でマウスがクリックされたかどうかを知る必要があるため、レイ キャスティングを使用しています。

これはすべて個別にうまく機能しているようですが、使用しているディスプレイマトリックスに関連するマウス座標を取得する際に問題が発生しています。

次のコードを使用します。

// takes the graphics matrix used to draw the polygons
Matrix mx = currentMatrixTransform;            

// inverts it
mx.Invert();

// mouse position
Point[] pa = new Point[] { new Point(e.X, e.Y) };

// uses it to transform the current mouse position
mx.TransformPoints(pa);

return pa[0];

現在、これは他のすべての座標セットで機能します。つまり、マウス座標の1つのペアは、マトリックスを通過したかのように正しい値を与えるように見えますが、その横のペアは、通過していないかのように値を与えます以下のマトリックスは、コントロールを下に移動したときに受け取ったマウス値の出力です。

{X=51,Y=75} {X=167,Y=251} {X=52,Y=77} {X=166,Y=254} {X=52,Y=78} {X=166, Y=258} {X=52,Y=79} {X=166,Y=261} {X=52,Y=80} {X=165,Y=265} {X=52,Y=81} { X=165,Y=268}

ポリゴンの描画に使用されるマトリックスが役立つ場合

Matrix trans = new Matrix();
trans.Scale(scaleWidth, scaleHeight);            
trans.Shear(italicFactor, 0.0F, MatrixOrder.Append);
trans.Translate(offsetX, offsetY, MatrixOrder.Append);

e.Graphics.Transform = trans;
currentMatrixTransform = e.Graphics.Transform;

前もって感謝します

4

1 に答える 1

2

呼び出すたびに行列を反転しています。Matrix はクラスです。つまり、 で実行することにより、 でInvert()実行mxすることになりcurrentMatrixTransformます。

を使用してマトリックスをコピーしてClone()からクローンを反転するかInvert()、ポイントを変換した後にもう一度実行することができますpa

2 番目の反転の例:

// takes the graphics matrix used to draw the polygons
Matrix mx = currentMatrixTransform;            

// inverts it
mx.Invert();

// mouse position
Point[] pa = new Point[] { new Point(e.X, e.Y) };

// uses it to transform the current mouse position
mx.TransformPoints(pa);

// inverts it back
max.Invert();

return pa[0];

クローンの例:

// takes the graphics matrix used to draw the polygons
Matrix mx = currentMatrixTransform.Clone();

// inverts it
mx.Invert();

// mouse position
Point[] pa = new Point[] { new Point(e.X, e.Y) };

// uses it to transform the current mouse position
mx.TransformPoints(pa);

return pa[0];
于 2012-05-12T19:50:15.137 に答える