我如何拆分所有角度的点列表

How can i split a list of points in all angle

我尝试将一个点列表分成所有基本角度

这是我的代码

var increment =15/50;       
var distance = 20;
var count = 0;

for( theta=0;theta <50; theta++) {      
  var newX = centerX +distance*Math.cos(theta*2*Math.PI*increment);
  var newY = centerY +distance*Math.sin(theta*2*Math.PI*increment);
  cxt.fillText("o",newX, newY);
  count++;
  if(count%5===0){
  distance=distance+20;
  }
}

输出:

我尝试多次修改增量,但要么他们没有变成直线,要么所有的点都变得一团糟 这个的确切增量数或函数是什么?

问题 1

不需要 count - 它的递增方式与 theta:

完全相同
var increment =15/50;       
var distance = 20;

for( theta=0;theta <50; theta++) {      
  var newX = centerX +distance*Math.cos(theta*2*Math.PI*increment);
  var newY = centerY +distance*Math.sin(theta*2*Math.PI*increment);
  cxt.fillText("o",newX, newY);
  if(theta%5===0){  // just use theta here
    distance=distance+20;
  }
}

问题2

if 语句每 5 个点递增 distance 一次,这意味着每个 "ring" 只包含 5 个点,而它们应该有与基本角一样多的点。因此逻辑应该是:

if (theta % 16 === 0) {  // there are 16 "basic angles"
  distance += 20;
}

问题3

1 不是小数增量 15/50 的整数倍,因此第二个 "ring" 点不会与第一个对齐 - 会有一个 angular 连续环之间 2*PI/5 的偏移量。

按照Damien 的建议,将单个循环分成两个嵌套循环会更有效。外循环应该增加角度,因为三角函数很昂贵。

var num_basic_angles = 16;  // number of basic angles
var separation = 20;        // distance between each point
var num_points;             // number of points per angle

for (var angle = 0; angle < num_basic_angles; angle++) {
  var theta = 2*Math.PI*angle/num_basic_angles;
  var cos_t = Math.cos(theta);
  var sin_t = Math.sin(theta);
  for (var point = 0; point < num_points; point++) {
    var x = centerX + distance * point * cos_t;
    var y = centerY + distance * point * sin_t;
    cxt.fillText("o",x,y);
  }
}

如果你真的想在一个循环中做事,使用theta = Math.floor(i / num_basic_angles), point = i % num_basic_angles,其中i是从0到num_basic_angles * num_points - 1.

的循环计数器

问题4

"basic angles"分布不均匀,按固定值递增是行不通的。

这里不需要太聪明,反正这些基本角度都是任意定义的。只需将它们存储在一个数组中:

var basic_angles = [0,30,45,60,90,120,135,150,180,210,224,240,270,300,315,330];

var separation = 20;  // distance between each point
var num_points;       // number of points per angle

for (var angle = 0; angle < basic_angles.length; angle++) {
  var theta = Math.PI/180.0*basic_angles[angle];
  var cos_t = Math.cos(theta);
  var sin_t = Math.sin(theta);
  for (var point = 0; point < num_points; point++) {
    var x = centerX + distance * point * cos_t;
    var y = centerY + distance * point * sin_t;
    cxt.fillText("o",x,y);
  }
}