0

这个需要一些可视化,如果我的解释很糟糕,很抱歉。

所以,我在 0,0 有一个中心点。从这一点开始,我在其圆周上绘制随机点,半径为 350 像素(随机数)。为此,我正在使用以下代码:

var angle = Math.random()*Math.PI*2;
var x = Math.cos(angle)*radius;
var y = Math.sin(angle)*radius;

x+=parent.position.x;
y+=parent.position.y;

parent.position 这是因为绘制的每个点也充当中心节点,该中心节点具有充当节点的子节点,依此类推。这只是设置新节点相对于其父节点的位置。

因此,此代码对于中心节点非常有效。问题是一旦你从中心分支出来,你想继续朝着一个特定的方向移动,以避免一大群节点相互干扰。因此,虽然这段代码在圆周上绘制了一个点,但我需要能够在圆周的一段上绘制一个点。我在想也许应该可以接近三分之一的圆周。另一个障碍是这必须是圆周的正确部分,即如果节点向上分支,我不希望该部分是圆周的下半部分,分支需要继续向上移动。

我可以根据新父节点相对于其父节点位置的位置建立一个大致方向。但是有没有人知道如何使用这些数据将字段减少到这个方向的 a 段?

让我知道这是否没有意义,没有图表很难解释。

4

1 回答 1

2

我认为一种简单的方法是将你的圆圈分成 n 段(每段覆盖 2*PI / n 角度)。您可以将 n 设置为您想要的任何值,具体取决于您想要的精确度。然后当你计算一个新的点 x 时,首先得到 x.parent 所在的段(相对于它自己的父级),然后用它把 x 放在 x.parent 的同一段中。然后你可以有这样的东西:

var getSection = function(point) {
  var parent = point.parent;
  var angle = Math.acos((point.x - parent.x) / radius) % (Math.PI*2);
  var section = Math.floo(angle / (Math.PI * 2 / n))
  return section;
}

var section = getSection(parent); // return the index of the section
var angle = (Math.random() + section) * Math.PI * 2 / n
var x = Math.cos(angle)*radius;
var y = Math.sin(angle)*radius;

x+=parent.position.x;
y+=parent.position.y;
于 2013-08-03T17:17:56.823 回答