想象一下 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;
}
}
我觉得这可以在不检查每个标记的情况下完成,因为标记的间距是均匀的,而且我们知道标记的总数。但是,当涉及到必要的除法等时,我一片空白。
最佳答案
假设有 n
标记 x<sub>0</sub> ... x<sub>n-1</sub>
那x<sub>i</sub> = x<sub>0</sub> + 10 * i
.然后,离一个点最近的x
由 i = min(n-1, max(0, round((x - x<sub>0</sub>) / 10)))
给出.
这比其他答案更笼统,因为它处理了第一个标记不在 x<sub>0</sub> = 0
的情况。 ,以及 x
的情况在场外。
关于algorithm - 二维网格上的基础数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12918781/