我如何拆分所有角度的点列表
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);
}
}
我尝试将一个点列表分成所有基本角度
这是我的代码
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);
}
}