代码之家  ›  专栏  ›  技术社区  ›  Michael Mao

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

  •  1
  • Michael Mao  · 技术社区  · 14 年前

    我正在用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

    图形.java

    节点:Bird_Food x= 200.97455004134613 y=205.0805621943253

    204.4727596409387 y=206.26252504672223

    对于节点:鱼食x= 203.22828002758823 y=202.30400672172576

    208.8749664329499 y=203.43454377979435

    207.72724954244495 y=202.9273879239392

    节点:猫食x= 209.55574149936908 y=209.61827066724257

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

    所以我想知道,如果只给定一个集合中的节点总数,如何才能正确计算位置?知道吗?

    非常感谢提前提出的建议。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Mark Elliot    14 年前

    以均匀的方式在圆上设置节点间距相当于均匀地设置节点的角度位置。鉴于 N 节点,可以将每个节点的角度计算为 2*pi/N 弧度,用三角法把角度转换成圆上的一个位置。。。

        2
  •  1
  •   xboard    14 年前

    Mark comment也发表了同样的想法,但在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;
        }