C# 如何找到给定点上方和下方最近的点?

C# 如何找到给定点上方和下方最近的点?,c#,coordinates,C#,Coordinates,我有一个由以下顶点定义的多边形,由它们的X和Y值表示,并按逆时针顺序排序: { 20, 10}, {110, 10}, {100, 40}, { 80, 50}, { 40, 50}, { 20, 30} 我还有一个列表,包含它们的索引。如果我想在跟踪原始顺序的同时对点重新排序,我可以将这两个列表压缩在一起 我应该如何获取给定点上方和下方的最近点,以便输入: point = {115, 30} 将输出: closestAbove = {100, 40}, index = 2 closest

我有一个由以下顶点定义的多边形,由它们的
X
Y
值表示,并按逆时针顺序排序:

{ 20, 10},
{110, 10},
{100, 40},
{ 80, 50},
{ 40, 50},
{ 20, 30}

我还有一个
列表
,包含它们的索引。如果我想在跟踪原始顺序的同时对点重新排序,我可以将这两个列表压缩在一起

我应该如何获取给定点上方和下方的最近点,以便输入:

point = {115, 30}
将输出:

closestAbove = {100, 40}, index = 2
closestBelow = {110, 10}, index = 1

性能并不重要,因此在列表中多次迭代不是问题。

首先,让我们来讨论以下术语:

  // I've put named tuples, but you can use a different type for points
  (double x, double y)[] points = new (double x, double y)[] {
    (  20, 10 ), 
    ( 110, 10 ), 
    ( 100, 40 ), 
    (  80, 50 ), 
    (  40, 50 ), 
    (  20, 30 ),
  };

  // Euclidian distance
  Func<(double x, double y), (double x, double y), double> distance = (p1, p2) =>
    Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));

  (double x, double y) point = (115, 30);
我们来看看,

  Console.Write($"Point #{above.index} ({above.x}, {above.y}) is the closest point to the ({point.x}, {point.y})");
结果:

Point #2 (100, 40) is the closest point to the (115, 30)

按Y(Y>当前值或Y<当前值)过滤可用点,然后从当前值查找到每个点的平方距离。以距离最小的那个为例。重复另一个方向。
Point #2 (100, 40) is the closest point to the (115, 30)