あなたはint型の値にあなたのグリッドに合うことができる場合は素朴なソリューションです。それは、線が二乗螺線のように「成長」していない場合をカバーするはずです。 doubleに切り替えるときに、丸めの問題が発生する可能性があることに注意してください。
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);
}
「最近傍点」クエリを探しています。 –
「直線(斜体ではない)」とは、「直交」(つまり、水平または垂直のみ)を意味しますか?とにかく、ループを使うのが最善の方法でしょう。 –
はい、直交のみです。私は 'foreach'ループを使って 'for'ループのために2回使うべきです(縦と横に対して)? – Slawkoo