#99 Article 322 Posted at 1992/06/29 00:05:56 by よししし (MAP2108) [Q.PAI]

Subject: いきなり質問 ver0.01 paint編

いきなりCのソースをアップして質問しまうふとどき者です。
 ごめんなさい。

 X68000マシン語プログラミングという本にあった
 ペイントルーチンで、「スキャンラインシードフィル」というアルゴリズムを
 自分なりにCのプログラムにしてみて使ってみたのですが・・・遅い!

 これは私の腕の無さが原因と思われます(^^;)。
 そこで、もっと速くするにはどうしたらよいのでしょうか?
 もしよろしければければ教えて下さい!
 よろしくお願いします。

 PS.私はポインタがよく分りません
	そのせいで遅いのかもしれないです。


あ、忘れていました(^_^;) cgdat[319+1][199+1]は仮想画面です。

/***************ペイント**********************************/
void	paint_1(pax,pay,color)

int	pax,pay,color;
{
	unsigned char	seedcolor=0;			/*描画色*/
	unsigned char	bakcolor=0;			/*背景色*/
	short		px1=0, py1=0, topx=0, endx=0, ip=0;
	short		pptr=0, topflg=0, endflg=0;
	short		seedx[3000+1];			/*シードバッファ*/
	short		seedy[3000+1];			/*シードバッファ*/


	seedcolor = (char)color;		/*描画色をseedcolorに代入*/
	bakcolor = cgdat[pax][pay];		/*背景色をbakcolorに代入*/

	if ( seedcolor == bakcolor )
		return;

	topflg = pptr;
	endflg = pptr+1;
	seedx[topflg] = pax;
	seedy[topflg] = pay;

	while ( (endflg-topflg) > -1 ){		/*シ-ドが0になったら終わり*/

		/*-方向に背景色があったら線を引く*/

		px1 = seedx[topflg];		/*シードをpx1,py1に代入*/
		py1 = seedy[topflg];
		while ( cgdat[px1][py1] == bakcolor ){
			if ( px1 == -1 )
				break;
			cgdat[px1][py1] = seedcolor;
			px1--;
		}
		topx = px1+1;			/*左端をtopxに保存*/

		/*+方向に背景色があったら線を引く*/

		px1 = seedx[topflg]+1;
		while ( cgdat[px1][py1] == bakcolor ){
			if ( px1 == 320 )
				break;
			cgdat[px1][py1] = seedcolor;
			px1++;
		}
		endx = px1-1;			/*右端をendxに保存*/

		if ( pptr > 2600 )
			return;

		/*引いた線分の上のラインを走査*/

		if ( py1 > 0 ){
			py1--;
			for ( ip=topx ; ip<endx ; ip++ ){
				if (cgdat[ip][py1] == bakcolor){
					if (cgdat[ip+1][py1] != bakcolor){
						pptr++;
						seedx[pptr] = ip;/*シード記録*/
						seedy[pptr] = py1;
					}
				}
			}
			if (cgdat[ip][py1] == bakcolor){
				pptr++;
				seedx[pptr] = ip;/*シード記録*/
				seedy[pptr] = py1;
			}
			py1++;
		}

		/*引いた線分の下のラインを走査*/

		if ( py1 < 199 ){
			py1++;
			for ( ip=topx ; ip<endx ; ip++ ){
				if (cgdat[ip][py1] == bakcolor){
					if (cgdat[ip+1][py1] != bakcolor){
						pptr++;
						seedx[pptr] = ip;/*シード記録*/
						seedy[pptr] = py1;
					}
				}
			}
			if (cgdat[ip][py1] == bakcolor){
				pptr++;
				seedx[pptr] = ip;/*シード記録*/
				seedy[pptr] = py1;
			}
		}
		topflg++;
		endflg = pptr;
	}
}


 どうか、皆様よろしくお願いします よししし