配列内のポイントのすべてのペア間の距離を計算する必要があり、ペアごとに1回だけ実行したい. 私が思いついたものは十分に効率的ですか、それとももっと良い方法がありますか? これは、私が取得しようとしているものを説明するためのビジュアルとともに、例です。
たとえば、最初にセグメント AB、AC、AD を取得します。次にBC、BD。そして最後にCD。言い換えれば、新しい配列に AB が必要ですが、BA は重複するため、BA は必要ありません。
var pointsArray = new Point[4];
pointsArray[0] = new Point(0, 0);
pointsArray[1] = new Point(10, 0);
pointsArray[2] = new Point(10, 10);
pointsArray[3] = new Point(0, 10);
// using (n * (n-1)) / 2 to determine array size
int distArraySize = (pointsArray.Length*(pointsArray.Length - 1))/2;
var distanceArray = new double[distArraySize];
int distanceArrayIndex = 0;
// Loop through points and get distances, never using same point pair twice
for (int currentPointIndex = 0; currentPointIndex < pointsArray.Length - 1; currentPointIndex++)
{
for (int otherPointIndex = currentPointIndex + 1;
otherPointIndex < pointsArray.Length;
otherPointIndex++)
{
double xDistance = pointsArray[otherPointIndex].X - pointsArray[currentPointIndex].X;
double yDistance = pointsArray[otherPointIndex].Y - pointsArray[currentPointIndex].Y;
double distance = Math.Sqrt(Math.Pow(xDistance, 2) + Math.Pow(yDistance, 2));
// Add distance to distanceArray
distanceArray[distanceArrayIndex] = distance;
distanceArrayIndex++;
}
}
これは何千ものポイントで使用されるため、正確に次元化された配列は、あらゆる種類の IEnumerable を使用するよりも効率的であると考えています。