2010-10-23 41 views
1

我正在Java中進行一個簡單的遊戲,一切都很好,除了我有一種情況需要在圓周上均勻分佈節點。Java:在圓周上均勻分佈節點

例如,如果正好有4個節點,那麼一個會直接向北,一個向南,一個向東,一個向西。當然,可能有一個「偏移」,即第一個節點稍微離開北部,但是必須保持兩個相鄰節點之間的90度角和圓心。

以下是我到目前爲止得到的代碼。

private void randomizePositions(Set<Node> set) 
{ 
    Random rand = new Random(); 
    for(Node n : set) 
    { 
     n.x = XCENTER + rand.nextDouble() * MINRADIUS; 
     n.y = YCENTER + rand.nextDouble() * MINRADIUS; 
     System.out.println("for node : " + n.lbl + " x = " + n.x + " y = " +n.y);    
    } 
} 

是的,對於該集合中的節點的位置是隨機的,如圖測試輸出:

================= ===============================

〜/桌面/小程序$ javac的Graph.java

〜 /桌面/小程序$ appletviewer Graph.java

節點:Bird_Food X = 200.97455004134613 Y = 205.08056219463253

節點:食品雜貨X = 204.4727596409387 Y = 206.26252504672223

節點:Fish_Food X = 203.22828002758823 Y = 202.30400672172576

節點:Pet_Food X = 208.8749664329499 Y = 203.43454377979435

節點:Dog_Food X = 207.72724954244495 Y = 202.9273879239392

節點:Cat_Food X = 209.55574149936908 Y = 209.61827066724257

=============================== =================

所以我想知道如何才能正確計算位置,只給定一個集合中的節點總數?任何想法?

非常感謝提前的建議。

回答

4

以統一的方式在圓上間隔節點等同於均勻設置節點的角位置。鑑於N節點,您可以計算每個節點的角度作爲一些2*pi/N弧度的倍數,並簡單地將角度轉換爲使用三角學的圓上的位置...

+0

emmm ......這絕對是一個工科數學方法:)這個思想,但我只是不知道是否會有一個更好的辦法... .. – 2010-10-23 02:52:05

+0

或每節點之間360/n度。 – 2010-10-23 02:58:38

1

相同的想法張貼由馬克評論,但在Java大量的改進餘地此代碼):

public static List<Node> question4002160(int n, double r){ 
     List<Node> resp = new ArrayList<Node>(); 
     double radius = rand.nextDouble() * r; 
     double angleInRadians = rand.nextDouble()*(2*Math.PI/n); 
     double nangleInRadians = angleInRadians; 
     Node node = new Node(); 
     node.x = XCENTER + Math.cos(angleInRadians) * radius; 
     node.y = YCENTER + Math.sin(angleInRadians) * radius; 
     resp.add(node); 
     for(int i=0; i<n-1; i++){ 
       nangleInRadians += angleInRadians; 
       radius = rand.nextDouble() * r; 
       node = new Node(); 
       node.x = XCENTER + Math.cos(nangleInRadians) * radius; 
       node.y = YCENTER + Math.sin(nangleInRadians) * radius; 
       resp.add(node); 
     } 

     return resp; 
    }