想象一下在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;
}
}
我觉得这可以在不检查每个标记的情况下完成,因为标记是均匀间隔的,我们知道总标记计数。但是,当谈到必要的分工等时,我正在画一个空白。
答案 0 :(得分:5)
我们假设有n
个标记x0 ... xn-1
和xi = 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];
}