Bresenhamのアルゴリズムを用いた円(塗りつぶしなし)をppm形式で描画するソースコードに、円を塗りつぶす機能(再帰を用いる関数)をつけるという課題に取り組んでおります。
課題では円以外にも四角など囲まれた図形なら、その囲まれた部分を塗りつぶし、囲われていないのであればキャンバス全体を塗りつぶすような仕様です。
ヒントとして与えられたのは始めに円の中心を選び,その円の中心の座標及び色を関数として渡して、その点を塗りつぶしたい対象の色とします。そして、その中心の上下左右が、塗りつぶしたい対象の色と一致しているかどうかを見ていく…を繰り返し、最終的に縁の部分にぶつかった際に塗りつぶしを終了するようにすればよいとのことでした。
その部分のソースコードを書いてみたのですが、
void nurinuri(const int cx, const int cy, char icolor[cy][cx][3]){ //塗る対象の座標と,塗りたい対象の色
int j,k=0; //kは初期化しておく必要がある
for(j=0;j<3;j++){
if(icolor[cy][cx][j] != image[cy][cx][j]){ //違うならばフラグkを立てる
k++;
}
}
if(k==0){ //塗りたい対象の色と指定した座標の色が同じなとき
image[cy][cx][0] = blue_color[0]; //塗りつぶす
image[cy][cx][1] = blue_color[1];
image[cy][cx][2] = blue_color[2];
nurinuri(cx+1,cy,icolor[cy][cx+1][3]); //右に移動して再帰呼び出し.これだけでは右方向しか塗れない。。。
}
}
上記のコードだと、右に右に塗りつぶせるかを見ていくのみで、上下左が塗りつぶせるかが見ていけません。
OSはWindows,コンパイラはgccです。
宜しくお願いします。