簡體   English   中英

將一個圓圈放在其他圓圈附近時避免碰撞

[英]Avoiding collision when placing a circle near other circles

  • 我有一個主要圈子和其他附近的圈子。
  • 所有圓圈的大小始終相同。
  • 任何兩個圓圈都不能重疊。
  • 我想找出潛在圈子可以放置在圈子附近的位置(下面有更多詳細信息)。
  • 理想情況下,我想快速完成此操作(我知道,每個人都這么說 - 但相信我,我真的這樣做了。)。
  • 我希望答案是對要使用的算法的一般高級描述。

這可能是Placing a circle so it does not collision with any other circles的副本,我覺得這沒什么好印象的。 既是問題也是答案。

這是一個大概的圖像,解釋如下:

很多圈子

  • 紅圈圈。
  • 黑色圓圈是附近放置的其他圓圈。
  • 每個Potential圓的中心應該在黃色帶上 這是一個相對較窄的范圍,比圓的半徑略窄,我對任何圓心在這個范圍之外的圓都不感興趣。
  • 灰色是我希望算法找到的潛在圈子:
    1. 右上角的那個,盡可能靠近圓圈。 如果它周圍的三個其他圓圈中的任何一個向它的中心靠近一點,這里就沒有潛在的圓圈。
    2. 右下方,在允許的范圍內盡可能遠離圓。 如果旁邊的兩個Other圓圈靠得再近一點,這里就沒有勢能圓圈了。
    3. 左邊畫了四個電位圈。 這些可能有很多,如果算法只返回其中的任何一個就好了。
  • 青色圓圈是一個邊界框,如果圓心在外面,則不會影響將圓圈放在黃色帶上。

算法輸入:圈和其他圈。 上圖所需的算法 output:三個或四個潛在的圓圈。 一個在右上方,一個在右下方,還有一個或兩個在左側(我不太介意它是哪個)。


我嘗試了什么? 谷歌搜索。 查看堆棧溢出。 思維。

我在想算法應該做的第一件事可能是將其他圓從(X, Y)坐標轉換為(angle, distance) from Main並按角度排序。 然后將黃色帶分成一些段,對於每個段,得到所有可能影響它的圓圈。

在這里我有點迷路了。

下一步,做一些數學來嘗試 position 這個圓。 對於兩個圓圈,我可以放置一個圓圈,使其恰好接觸到它們。 也許當有 N 個圓圈時,我只需為每一對做這個,看看我是否還剩下什么? 或者只是每個 N 的中心? 我可以將其保存為草稿,以便在我再考慮時它不會全部消失嗎?

[編輯]:我想更好的方法是從主圈周圍的 12 個潛在圈開始,看看哪些是非法的,哪些其他圈擋住了路,然后嘗試輕推潛在圈,使它們脫離其他石頭方式。 我們應該確切地知道我們需要將 Potential Stone 移動多遠以及向哪個方向移動,這取決於它與哪個 Other Stone 重疊。 重復,希望避免無限循環,但我認為我能做到。

這是一個很好的問題。 讓我們關注一個詞:潛力。

想想力導向圖布局,就像這樣:

https://observablehq.com/@d3/temporal-force-directed-graph

最終,布局收斂於最小能量解決方案,其中 spring 長度最小。

讓我們把它帶到你的問題。 我們將定義一個勢場。 主圓和其他圓提供排斥力。 黃色環提供吸引力。

在平面上選擇一個隨機點。 判斷是否可行,不可行則拒絕,例如與main或其他circle重疊。 現在我們在一個可行但非最佳的位置留下了一個圓圈。 我們將在幾個時間步長內將這個圓圈移動到新的候選位置。 將作用在其上的吸引力和排斥力相加,然后將其向指定方向移動少量。 在某些時候,它很可能會嘗試將 go 變為不可行的 position,可能與主圈重疊。 到那時我們就完成了,我們 output 其 position 作為一個好的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM