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 ポイント必要です :)]

【攻略例】

【攻略例】

ここまではすべて問題ありませんでした。頂点で作られたパスの楕円を置き換えようとしたときに問題が発生しました。問題は明らかです。すべての頂点が 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 に答える