minikoro

Yasuhide Yamashita mini webblog.

Processingでオプ・アートの模写:Source

2015.Dec.17 Thu

Processingでオプ・アートの模写記事でのソースです。なんか色々もうちょっと上手く書く方法がありそうな感じですが^^;(223行目はバグで表示されているので無視してくださいませ)(m_ _m)。
int squareSize;					// 初期正方形のサイズ
float addSquareVal;				// 追加タイミングの基準
float tempSquareVal;				// 追加タイミング比較用
ArrayList squareArrayList;		// 描画オブジェクトArrayList
float upVal;

int[] colorH;					// ベースカラー:0-360
int[] colorS;					// ベースカラー:30-100
int[] colorB;					// ベースカラー:30-100
int[] colorUpBaseH;				// 色増減値
int[] colorUpBaseS;
int[] colorUpBaseB;
int[] colorSwitchH;				// 増減スイッチ0/1:1がプラス
int[] colorSwitchS;
int[] colorSwitchB;
int colorType;					// 使用カラーパターン判別

void setup(){
	squareSize = int(random(5,8));
	addSquareVal = random(1,3);
	tempSquareVal = 0;
	upVal = 0.1;

	colorMode(HSB,360,100,100);
	size(500,500);
	rectMode(CORNER);
	background(0);
	noStroke();
	frameRate(400);

	// HSBカラー関連用の変数を初期化。
	colorH = new int[2];
	colorS = new int[2];
	colorB = new int[2];
	colorUpBaseH = new int[2];
	colorUpBaseS = new int[2];
	colorUpBaseB = new int[2];
	colorSwitchH = new int[2];
	colorSwitchS = new int[2];
	colorSwitchB = new int[2];

	for(int i = 0; i < 2; i++) {
		colorH[i] = round(random(0,360));
		colorS[i] = round(random(30,100));
		colorB[i] = round(random(30,100));
		colorUpBaseH[i] = round(random(1,15));
		colorUpBaseS[i] = round(random(1,5));
		colorUpBaseB[i] = round(random(1,5));
		colorSwitchH[i] = round(random(0,1));
		colorSwitchS[i] = round(random(0,1));
		colorSwitchB[i] = round(random(0,1));
	}

	colorType = 1;

	squareArrayList = new ArrayList();
	squareArrayList.add(new Square(width,height,squareSize,upVal, colorH[0], colorS[0], colorB[0]));
}

void draw() {
	for(int i = 0; i < squareArrayList.size(); i++) {
		// 枠外に出たオブジェクトは削除
		if(squareArrayList.get(i).delFlg) {
			squareArrayList.remove(i);
		} else {
			squareArrayList.get(i).makeSquare();
		}
	}

	tempSquareVal += upVal;
	if(tempSquareVal >= addSquareVal) {
		// カラーの書き換え
		if(colorSwitchH[colorType] == 0) {
			// 減算パターン
			colorH[colorType] -= colorUpBaseH[colorType];
			if(colorH[colorType] < 0) {
				colorH[colorType] = 0;
				colorSwitchH[colorType] = 1;
			}
		} else {
			// 加算パターン
			colorH[colorType] += colorUpBaseH[colorType];
			if(colorH[colorType] > 360) {
				colorH[colorType] = 360;
				colorSwitchH[colorType] = 0;
			}
		}

		if(colorSwitchS[colorType] == 0) {
			// 減算パターン
			colorS[colorType] -= colorUpBaseS[colorType];
			if(colorS[colorType] < 0) {
				colorS[colorType] = 0;
				colorSwitchS[colorType] = 1;
			}
		} else {
			// 加算パターン
			colorS[colorType] += colorUpBaseS[colorType];
			if(colorS[colorType] > 100) {
				colorS[colorType] = 100;
				colorSwitchS[colorType] = 0;
			}
		}

		if(colorSwitchB[colorType] == 0) {
			// 減算パターン
			colorB[colorType] -= colorUpBaseB[colorType];
			if(colorB[colorType] < 0) {
				colorB[colorType] = 0;
				colorSwitchB[colorType] = 1;
			}
		} else {
			// 加算パターン
			colorB[colorType] += colorUpBaseB[colorType];
			if(colorB[colorType] > 100) {
				colorB[colorType] = 100;
				colorSwitchB[colorType] = 0;
			}
		}

		squareArrayList.add(new Square(width,height,squareSize,upVal, colorH[colorType], colorS[colorType], colorB[colorType]));

		// カラーパターンを切り替え
		switch (colorType) {
			case 0:
				colorType = 1;
				break;
			case 1:
				colorType = 0;
				break;
		}

		// 追加サイズ比較用の値を初期化。
		tempSquareVal = 0;
	}
}


