0

最近我有了一个想法,用Processing制作一个钟摆,通过一点学习我很容易解决了它:

int contador = 0;
int curvatura = 2;
float pendulo;

void setup(){
  size(300,300);
}

void draw(){
  background(100);
  contador = (contador + 1) % 360; //"CONTADOR" GOES FROM 0 TO 359
  pendulo = sin(radians(contador))*curvatura;  //"PENDULO" EQUALS THE SIN OF CONTADOR, SO IT GOES FROM 1 TO -1 REPEATEDLY, THEN IS MULTIPLIED TO EMPHASIZE OR REDUCE THE CURVATURE OF THE LINE.
  tallo(width/2,height/3);
  println(pendulo);
}


void tallo (int x, int y){ //THE FUNTION TO DRAW THE DOTTED LINE
pushMatrix();

translate(x,y);

float _y = 0.0;

for(int i = 0; i < 25; i++){ //CREATES THE POINTS SEQUENCE.

  ellipse(0,0,5,5);

  _y+=5;

  rotate(radians(pendulo)); //ROTATE THEM ON EACH ITERATION, THIS MAKES THE SPIRAL.
}

popMatrix();
}

所以,简而言之,我所做的是一个用旋转功能改变每个点位置的函数,然后我只需要在原点坐标中绘制椭圆,因为这是改变位置并产生钟摆错觉的真实事物。

[捕获示例,如果您如此异教徒,我只需要多 2 分 :)]

[捕获示例]

[捕获示例]

到目前为止一切都很好。当我尝试将椭圆替换为由 vertices 组成的路径时,出现了问题。问题很明显:永远不会(视觉上)创建路径,因为所有顶点都将随着零坐标移动而为 0,0。

因此,为了使路径成为可能,我需要每个顶点的绝对值;还有一个问题:我如何得到它们?

我知道我必须做的是删除变换函数,为 X 和 Y 位置创建变量并在 for 中更新它们,但是然后呢?这就是为什么我清除了这是一个数学问题,我必须在 X 和 Y 变量中添加哪个操作才能使路径及其曲率成为可能?

void tallo (int x, int y){
pushMatrix();

translate(x,y);

//NOW WE START WITH THE CHANGES. LET'S DECLARE THE VARIABLES FOR THE COORDINATES
float _x = 0.0;
float _y = 0.0;

beginShape();
for(int i = 0; i < 25; i++){ //CREATES THE DOTS.
  vertex(_x,_y); //CHANGING TO VERTICES AND CALLING THE NEW VARIABLES, OK.
  //rotate(radians(pendulo)); <--- HERE IS MY PROBLEM. HOW DO I CONVERT THIS INTO X AND Y COORDINATES?
  //_x = _x + ????;
  _y = _y + 5 /* + ???? */;
}
endShape();

popMatrix();
}

我们需要记住,pendulo 的 x 和 y 值在 for 的每次迭代中都会发生变化,它不必每次都添加相同的数量。添加必须是渐进的。否则,我们会看到一条直线旋转,而不是一条突出其曲率的曲线(如果将 curvatura 的值增加到大于 20 的数字,您会注意到螺旋)

所以,旋转坐标是一个很好的解决方案,现在思考螺旋的 x 和 y 坐标的数学解决方案有点混乱,我中学的知识还不够。我知道我必须在 for 中创建另一个变量才能进行此进展,但它应该有什么操作?

我会很高兴知道,数学

4

1 回答 1

0

您可以使用简单的三角函数。你知道角度和斜边,所以你用 cos 得到相对的x 位置,并用 sin 得到 y。该位置将相对于中心点。

但在我详细解释并得出一些解释之前,让我提出另一个解决方案:PVectors

void setup() {
    size(400,400);
    frameRate(60);
    center = new PVector(width/2, height/3); //defined here because width and height only are set after size()
}

void draw() {
    background(255);
    fill(0);
    stroke(0);
    angle = arc_magn*sin( (float) frameCount/60 );
    draw_pendulum( center );

}

PVector center;
float angle = 0;
float arc_magn = HALF_PI;
float wire_length = 150;
float rotation_angle = PI/20 /60 ; //we divide it by 60 so the first part is the rotation in one second

void draw_pendulum(PVector origin){

    PVector temp_vect = PVector.fromAngle( angle + HALF_PI);
    temp_vect.setMag(wire_length);
    PVector final_pos = new PVector(origin.x+temp_vect.x, origin.y+temp_vect.y );
    ellipse( final_pos.x, final_pos.y, 40, 40);
    line(origin.x, origin.y, final_pos.x, final_pos.y);

}

您使用 PVector 类静态方法 fromAngle(float angle) 返回给定角度的统一向量,然后使用 .setMag() 定义它的长度。这些 PVector 方法将为您处理三角函数。

如果你仍然想知道它背后的数学,我可以再举一个例子。

于 2016-02-12T15:13:30.947 回答