![](/img/trans.png)
[英]Optimizing a function to place circle in position which does not overlap other circles
[英]Avoiding collision when placing a circle near other circles
這可能是Placing a circle so it does not collision with any other circles的副本,我覺得這沒什么好印象的。 既是問題也是答案。
這是一個大概的圖像,解釋如下:
算法輸入:主圈和其他圈。 上圖所需的算法 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.