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];

现在这适用于所有其他坐标集,我的意思是,一对鼠标坐标似乎给出了正确的值,就好像它已经通过了矩阵一样,但是它旁边的那个给出了一个值,就好像它没有通过下面的矩阵是向下移动控件时收到的鼠标值的输出。

{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

第二个反转示例:

// 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 回答