2
哪種空間搜索算法將有助於查詢最近的相鄰矩形..對於給定的矩形..在所有4個方向上(即頂部,左側,底部,對)。算法..查找最接近的相鄰矩形..在所有4個方向上
1:距離矩形的一邊正交於另一邊的另一邊。
2:矩形實際上代表窗體上的GUI組件。
哪種空間搜索算法將有助於查詢最近的相鄰矩形..對於給定的矩形..在所有4個方向上(即頂部,左側,底部,對)。算法..查找最接近的相鄰矩形..在所有4個方向上
1:距離矩形的一邊正交於另一邊的另一邊。
2:矩形實際上代表窗體上的GUI組件。
做這OOP風格在Java中,假設軸從左下角開始,增加:
class Displacement
{
float top, bottom, left, right;
Rectangle r;
Displacement(Rectangle r)
{
this.r = r;
top = Math.max(r.y1, r.y2);
bottom = Math.min(r.y1, r.y2);
left = Math.min(r.x1, r.x2);
right = Math.max(r.x1, r.x2);
}
float minDistance(Displacement d)
{
float min = 10000.0f;
if (Math.abs(top - d.bottom) < min)
min = Math.abs(top - d.bottom);
if (Math.abs(bottom - d.top) < min)
min = Math.abs(bottom - d.top;
if (Math.abs(left - d.right) < min)
min = Math.abs(left - d.right);
if (Math.abs(right - d.left) < min)
min = Math.abs(right - d.left);
return min;
}
}
所以,現在你有一個矩形實例化一個對象計算矩形的最小和最大序列跨度,這Displacement
目標是能夠找到minDistance(...)
與另一Displacement
感謝最小距離現在你可以很容易地做這樣的事情:
class DistanceFinder
{
ArrayList<Displacement> displs = new ArrayList<Displacement>();
void addRect(Rectangle r)
{
displs.add(new Displacement(r));
}
Rectangle findNearest(Rectangle r)
{
Displacement current = new Displacement(r);
Displacement nearest = null;
float min = 10000.0f
for (Displacement d : displs)
{
float curDist = current.minDistance(d);
if (curDist < min)
{
nearest = d;
min = curDist;
}
}
return current;
}
}
我寫在Java中只給一個簡單的例子,但該方法可以在每一種語言相同..
你可以很容易地通過拆分您計算在不同cartinal距離的方式對待不同的方式各個方向方向,所以你可以做同樣的工作,我做了以前的代碼片段,但分裂爲每個軸。
那還不清楚,什麼樣的距離?你是指從原始矩形的一邊到另一邊的正交距離? – Jack 2010-03-09 16:10:25
你將不得不變得更具體。所有的矩形都與四個鄰居相鄰(在一個無限的平面上,或者有一些邊緣情況?)?矩形之間有空隙嗎?如果是後者,「最近的鄰居......在一個方向上」對你意味着什麼? – Sparr 2010-03-09 16:17:02
這個問題現在更有意義 - 請不要關閉它。 – Jacob 2010-03-09 16:30:57