#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;
}
}
どうか、皆様よろしくお願いします よししし