Path (数学问题)创造积分螺旋:我如何改变”;相对的;位置到绝对位置

Path (数学问题)创造积分螺旋:我如何改变”;相对的;位置到绝对位置,path,processing,spiral,Path,Processing,Spiral,最近,我有了一个想法,用点来制作一个钟摆,通过一点学习,我很容易地解决了这个问题: 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(radian

最近,我有了一个想法,用点来制作一个钟摆,通过一点学习,我很容易地解决了这个问题:

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();
}
int contador=0;
int曲率=2;
浮动摆;
无效设置(){
尺寸(300300);
}
作废提款(){
背景(100);
康塔多=(康塔多+1)%360;/“康塔多”从0变为359
pendulo=sin(弧度(康塔多))*曲率;/“pendulo”等于康塔多的sin,因此它反复从1变为-1,然后相乘以强调或减少直线的曲率。
塔洛(宽/2,高/3);
println(pendulo);
}
void tallo(intx,inty){//绘制虚线的函数
pushMatrix();
翻译(x,y);
浮点数_y=0.0;
对于(int i=0;i<25;i++){//创建点序列。
椭圆(0,0,5,5);
_y+=5;
旋转(弧度(摆度));//在每次迭代时旋转它们,这将生成螺旋。
}
popMatrix();
}
简而言之,我所做的是一个函数,它通过旋转函数改变了每个点的位置,然后我只需要在原点坐标中画椭圆,因为这才是真正改变位置并产生摆的东西

[举个例子,如果你是个非犹太人,我只需要再加2分:)]

[捕获示例]

[捕获示例]

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

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

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();
}
我知道我要做的是删除变换函数,为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();
}
void tallo(整数x,整数y){
pushMatrix();
翻译(x,y);
//现在我们从更改开始。让我们声明坐标的变量
浮点数x=0.0;
浮点数_y=0.0;
beginShape();
对于(int i=0;i<25;i++){//创建点。
顶点(x,y);//更改为顶点并调用新变量,确定。

//旋转(弧度(摆度));你可以使用简单的三角学。你知道角度和斜边,所以你可以使用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方法将为您处理三角学

如果你还想知道它背后的数学原理,我可以再举一个例子