1

我正在尝试进行创意编码,主要是为了创建实时视觉效果。我最近偶然发现了一个名为https://www.openprocessing.org/的很棒的网站,人们可以在这里分享他们的创作。

我在下面附加了用于创建两个移动圆圈的代码,但我无法理解创建者是如何这样做的,如果有人可以向我解释 for 循环是如何工作的以及该x += 0.006; y += 0.006; if (x > TWO_PI) {x = 0;}部分是如何工作的,将不胜感激。sin,cos和 Two_PI 函数的使用让我感到困惑。这是原始代码的链接:

https://www.openprocessing.org/sketch/467333

//comment
float x = 0;
float xx = 0;
float y = 0;
float yy = 0;
float sizecircle = 250;

void setup() {
    size (800, 650);
    frameRate (60);
    strokeWeight (1);
    stroke (223, 170, 22);
}

void draw() {
    background (51, 51, 51);

    for (float i = 0; i < TWO_PI; i += TWO_PI/100) {  
        line (350 + sin(x+i) * sizecircle, 275 + cos(y+i) * sizecircle, 450 + cos(xx+i) * sizecircle, 375 + sin(yy+i) * sizecircle);
    }

    x += 0.006;
    y += 0.006;
    if (x > TWO_PI) {
        x = 0;
    }
    if (y > TWO_PI) {
        y = 0;
    }

    xx += 0.002;
    yy += 0.002;
    if (xx > TWO_PI) {
        xx = 0;
    }
    if (yy > TWO_PI) {
        yy = 0;
    }
}
4

2 回答 2

3

sin和的角度单位cos弧度。360° 是 2*PI,这就是TWO_PI.
变量xy和递增 0.0xxyy2*PI。如果它们达到 2*PI,它们会再次从 0.0 开始。

使用以下代码将从中心点 ( cx, cy) 到半径为 100 个点的圆画线r

for (float i = 0; i < TWO_PI; i += TWO_PI/100) {  
    line(cx, cy, cx + cos(i)*r, cy + sin(i)*r);
}  

问题代码中的技巧是这些线连接了 2 个圆周围的点,这些圆的旋转方向相反:

line(cx1 + sin(i)*r, cy1 + cos(i)*r,
     cx2 + cos(i)*r, cy2 + sin(i)*r);

请注意,与终点相比,起点sin和起点的顺序交换了,这会导致圆的旋转方向相反。 不同的转速分别是由不同的常数引起的。cos
0.0060.002


顺便说一句,代码可以简化,因为x == yxx == yy. TWO_PI在 [0, ]范围内使用 2 个角就足够了:

float a1 = 0;
float a2 = 0;
float sizecircle = 250;
void draw() {
    background (51, 51, 51);

    for (float i = 0; i < TWO_PI; i += TWO_PI/100) {  
        line (350 + sin(a1+i)*sizecircle, 275 + cos(a1+i)*sizecircle,
              450 + cos(a2+i)*sizecircle, 375 + sin(a2+i)*sizecircle);
    }

    a1 += 0.006;
    a2 += 0.002;
}

由于sin(x) == sin(x + TWO_PI*n)cos(x) == cos(x + TWO_PI*n)(n 是整数),没有必要“重置”角度。

于 2019-11-12T15:24:21.790 回答
2

它更多的是关于数学而不是编程(嗯,这两件事是齐头并进的)。

他做了两次同样的事情,每个圆圈一次,但两者中的一个会比另一个“移动”得更快,因此 和 的x += 0.006;差异xx += 0.002;

一个完整的圆中有 2 个 PI 弧度(所以 2 个 PI 弧度 == 360 度)。这就是他使用这种措施的原因。

这条线

line (350 + sin(x+i) * sizecircle, 275 + cos(y+i) * sizecircle, 450 + cos(xx+i) * sizecircle, 375 + sin(yy+i) * sizecircle);

通过在它们之间绘制一堆线来定义每个圆圈如何“连接”到另一个圆圈。这个想法是,作者创建了一个循环来更新一条线的起点和终点,只要有要绘制的线,这个循环就会运行(它使用 2 PI 编号绕着圆圈运行)。

因此,在for (float i = 0; i < TWO_PI; i += TWO_PI/100)循环中,他为圆圈的这个位置绘制了每条线。

然后他改变了“起点”,他将通过x, y, xx, yy稍微增加变量来绘制第一条线。当它们在弧度的上下文中使用时,它们围绕圆圈“环绕”。

然后draw()循环重新开始,他重新绘制了整个东西,但随着起点的变化有点不同。这使绘图看起来像在移动。

当“起点”变量x, y, xx, yy完成一个完整的转弯时(因此当它们超过 2 PI 弧度时),他将它们重置。因为它是一个完整的回合,所以它不是一个巨大的重置。这就像时钟比整点过一分钟时四舍五入。

希望能帮助到你。

于 2019-11-12T15:16:50.123 回答