我正在开发一个简单的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
=============================================== =
所以我想知道如果只给出一组中的节点总数,我怎么能正确计算位置?有什么想法吗?
非常感谢提前的建议。
答案 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;
}