サインカーブ

JavaAppletだとやっぱ成果を発表しづらいのがツライな。ローカルでみせる分にはいいんだけど。
内定者研修のネタにするのでもっとツッコむけど。

グラフィックの概念のオブジェクトと、プログラムの概念のオブジェクトをどう対応させるか少し悩んだけど、普通に一対一に対応させて、グラフィックのオブジェクトの描画情報を保持するプログラムのオブジェクトを作って、だいたいOK。
小規模の描画のプログラムを書くときは、堅牢さとかよりも、目的に合わせて書きやすい方法で書くのが一番ということに気づいた。
Swingとか設計するのって大変ですね。

package foo.study;

import foo.study.lesson1.Util;
import processing.core.PApplet;

public class SinCurve extends PApplet {
	int radius;
	Foo[] foos = new Foo[15];

	@Override
	public void setup() {
		size(600, 400);
		colorMode(RGB, 256);
		noStroke();
		frameRate(30);
		smooth();

		radius = 10;

		for (int i = 0; i < foos.length; i++) {
			foos[i] = new Foo(this, 30 * random(20));
		}
	}

	@Override
	public void draw() {
		Util.withAfterImage(this);

		for (int i = 0; i < foos.length; i++) {
			fill(foos[i].color);
			foos[i].move();
			ellipse(foos[i].indexX, foos[i].indexY, radius * 2, radius * 2);
		}
	}
}

class Foo {
	float FRICTION = 0.988F;

	float indexX, indexY;
	float velocityX, velocityY;
	float accelX, accelY;
	int color;
	float baseX;
	int width;
	int height;

	int radius = 10;

	public Foo(PApplet applet, float x) {
		indexX = x;
		baseX = x;
		indexY = applet.height / 2;

		velocityX = 10;
		accelX = 0.5F;

		color = applet.color(applet.random(256), applet.random(256), applet
				.random(256), 60);

		width = applet.width;
		height = applet.height;

	}

	void moveX() {
		if (width < indexX) {
			velocityX = -10;
		}
		if (indexX < 0) {
			velocityX = 10;
		}

		velocityX = velocityX * FRICTION;
		indexX = indexX + velocityX;
	}

	void moveY() {
		indexY = 200 + (float) Math.sin(Math.toRadians(indexX - baseX))
				* (height / 2 - radius);
	}

	void move() {
		this.moveX();
		this.moveY();
	}
}