#99 Article 176 Posted at 1992/02/18 04:51:27 by Mai (MAP2260) []
Subject: Re:*7 領域ペイント /173 ... /167 /164
うーんと、とりあえず左右に境界を探しながら塗っていきつつ、塗る点の上下を
チェック、塗る色のあらたな部分が出てきたらその位置をスタックに積む・・・のが
一番簡単だと思います。
Pascal風に記述すると、
Procedure Paint(X,Y:integer);
var fu,fd:boolean;
begin
while iskyoukai(X-1,Y)=false do dec(X);
fu:=false;
fd:=false;
push(X,Y);
repeat;
pop(X,Y);
repeat;
putpixel(x,y);
if (ipaint(x,y-1)=true)) and (fu=false) then begin
fu:=true;
push(x,y-1);
end;
if (ispaint(x,y+1)=true) and (fd=false) then begin
fd:=true;
push (x,y+1);
end;
if (iskyoukai(x,y-1)=true) and (fu=true) then begin
fu:=false;
end;
if (iskyoukai(x,y+1)=true) and (fd=true) then begin
fd:=false;
end;
inc(x);
until iskyoukai(x,y);
until stack_empty;
end.
ってな感じでしょうか?
単色ペイントで、そこを塗らない場合は境界だとかいう場合は判断がもっと簡単に
なりますね。
あと、うまく再起を使うともっとエレガントになるかも。
まあ、最近のマシンはパワーあるからこんなアルゴリズムでも実用になるでしょうね。
昔は、(といっても私にとってはこのあいだ(^_^;))ものすごく速いペイント
アルゴリズムがその手の雑誌によく載ってましたけど・・・
Mai