我正在制作一个脚本原型,以在旋转平面周围绘制等距点,而处理会产生意外的结果?这是我的代码:int WHITE = 255;int BLACK = 0;void setup() { size(500, 500);}void draw() { background(WHITE); translate(width/2, height/2); // move origin to center of window // center ellipse noStroke(); fill(255, 0, 0); ellipse(0, 0, 10, 10); // center point, red // satellite ellipses fill(BLACK); int points = 4; for (int i = 0; i < points; i++) { rotate(i * (TWO_PI / points)); ellipse(0, 100, 10, 10); // after plane rotation, plot point of size(10, 10), 100 points above y axis }}当points = 4我得到我期望的输出时points = 5 // also when points = 3 or > 4,但是当 时,我得到的输出缺少绘制点,但间距仍然正确。为什么会发生这种情况?
1 回答
莫回无
TA贡献1865条经验 获得超7个赞
你旋转太多了:你不想i * angle
在每次迭代时都旋转,因为如果我们这样做,我们最终会旋转太多,以至于点最终会重叠。例如,对于原样的代码,我们希望将 3 个点放置在 0、120 和 240 度(或 120、240、360)处。但事实并非如此:
当 i=0 时,我们旋转 0 度。到目前为止,一切都很好。
当 i=1 时,我们在 0 的基础上旋转 120 度。还是不错的。
当 i=2 时,我们在 120 度的基础上旋转 240 度。这 120 度太远了!
这显然不是我们想要的,所以只需旋转固定角度TAU / points
,事情就会按预期工作:
for (int i = 0; i < points; i++) {
rotate(TAU / points);
ellipse(0, 100, 10, 10);
}
或者,保持增量角度,但然后通过使用三角学来计算放置rotate(),而不使用 来放置点:
float x = 0, y = 100, nx, ny, angle;
for (int i = 0; i < points; i++) {
angle = i * TAU / points;
nx = x * cos(a) - y * sin(a);
ny = x * sin(a) + y * cos(a);
ellipse(nx, ny, 10, 10);
}
添加回答
举报
0/150
提交
取消