2012-10-16 21 views
0

想象一下,在2D屏幕上顯示一個美式橄欖球場。該場地每十碼有一個標記。每個標記只是一個跨越場地高度的垂直線。說有人給你一個(x,y)場地。 如何在不使用循環的情況下確定最接近(x,y)位置的垂直標記?2D網格上的基本數學運算

目前我使用一個簡單的循環是這樣的:

// 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; 
    } 
} 

我喜歡這種感覺,而不檢查每個標記,因爲標記是均勻分佈的,我們知道總的標記計數來完成。不過我畫一個空白,當涉及到必要的分工等

+1

您可以從x,y位置開始繪製一個不斷擴大的圓,並在第一個交點處停留一個標記。無論哪種方式,你都需要一個循環,但它比檢查每一個標記要短。也許你可以使用這樣一個事實,即標記是均勻間隔的......我會想一想 – GarethL

回答

5

讓我們假設有n標記x0 ... xn-1xi = x0 + 10 * i。然後,最接近x的點由i = min(n-1, max(0, round((x - x0)/10)))給出。

這比其他答案稍微普遍一些,因爲它既處理第一個標記不在x0 = 0的情況,以及x在場外的情況。

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]; 
1

,如果你只是把它四捨五入到最接近的十位,然後用分&乘以10得到最接近的標記。

(順便說一下,如果你正在使用C#,你可以做同樣的事情到

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

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]; 
}