2D网格上的基本数学

时间:2012-10-16 15:58:52

标签: algorithm math

想象一下在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 个答案:

答案 0 :(得分:5)

我们假设有n个标记x0 ... xn-1xi = x0 + 10 * i。然后,x给出距离点i = min(n-1, max(0, round((x - x0) / 10)))最近的一个。

这比其他答案略胜一筹,因为它既处理第一个标记不在x0 = 0的情况,也处理x在字段外的情况。

答案 1 :(得分: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];

答案 2 :(得分:1)

如果你只需要将它四舍五入到最接近的十,那么使用divide&amp;乘以10得到最接近的标记。

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

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

答案 3 :(得分: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];
}