ページ 11

PPM方式で出力される円の塗りつぶし

Posted: 2015年12月07日(月) 12:17
by 奈良男
円の塗りつぶしについての質問です。

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]);			 //右に移動して再帰呼び出し.これだけでは右方向しか塗れない。。。
	}
}
「‘nurinuri’ の引数へ渡すときに整数からキャスト無しにポインタを作成しています [デフォルトで有効]」と出て原因と塗りつぶしの方針が解らず困っています。

上記のコードだと、右に右に塗りつぶせるかを見ていくのみで、上下左が塗りつぶせるかが見ていけません。



OSはWindows,コンパイラはgccです。

宜しくお願いします。

【追加】PPM方式で出力される円の塗りつぶし

Posted: 2015年12月07日(月) 12:23
by 奈良男
blue_color[3]とは、青色のデータを表すchar型の配列で、

const unsigned char blue_color[3] = {0,0,255};

としています。

また,
icolor[Y][X][3]は,座標XYのRGBを成分とした配列のことです。
icolor[Y][X][0]はRの成分,icolor[Y][X][1]はGの成分,icolor[Y][X][2]はBの成分です