如何在 Line/Polyline c# 上查找邻居点
How to find neighbor Points on Line/Polyline c#
我在寻找直线上的相邻点时遇到问题。
我有一条折线和一个点。点永远留在线上。线条总是笔直的(不是倾斜的)。
我想找到之前和之后的点。 (在图像上,这些是 C 和 D)。做这个的最好方式是什么?找到上一个点可能会更好(然后,找到下一个点将变得微不足道)。
我的想法是使用循环和 if
语句,但也许有更好的解决方案?
如果您可以将网格放入 int 值,那么这是一个天真的解决方案。它应该涵盖直线不像 "growing" 那样的方形螺旋线的情况。
切换到双精度时,请注意可能存在的舍入问题。
var line = new List<Point>
{
new Point("A", 0, 0),
new Point("B", 1, 0),
new Point("C", 1, 1),
new Point("D", 3, 1),
new Point("E", 3, 2),
new Point("F", 4, 2)
};
var p = new Point("P",2,1);
Point first = null;
foreach (var point in line)
{
if (first != null)
{
if (p.X == first.X && p.X == point.X
&& (p.Y >= first.Y && p.Y <= point.Y
|| p.Y <= first.Y && p.Y >= point.Y))
{
PrintResult(first, p, point);
break;
}
if (p.Y == first.Y && p.Y == point.Y
&& (p.X >= first.X && p.X <= point.X
|| p.X <= first.X && p.X >= point.X))
{
PrintResult(first, p, point);
break;
}
}
first = point;
}
Console.ReadKey();
}
private static void PrintResult(Point first, Point p, Point second)
{
Console.WriteLine(first.Name);
Console.WriteLine(p.Name);
Console.WriteLine(second.Name);
}
我在寻找直线上的相邻点时遇到问题。
我有一条折线和一个点。点永远留在线上。线条总是笔直的(不是倾斜的)。
我想找到之前和之后的点。 (在图像上,这些是 C 和 D)。做这个的最好方式是什么?找到上一个点可能会更好(然后,找到下一个点将变得微不足道)。
我的想法是使用循环和 if
语句,但也许有更好的解决方案?
如果您可以将网格放入 int 值,那么这是一个天真的解决方案。它应该涵盖直线不像 "growing" 那样的方形螺旋线的情况。 切换到双精度时,请注意可能存在的舍入问题。
var line = new List<Point>
{
new Point("A", 0, 0),
new Point("B", 1, 0),
new Point("C", 1, 1),
new Point("D", 3, 1),
new Point("E", 3, 2),
new Point("F", 4, 2)
};
var p = new Point("P",2,1);
Point first = null;
foreach (var point in line)
{
if (first != null)
{
if (p.X == first.X && p.X == point.X
&& (p.Y >= first.Y && p.Y <= point.Y
|| p.Y <= first.Y && p.Y >= point.Y))
{
PrintResult(first, p, point);
break;
}
if (p.Y == first.Y && p.Y == point.Y
&& (p.X >= first.X && p.X <= point.X
|| p.X <= first.X && p.X >= point.X))
{
PrintResult(first, p, point);
break;
}
}
first = point;
}
Console.ReadKey();
}
private static void PrintResult(Point first, Point p, Point second)
{
Console.WriteLine(first.Name);
Console.WriteLine(p.Name);
Console.WriteLine(second.Name);
}