C#Matrix提供奇怪的鼠标坐标

时间:2012-05-12 18:26:12

标签: c# matrix coordinates coordinate-transformation

我正在编写一个绘制多边形的自定义控件。 我使用矩阵计算来缩放和剪切多边形,使它们适合控制。

我需要知道是否在其中一个多边形内点击了鼠标,所以我正在使用光线投射。

这一切似乎都可以单独使用,但是我现在遇到了使用相对于显示矩阵检索鼠标坐标的问题。

我使用以下代码:

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

提前致谢

1 个答案:

答案 0 :(得分: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];