2015-09-08 4 views
1

У меня есть строка классMouseMove над DrawLine C#

public class Line 
{ 
    public Point pt1 { get; set; } 
    public Point pt2 { get; set; } 
} 

создал список

List<Line> lines = new List<Line>(); 

PaintEventHandler, MouseEventHandler & добавить пункты в список в форме()

this.Paint += new PaintEventHandler(DrawLines); 
this.MouseMove += new MouseEventHandler(MouseMoveLines); 

lines.Add(new Line() 
{ 
    pt1 = new Point(3, 3), 
    pt2 = new Point(120, 120) 
}); 

Тогда Я собираюсь рисовать линии.

private void DrawLines(object sender, PaintEventArgs e) 
{ 
    foreach (Line l in lines) 
    { 
     e.Graphics.DrawLine(Pens.Black, l.pt1, l.pt2); 
    } 
} 

private void MouseMoveLines(object sender, MouseEventArgs e) 
{ 
    // I need some magic... 
} 

Есть ли способ обнаружить линию?

Например,

Мне нужно определить и выбрать линию, а также необязательно удалить строку.

+0

Что вы пытаетесь достичь? Ваш вопрос совершенно неясен. – Jens

+0

см. Тему, извините. Мне нужно определить, есть ли строка, поэтому я могу выбрать их и опционально удалить их, если я хочу – yooouuri

+1

Если вам известны координаты линий, вы должны использовать их для расчета того, находятся ли координаты мыши на линии. Он полностью независим от рисования (по крайней мере, я надеюсь, что вы не захотели наблюдать пиксельные цвета под мышью ...) – taffer

ответ

1

Вы можете использовать что-то вроде этого

public static double GetDistanceBetweenLineAndPoint(this MathDefinitions.Vector2 point, MathDefinitions.Vector2 linePoint1, MathDefinitions.Vector2 linePoint2) 
{ 
    var direction = (linePoint2 - linePoint1); 
    var normalizedCopy = direction.NormalizedCopy; 
    double len = direction.Length; 
    if (len < float.Epsilon) return (point - linePoint1).Length; 
    var delta1 = point - linePoint1; 
    var delta2 = point - linePoint2; 
    double t = delta1.NormalizedCopy.Dot(normalizedCopy); 
    if (t <= 0.0) return delta1.Length; 
    double t2 = delta2.NormalizedCopy.Dot(normalizedCopy); 
    if (t2 >= 0.0) return delta2.Length; 
    MathDefinitions.Vector2 proj = linePoint1 + (t * delta1.Length) * normalizedCopy; 
    return (point - proj).Length; 
} 

Вы получите ближайшее расстояние от позиции курсора мыши к линии.

0

Чтобы удалить строку, удалите ее с lines (например, lines.RemoveRange(0,1)), а затем наберите drawLines(). Обязательно добавьте Graphics.Clear() внутри drawLines() перед циклом foreach, чтобы старые строки не оставались там после того, как они были удалены из списка. Прежде чем использовать MouseMoveLines(), вы, вероятно, также захотите проверить, не указана ли мышь перед перемещением каких-либо строк. Это может быть легко достигнуто с помощью события мыши и мыши. Я не могу с фактическим детектированием попадания и логикой MouseMoveLines(), потому что нам нужно больше контекста, чем это. Этот вопрос кажется очень локализованным, и то, что он задает, даже не совсем понятно, но я надеюсь, что я каким-то образом помог, и удачи во всем, что вы делаете.

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