作品紹介のなかで紹介しているAfterDark用モジュールPlazmaの画像生成アルゴリズムの原理です。
 原理はいたって簡単です。縦横2方向から来た波を重ね合わせるだけ。たとえば、x方向、y方向の波をそれぞれ
z = sin(x +t)
z = sin(y +t)
と表してtを動かしてやると、下のような動きになります。

で、これを z = sin(x +t) +sin(y +t) として合成すると、

といった動きになります。
 あとはzの値に応じて色付けするだけ。
 実際に使うにはもっと複雑な波にしたほうがいいし、いろんな高速化テクニックを使うことになります。
 波は要するに表示する範囲において「滑らか」なものであればOK。また、周期が短いと面白くないので、周期を長く「見せる」工夫も必要です(下にその一例をあげています)。サンプリングサウンドを使うのもおもしろそう。
実際のコードはこんな感じです
#define	vSpeed1	1
#define	vSpeed2	5
#define	hSpeed1	3
#define	hSpeed2	7

unsigned	char	waveTable[waveLength];	// あらかじめ波形データをいれておく
int	x, y;
unsigned	char	hWave, vWave;
int	vLoc1, vLoc2, hLoc1, hLoc2;

for(y = 0; y < yMax; y++){
	vWave = (waveTable[vLoc] +waveTable[vLoc2]) /2;
	/* sartHLoc: 横波の読み出し開始位置 */
	hLoc1 = startHLoc1;	
	hLoc2 = startHLoc2;
	for(x = 0; x < xMax; x++){
		hWave = (waveTable[hLoc1] +waveTable[DhvLoc2]) /2;
		
		Plot(x, y, (hWave +vWave) /2);
		
		hLoc1 += hSpeed1;
		hLoc1 %= waveLength;
		hLoc2 += hSpeed2;
		hLoc2 %= waveLength;
	}
	vLoc1 += vSpeed1;
	vLoc1 %= waveLength;
	vLoc2 += vSpeed2;
	vLoc2 %= waveLength;
}

Go To Code-Lab
Go To Laboratory
Go To H2 Home Page