最近我有了使用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中创建另一个变量才能完成这个进程,但它应该有什么操作?
我很高兴知道,数学
答案 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方法将为您处理三角学。
如果你仍然想知道它背后的数学,我可以再做一个例子。