我正在编写一个绘制多边形的自定义控件。 我使用矩阵计算来缩放和剪切多边形,使它们适合控制。
我需要知道是否在其中一个多边形内点击了鼠标,所以我正在使用光线投射。
这一切似乎都可以单独使用,但是我现在遇到了使用相对于显示矩阵检索鼠标坐标的问题。
我使用以下代码:
// 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;
提前致谢
答案 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];