#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