【问题标题】:Creating Visualisations in Processing and Understanding Code在处理和理解代码中创建可视化
【发布时间】:2020-03-08 07:12:03
【问题描述】:

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

我在下面附上了用于创建两个移动圆圈的代码,但我无法理解创建者是如何这样做的,如果有人可以向我解释 for 循环是如何工作的以及x += 0.006; y += 0.006; if (x > TWO_PI) {x = 0;} 部分是如何工作的,这将不胜感激。 sincos 和 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;
    }
}

【问题讨论】:

    标签: java for-loop processing visualization openprocess


    【解决方案1】:

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

    他做了两次相同的事情,每个圆圈一次,但两者中的一个会比另一个“移动”得更快,因此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 &lt; TWO_PI; i += TWO_PI/100) 循环中,他为圆圈的这个位置绘制了每一条线。

    然后他改变了“起点”,他将通过增加变量x, y, xx, yy 来绘制第一行。由于它们用于弧度的上下文中,因此它们围绕圆圈“环绕”。

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

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

    希望对你有帮助。

    【讨论】:

    • 这非常有帮助,谢谢,我得提高我的数学技能!
    • 我的荣幸,玩得开心!
    【解决方案2】:

    sincos 的角度单位是Radian。 360°是2*PI,这就是TWO_PI的原因。
    变量 xyxxyy 递增 0.0 到 2*PI。如果它们达到 2*PI,它们会再次从 0.0 开始。

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

    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);
    

    请注意,sincos 的顺序与结束点相比交换了起点,这会导致圆的旋转方向相反。
    不同的转速是由不同的常数0.0060.002引起的。


    顺便说一句,代码可以简化,因为x == yxx == yy。在 [0, TWO_PI] 范围内使用 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 是整数),没有必要“重置”角度。

    【讨论】:

    • 非常感谢,这使它更加清晰,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    相关资源
    最近更新 更多