0

2D画面に表示されるアメリカンフットボール競技場を想像してみてください。フィールドには10ヤードごとにマーカーがあります。各マーカーは、フィールドの高さにまたがる単なる垂直線です。誰かがあなたにフィールド上の(x、y)の場所を与えたとしましょう。ループを使用せずに、(x、y)位置に最も近い垂直マーカーをどのように決定できますか?

現在、私は次のような単純なループを使用しています。

// want marker closest to x
float x = randomFloat();

double minDistance = Double.MaxValue;
Marker closestMarker = null;

foreach (Marker m in markers) {
    double d = ABS(x - m.x);
    if (d < minDistance) {
        minDistance = d;
        closestMarker = m;
    }
}

マーカーの間隔が均一で、マーカーの総数がわかっているので、すべてのマーカーをチェックしなくてもこれを実行できると思います。ただし、必要な分割等については空白を描いています。

4

4 に答える 4

5

nマーカーがあり、それがあると仮定しましょう。次に、点に最も近いものはで与えられます。x0 ... xn-1xi = x0 + 10 * ixi = min(n-1, max(0, round((x - x0) / 10)))

これは、最初のマーカーがにない場合とフィールドの外にある場合の両方を処理するため、他の回答よりも少し一般的です。x0 = 0x

于 2012-10-16T16:46:29.030 に答える
1
// Assuming that markers is ordered by X coordinate and the first one has X = 0
Marker ClosestMarker(float x, List<Marker> markers) {
    int m = (int)Math.Floor(x / 10);

    if(x - m * 10 < 5) return markers[m];
    else return markers[m + 1];
}
于 2012-10-16T16:26:04.253 に答える
1

Javaで:

int distanceOfClosestMarker = (int) (Math.floor(givenX / tenYards) * tenYards);
// markersByDistance is map of markers by theirs distance. you can use array instead.
Marker closestMarker = markersByDistance.get(distanceOfClosestMarker);
// array version is this
closestMarker = arrayOfMarkers[distanceOfClosestMarker / tenYards];
于 2012-10-16T16:03:50.680 に答える
1

最も近い 10 に四捨五入する必要がある場合は、除算と 10 の乗算を使用して、最も近いマーカーを取得します。

(ちなみに、C# を使用している場合は、次のようなことができます。

var nearestMarker = markers.Min(m => x-m.x);

)

于 2012-10-16T16:06:33.757 に答える