Матрица 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];
Другие вопросы по тегам