作品紹介のなかで紹介している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