0

想象一个显示在 2D 屏幕上的美式足球场。场地每十码有一个标记。每个标记只是跨越场地高度的一条垂直线。假设有人在场上给了你一个 (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

在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 以获得最接近的标记。

(顺便说一句,如果你使用 C#,你可以做类似的事情

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

)

于 2012-10-16T16:06:33.757 回答
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 回答