2016-05-19 6 views
2

Im, создающий программу графика, и я застрял там, где мне нужно, чтобы координаты мыши были равны графическому масштабу. С PictureBox я использую преобразование масштабировать свой графический:Преобразование координат мыши

RectangleF world = new RectangleF(wxmin, wymin, wwid, whgt); 
     PointF[] device_points = 
      { 
       new PointF(0, PictureBox1.ClientSize.Height), 
       new PointF(PictureBox1.ClientSize.Width, PictureBox1.ClientSize.Height), 
       new PointF(0, 0), 
      }; 
     Matrix transform = new Matrix(world, device_points); 
     gr.Transform = transform; 

enter image description here Im используя функцию MouseMove. Есть ли способ преобразовать координаты мыши? Когда я поставил мышь на х = 9 Мне нужно моя мышь координату 9.

private void PictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     Console.WriteLine(e.X); 
    } 
+2

Не теряйте следы * преобразования *. Вам понравится его метод Invert(), удобный для отображения координат мыши обратно в координаты графика. –

ответ

2

комментарий Как Ганса подразумевает, вы можете использовать второй Matrix для достижения этой цели. Вы можете получить его либо путем копирования оригинала Matrix и вызова метода Invert() копии, либо вы можете создать новый Matrix с нуля, обратив ваши входные прямоугольники от оригинала.

IMHO инвертирование проще, но это означает, что вам нужно создать обратную матрицу и сохранить ее где-нибудь. Например .:

Matrix transform = new Matrix(world, device_points); 
    gr.Transform = transform; 
    inverseTransform = transform.Clone(); 
    inverseTransform.Invert(); 

где inverseTransform это поле в своем классе, а не локальной переменной, так что мышь-код обработки может использовать его позже.

Если нужно построить Matrix позже, вы могли бы сделать это следующим образом:

RectangleF device = new RectangleF(new Point(), PictureBox1.ClientSize); 
PointF[] world_points = 
    { 
     new PointF(wxmin, wymin + whgt), 
     new PointF(wxmin + wwid, wymin + whgt), 
     new PointF(wxmin, wymin), 
    }; 
Matrix inverseTransform = new Matrix(device, world_points); 

В любом случае, вы бы просто использовать метод Matrix.TransformPoints() в вашей мыши код обработки применить обратное преобразование к координаты мыши, чтобы вернуться к вашим мировым координатам.

+0

Я сделал это, но он возвращает те же значения X и Y. 'inverseTransform = transform.Clone(); inverseTransform.Invert(); Список location = новый Список (); Точка p = новая точка (e.X, e.Y); location.Add (p); inverseTransform.TransformPoints (location.ToArray()); Console.WriteLine ("location =" + location [0]); ' – WhizBoy

+2

На основе вашего комментария здесь: значения точек преобразуются на месте. Вы создали новый массив для перехода к методу 'TransformPoints()', но вы передаете его непосредственно методу вместо сохранения ссылки на него. Таким образом, метод преобразует точки, но у вас нет способа получить новые значения. Попробуйте 'Point [] location = {new Point (e.X, e.Y)}; inverseTransform.TransformPoints (местоположение); '. –

 Смежные вопросы

  • Нет связанных вопросов^_^