Матрица C# дает странные координаты мыши
Я пишу пользовательский элемент управления, который рисует полигоны. Я использую матричные вычисления для масштабирования и сдвига полигонов, чтобы они соответствовали элементу управления.
Мне нужно знать, была ли нажата мышь внутри одного из полигонов, поэтому я использую приведение лучей.
Кажется, что все это работает нормально по отдельности, однако сейчас я сталкиваюсь с проблемой получения координат мыши относительно используемой им матрицы отображения.
Я использую следующий код:
// 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} { Х =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 ответ
Вы инвертируете свою матрицу каждый раз, когда вызываете ее. Матрица - это класс, то есть, выполняя 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];