Processingでサイクロイド

 関数名とか忘れやすいのでコード補完が無いのはイラッとくるけど、Processingに慣れてきたのでサイクロイドでも描いてみようと思う。

 パラメトリック方程式とかサイクロイドとかはWikipedia参照。
パラメトリック方程式
サイクロイド
「変数tを導入してバラバラにするやつ」はパラメトリック方程式という名前だったんですね。
今知りました。

/*初期化のパラメータ
ww,wh:画面の幅、高さ
hww,hwh:画面の幅、高さの半分のサイズ
*/
final int ww = 640;
final int wh = 480;
final int hww = ww/2;
final int hwh = wh/2;

/*サイクロイドのパラメータ
r:半径
st:刻む時間の大きさ
maxt:最大の角度
*/
final float r = 150;
final float dt = 0.01;
final float maxt = 2*PI;

/*変数
x,y:座標(x,y)
nx,ny:次の座標(x,y)
t:角度
*/
float x, nx, y, ny, tmpx, tmpy;
float t = 0;

//初期化
void setup()
{
  size(ww,wh);
  background(255);
  strokeWeight(2);  //線の太さ
  
  //初期位置の設定
  pmf();
  x = tmpx;
  y = tmpy;
}

//描画
void draw()
{
  //角度を進める
  t += dt;
  //次の座標の計算
  pmf();
  nx = tmpx;
  ny = tmpy;
  //直線を引く
  line(x+hww,y+hwh,nx+hww,ny+hwh);
  //座標の更新
  x = nx;
  y = ny;
  
  //最大角度を越えればループを止める
  if(t >= maxt) noLoop();
}

//パラメトリック方程式の計算
void pmf()
{
  tmpx = r * cos(t);
  tmpy = r * sin(t);
}

 これで円を描画できる。
f:id:pongeponge:20130615042042j:plain
何かpmf()関数が変なことになってるけど、参照渡しのやりかたが分からなかったためにこんな事になってる。
ホントにどうやるんだろう、参照渡し。

 さっそくサイクロイドを作ってみた。
変更したのはmaxtを2*PI*2にしたことと、式。

//パラメトリック方程式の計算
void pmf()
{
  tmpx = r * (t-sin(t));
  tmpy = r * (1-cos(t));
}

f:id:pongeponge:20130615044126j:plain
上下逆になってるし、二つあるせいで尻に見えるけど、確かにサイクロイド