2D网格上的基本数学

Sun*_*day 0 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我觉得这可以在不检查每个标记的情况下完成,因为标记是均匀间隔的,我们知道总标记计数.但是,当涉及必要的划分等时,我正在画一个空白.

ham*_*mar 5

让我们假设有n标记和那些.然后,最接近一个点的一个给出.x0 ... xn-1xi = x0 + 10 * ixi = min(n-1, max(0, round((x - x0) / 10)))

这比其他答案稍微一般,因为它既处理第一个标记不在的情况,也处理在字段外的情况.x0 = 0x