(MATH ISSUE)用点创建SPIRAL:我如何改变" relative"位置绝对位置

时间:2016-02-08 16:55:05

标签: path processing absolute relative spiral

最近我有了使用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();
}

所以,简而言之,我所做的是一个用 rotate 功能改变每个点位置的函数,然后我只需要在原点坐标中绘制椭圆,因为它是真实的改变位置并造成钟摆的事情。

[捕获示例,如果你是如此异国情调,我只需要2点积分:)]

[捕获示例]

[捕获示例]

到目前为止一切都还可以。当我尝试替换由顶点构成的路径的椭圆时,问题出现了。问题很明显:从不(视觉上)制作路径,因为当它们与零坐标一起移动时,所有顶点都是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值在每次迭代中都会发生变化,每次都不必添加相同的数量。添加必须是渐进的。否则,我们会看到一条直线旋转而不是一条曲线突出其曲率(如果你将曲线的值增加到一个大于20的数字,你会注意到螺旋)< / p>

所以,旋转坐标对它来说是一个很好的解决方案,现在想到螺旋的x和y坐标的数学解决方案是一种混乱,我的二级知识不是&#39够了。我知道我必须在for中创建另一个变量才能完成这个进程,但它应该有什么操作?

我很高兴知道,数学

1 个答案:

答案 0 :(得分: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);

}

使用fromAngle(浮点角度)的PVector类静态方法返回给定角度的单位向量,然后使用.setMag()来定义它的长度。 那些PVector方法将为您处理三角学。

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