[英]Given many circles and a point, how to find which circle contains that point
我最近遇到了一個類似這樣的問題
有 N 個不相交(使得它們不接觸或相交)的圓,由它們的中心和半徑給出,即
center = (x_i, y_i), radius = r_i
。 然后我們有 Q 個查詢,其中給出了一個點(x, y)
。 對於每個查詢,我們需要找出包含給定點的圓的索引i
(如果沒有圓,則為 -1)。
約束大致為1 <= N <= 10^5
和1 <= Q <= 10^5
。 因此可能需要O(Q * log(N))
。
除了直接的O(Q * N)
解決方案之外,我能想到的唯一更好的方法是將圓圈的最左邊和最右邊的點作為數組中的間隔,然后進行二進制搜索以找出包含 x 的間隔- 點的坐標,但多個間隔可能重疊並且多個圓可能包含該點。 所以我不確定這是否行得通。
任何幫助將不勝感激。 謝謝你。
這可以作為 N+1 維的最近鄰查詢來解決。
想象一組在 3d 中具有固定半徑的球,這樣它們與平面 z=0 的交點就是您的一組圓。 (球可能相交,沒關系)。 現在,落入圓中的點與相應球的中心的距離必然比所有其他球的中心更近。
最近鄰問題得到了很好的研究。 空間分區技術可以很好地處理現實生活中的數據,但最壞情況下的性能並不是那么好。
編輯:由於查詢點在固定平面z=0 中,因此可以將問題視為具有非歐幾里得距離函數的 2d 最近鄰問題。 查詢點到圓心的有效距離為
D = &sqrt;(d 2+R2 - r2)
其中d是實際距離, R是球半徑(適用於所有球), r是圓半徑。
解決此問題的另一種方法是構建一組圓的功率圖。 功率圖是平面細分。 有一些方法可以有效地回答“給定點屬於平面細分的哪個單元格”形式的查詢,例如,使用Kirkpatrik 的點位置數據結構。
這兩種方法是相似的,如果不是等價的,因為在冪圖中,點相對於圓的冪是距離公式中 D 的平方(R=0)。
我知道這是一個很老的問題但是為了記錄....你可以用 matplotlib Circle 解決它
from matplotlib.patches import Circle as Cr
.................
self.my_mpl_circle = Cr(origin, radius)
......
def match_pos(self, coords):
return self.my_mpl_circle.contains_point(coords)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.