想象一下在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)
我觉得这可以在不检查每个标记的情况下完成,因为标记是均匀间隔的,我们知道总标记计数.但是,当涉及必要的划分等时,我正在画一个空白.
让我们假设有n标记和那些.然后,最接近一个点的一个给出.x0 ... xn-1xi = x0 + 10 * ixi = min(n-1, max(0, round((x - x0) / 10)))
这比其他答案稍微一般,因为它既处理第一个标记不在的情况,也处理在字段外的情况.x0 = 0x