Java:在圆周上均匀分布节点

时间:2010-10-23 02:31:29

标签: 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);            
    }
}

是的,集合中节点的位置是随机的,如测试输出所示:

  

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

     

〜/ Desktop / applet $ javac Graph.java

     

〜/ Desktop / applet $ appletviewer   Graph.java

     节点的

:Bird_Food x =   200.97455004134613 y = 205.08056219463253

     

表示节点:Groceries 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

     

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

所以我想知道如果只给出一组中的节点总数,我怎么能正确计算位置?有什么想法吗?

非常感谢提前的建议。

2 个答案:

答案 0 :(得分:4)

以统一的方式在圆上间距节点相当于均匀地设置节点的角度位置。给定N个节点,您可以将每个节点的角度计算为2*pi/N弧度的倍数,并使用三角函数将角度转换为圆上的位置...

答案 1 :(得分:1)

相同的想法由Mark评论发布,但在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;
    }