class Square {
	float w;
	float h;
	float halfCirclAngle;			// 縦円の角度
	float topQuarterAngleVal;		// 上1/4円の角度
	float bottomQuarterAngleVal;		// 下1/4円の角度
	int squareSize;				// 初期正方形のサイズ
	float cercleR;				// 円の半径
	float upVal;
	boolean delFlg;				// 削除フラグ
	int colorH;
	int colorS;
	int colorB;
	float afterVal;				// 90度分の描画の後の増減。

	/**
	 * コンストラクタ
	 */
	Square(int w_, int h_, int s_, float u_, int colorH_, int colorS_, int colorB_) {
		w = w_;
		h = h_;
		upVal = u_;
		halfCirclAngle = 0;
		topQuarterAngleVal = 270;
		bottomQuarterAngleVal = 90;
		squareSize = s_;
		cercleR = (w-squareSize)/2;
		delFlg = false;
		colorH = colorH_;
		colorS = colorS_;
		colorB = colorB_;
		afterVal = 0;
	}

	void makeSquare() {
		float halfCirclTopX;			// 左半円上座標軸
		float halfCirclTopY;
		float halfCirclBottomY;
		float topQuarterCirclX;			// 上1/4円下座標軸
		float objHeight;
		float objWidth;

		fill(colorH,colorS,colorB);

		if(topQuarterAngleVal <= 360) {
			// 1/4円を描くまでは通常の描画
			// 左1/4円の角度(上下共通)
			// 角度を加速度的に増加することでY座標の増加も加速度的になる
			halfCirclAngle = 90+90*sin(radians(topQuarterAngleVal));

			// 左縦円上座標軸
			halfCirclTopX = cercleR * cos(radians(halfCirclAngle));
			halfCirclTopY = -cercleR * sin(radians(halfCirclAngle)) + cercleR;

			// 左縦円下座標軸
			halfCirclBottomY = cercleR * sin(radians(halfCirclAngle)) + cercleR + squareSize;

			// 右1/4円上座標軸
			topQuarterCirclX = cercleR * cos(radians(bottomQuarterAngleVal)) + cercleR + squareSize;

			// オブジェクトの高さを算出
			objHeight = halfCirclBottomY - halfCirclTopY;
			objWidth = topQuarterCirclX - halfCirclTopX;
			rect(halfCirclTopX,halfCirclTopY,objWidth,objHeight);

			// 角度調整
			topQuarterAngleVal += upVal;
			bottomQuarterAngleVal -= upVal;
		} else {
			// 1/4円を描いた場合は正方形での増加となる
			afterVal += 1;
			halfCirclTopX = 0 - afterVal;
			halfCirclTopY = 0 - afterVal;
			objWidth = w + (afterVal * 2);
			objHeight = h+ (afterVal * 2);
			rect(halfCirclTopX,halfCirclTopY,objWidth,objHeight);
		}

		// 枠外エリア描画判別
		if(objWidth >= (w + 50) && objHeight >= (h + 50)) {
			delFlg = true;
		}
	}
}
Tags : Creative Javascript Processing