有4000個點位的坐標,要求先檢查任意2點間的距離不能小于一個設定值如D1。如果存在有2個點的距離小于D1的狀況,要求根據給出的設定值R1,將其中任意一個點在以R1為半徑的圓上任意移動,直到找到符合距離不小于D1為止。最終通過移動后,4000點的坐標全部符合任意2點間的距離大于設定值D1。
uj5u.com熱心網友回復:
R1 一定大于等于 D1/2 嗎?uj5u.com熱心網友回復:
未必全都有解。考慮兩個極端的情況。
情況1: R1 = D1/2 且有 5 個點重疊在一起。
你保持點 0 不動,其余 4 個點分別向上、下、左、右移動 2R1(圓心分別是它們與點 0 的中途點)。剛好解決。
情況2:R1 = D1/2 且有 6 個點重疊在一起。
顯然,多出一個在二維條件下無法移出的點。
uj5u.com熱心網友回復:
還有一種計算不可解決的情況。每移動一個點,都可能進入其他點的“勢力范圍”(以該點為圓心,D1 為半徑的圓)。這就牽涉到移動其他點。某些情況下,最終的迭代計算量會超出能夠實作的范圍。
uj5u.com熱心網友回復:
沒解沒關係,只要有提示就行。難就難在[color=#FF0000]每移動一個點,都可能進入其他點的“勢力范圍”(以該點為圓心,D1 為半徑的圓)[/color]。沒解沒關係,目前只要求一個實現的演算法!
uj5u.com熱心網友回復:
昨天臨下班所發 2 樓的貼子有缺陷。實際上,在一個半徑為 D1 的外接圓中,可容納包括圓心的 7 個點。其他 6 點為外接圓上的正六邊形的 6 個頂點。這實際上就是所謂“蜂窩”結構。
給你一個思路,就是將所有點占據空間最大化。
首先找出所有點占據空間的中心點,注意,這里可能恰好有“點”,也可能沒有。
然后,找到最外圈的點,將其向遠離中心點的方向“輻射”2*R1 的距離。這一步,是為了擴大地盤。
之后,檢查剛移動過的各個點之間的距離。由于是最外層,相互侵擾的概率較小。如果有,就要重新調整了。然后,就是由外向內逐層調整。
調整的演算法,我還沒有想好。但有幾點規則是必須的:
1 一定是首先要找到多個點聚合時靠“外”的點,優先移動它們。
2 移動時,可以找到最鄰近的已經移動過要固定的兩個點,如果很近,要考慮接近與上兩點成等邊三角形的位置。因為蜂窩結構可以容納更多的點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/123898.html
上一篇:關于vb調入excell
下一篇:vb6呼叫DLL
