2016-04-15 7 views
0

Я хочу нарисовать линию в bmp, которая находится в PictureBox с Graphic.DrawLine(), которую я могу перемещать мышью. Я не могу найти какую-либо функцию, чтобы проверить, находится ли мышь в строке или нет. Я нашел много методов, чтобы проверить, находится ли мышь над Graphic.FillPolygon(), но нет ни одного около DrawLine(). Есть ли хорошее решение для проверки?Мышь захвата, когда она находится над строкой (Graphic.DrawLine())

Edit: Так по предложению я сделал такую ​​функцию:

private bool IsPointInPolygon4(Point[] poly, Point p) 
{ 
    System.Drawing.Drawing2D.GraphicsPath test = new System.Drawing.Drawing2D.GraphicsPath(); 
    if (poly.Length == 2) // it means there are 2 points, so it's line not the polygon 
    { 
     test.AddLine(poly[0], poly[1]); 
     if (test.IsVisible(p, g)) 
     { 
      MessageBox.Show("You clicked on the line, congratulations", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      test.Dispose(); 
      return true; 
     } 
    } 
    else 
    { 
     test.AddPolygon(poly); 
     if (test.IsVisible(p, g)) 
     { 
      MessageBox.Show("You clicked on the polygon, congratulations", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      return true; 
     } 
    } 
    return false; 
} 

Он отлично работает для полигонов. Но я все еще не могу получить событие мыши на линии. Какие-либо предложения?

+0

Всегда ли это горизонтальная или вертикальная линия, никаких других углов? –

+0

no, unfortunatelly Это может быть любой угол, более того, я хочу добавить функцию, чтобы изменить угол, когда кто-то поймал вершину. – Blabla

ответ

0

Поскольку ваша линия может быть под углами, отличными от 0 и 90 градусов, я вижу 2 варианта.

Первый заключается в использовании Line Drawing Algorithm для вычисления точек линии и проверки положения мыши против этих сгенерированных коордов. Это совпадение может быть немного «нечетким», если выбранный вами алгоритм линии отличается от того, который использует .NET для рисования линии.

Вторая заключается в использовании GraphicsPath содержащих ваш line и вызвать метод .IsVisible(point) на нем, который будет возвращать true если путь содержит точку.

Я бы порекомендовал вариант 2, поскольку его, вероятно, проще реализовать, и позволит вам использовать «виртуальный путь», который толще, чем фактическая строка, что делает его немного более легким для ваших пользователей взаимодействовать с ним ,

+0

Итак, я сделал функцию так, как вы предложили. У меня есть несколько фигур, и у меня есть большинство функций, но возникла проблема для обнаружения линии. Это отлично работает для многоугольника, но все же я не могу обнаружить мышь на линии – Blabla

+0

. Хорошо, я нашел ответ в виде «дублирующего» потока. Спасибо вам :) – Blabla

2

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

Вы должны взять геометрические координаты двух точек и координаты мыши. Затем вычислите расстояние от точки мыши от линии (довольно легко есть много документации в Интернете для этого).

Если абсолютное расстояние меньше, чем пороговое значение (1 1,5 2??), То вы достаточно близко, чтобы сказать «на линии»:

if (distance(px, py, qx, qy, mx, my) < 1.5) 
{ 
    // on the line 
} 

Я оставляю реализацию distance() вам ,