ロジックは、コッホフラクタルの生成に似ています。これは次のようになります。
- 直線の水平線を引きます。
- 線を3つのセグメントに分割します。
- 中央のセグメントを1つのセグメントのサイズと同じ量だけ上に移動します。
- セグメントごとに繰り返します。
したがって、関数は基本的にこの線を描画しようとする必要があります。
_________
| |
| |
| |
_________| |_________
このプロセスは、水平線ごとに順番に繰り返されます。
これを行うために私が考えることができる1つの簡単な方法は、単純に直線から始めることです。次に、各反復で線の中央を消去し、アップシフトを実行します(黒い線の上に白い線を描くことができます)。
したがって、擬似コードは次のようになります。
// Pseudocode:
fractal (x_start,x_end, y) {
// first simply draw a straight line:
line(x_start,y,x_end,y);
// divide the line into 3 and push the middle up
length = x_end-x_start;
segment_length = length/3;
x2 = x_start+segment_length;
x3 = x_start+segment_length*2;
y2 = y-segment_length;
erase_line(x2,y,x3,y);
line(x2,y,x2,y2); // up
line(x2,y2,x3,y2); // accross
line(x3,y2,x3,y); // down
// now repeat for each segment
fractal(x_start,y,x2,y);
fractal(x2,y2,x3,y2);
fractal(x3,y,x_end,y);
}
これが基本的な動作機能です。繰り返しが停止しないため、上記の関数は無限に(またはメモリが不足するまで)続行されることに注意してください。したがって、最初に行うことは、再帰制限を追加することです。
// Pseudocode:
fractal (x_start,x_end, y, limit) {
//
// same content as above except the last 3 lines
//
limit --;
if (limit) {
fractal(x_start,y,x2,y,limit);
fractal(x2,y2,x3,y2,limit);
fractal(x3,y,x_end,y,limit);
}
}
それは良い出発点になるはずです。
あなたが行うことができる他の最適化があります。たとえば、各反復は基本的に直線を再度描画するため、最初に直線を描画する必要はありません。再帰の限界で水平線を引くだけで済みます。つまり、描画しなかった線を消去する必要はありません。ただし、その実装は読者の演習として残しておきます。