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所说,您应该计算鼠标坐标是否在直线上。还有一件事:几年前,我试图实现同样的目标,我记得在点击线条时,我必须使用一种可接受的偏移量,就像点击线条一样,即使它不完全在线条上,因为我们谈论的是像素,在这种情况下,很难准确地点击线条。