Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 鼠标移动到拉线C上_C#_.net_Drawing - Fatal编程技术网

C# 鼠标移动到拉线C上

C# 鼠标移动到拉线C上,c#,.net,drawing,C#,.net,Drawing,我有一门在线课程 public class Line { public Point pt1 { get; set; } public Point pt2 { get; set; } } 创建了一个列表 List<Line> lines = new List<Line>(); 然后我来画线 private void DrawLines(object sender, PaintEventArgs e) { foreach (Line l in li

我有一门在线课程

public class Line
{
    public Point pt1 { get; set; }
    public Point pt2 { get; set; }
}
创建了一个列表

List<Line> lines = new List<Line>();
然后我来画线

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...
}
有没有办法检测线路

比如,


我需要检测并选择该行,您可以选择删除该行。

您可以使用类似的方法

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;
}

您将获得从鼠标位置到直线的最近距离。

您可以使用类似的方法

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,1,然后调用绘制线条。确保添加图形。在foreach循环之前清除内部绘制线,以便旧的绘制线在从列表中删除后不会留在那里。在使用鼠标移动线之前,您可能还需要在移动任何线之前检查鼠标是否已按下。这可以通过鼠标按下和鼠标释放事件轻松实现。我无法理解MouseMoveLines的实际命中检测和逻辑,因为我们需要的不仅仅是上下文。这个问题似乎非常本地化,它所问的问题甚至不太清楚,但我希望我在某种程度上有所帮助,祝您好运。

要删除线条,请将其从线条(例如线条)中删除。删除线条0,1然后回忆drawLines。确保添加图形。在foreach循环之前清除内部绘制线,以便旧的绘制线在从列表中删除后不会留在那里。在使用鼠标移动线之前,您可能还需要在移动任何线之前检查鼠标是否已按下。这可以通过鼠标按下和鼠标释放事件轻松实现。我无法理解MouseMoveLines的实际命中检测和逻辑,因为我们需要的不仅仅是上下文。这个问题似乎非常本地化,它所问的问题甚至不太清楚,但我希望我在某种程度上提供了帮助,祝你好运,无论你在做什么。

你想实现什么?您的问题完全不清楚。请参阅主题,抱歉。我需要检测是否有一条线,这样我可以选择它们,如果我想知道线坐标,可以选择删除它们。如果你知道线坐标,你应该使用它们来计算鼠标坐标是否在一条线上。它完全独立于绘图,至少,我希望您不想观察鼠标下的像素颜色……正如@taffer所说,您应该计算鼠标坐标是否在直线上。还有一件事:几年前,我试图实现同样的目标,我记得我在点击线条时必须使用一种可接受的偏移量,就像点击线条一样,即使它不在线条上,因为我们谈论的是像素,在这种情况下很难精确地点击一条线。你想实现什么?您的问题完全不清楚。请参阅主题,抱歉。我需要检测是否有一条线,这样我可以选择它们,如果我想知道线坐标,可以选择删除它们。如果你知道线坐标,你应该使用它们来计算鼠标坐标是否在一条线上。它完全独立于绘图,至少,我希望您不想观察鼠标下的像素颜色……正如@taffer所说,您应该计算鼠标坐标是否在直线上。还有一件事:几年前,我试图实现同样的目标,我记得在点击线条时,我必须使用一种可接受的偏移量,就像点击线条一样,即使它不完全在线条上,因为我们谈论的是像素,在这种情况下,很难准确地点击线条。