3

回転した長方形の4つの2D頂点ABCDがあります。これを、setpixel(x、y、color)を使用してpixelbuferで(効率的に)ラスタライズ/描画する必要があります。

どうやってするの?

私は次のようなコードを試していました

    // convertilg a b c d do up down left right, 
    // calculating some dx_left dx_right on y--
    // etc (frustrating on special cases when there are 2 up_y vertices in same line etc)


    for(;;)
    {

     drawhorizontalline(y, xstart, xend, color);

     if(y==downy) break;

     y--;
     xstart+=dxstart;
     xend+=dxend;

     if(y==lefty)  dxstart = dxright;
     if(y==righty) dxend = dxleft;

     }

しかし、それは最もイライラします(ひどくバグが発生しやすく、最もイライラします)私は昨日これを一日中デバッグするのに本当にうんざりしていて、これをデバッグしようとするのではなく、おそらくいくつかの動作するコードを見つける必要があります

4

1 に答える 1

8

長方形を塗りつぶすには、閉じた凸多角形として処理します(三角形の塗りつぶしとほぼ同じです)

  1. ワインディング ルールに合わせてポイントを注文する

    AB BC CD DAまたは逆の行があります

  2. 左右のバッファを作成

    アドレスは座標であり、位置yの配列でxあり、必要に応じての配列でもありcolor,texture coordinates,...ます。手始めに:

    `int buf_x0[ys],buf_x1[ys];`
    

    ys画面解像度はどこyですか

  3. ドローラインアルゴリズムを実装する

    ただし、画面に描画する代わりにx、ピクセルの座標をバッファに保存するだけです。

    • 代わりに: setpixel(x,y,color);do: buf_x?[y]=x;.

    どのバッファが宛先かは、行のY方向によって異なります

    • もしそうならdy<0埋めるbuff_x0
    • もしそうならdy>0埋めるbuff_x1
    • もしdy==0buf_x0[y]=min(x)そしてbuf_x1[y]=max(x)

    ラスタライズする前に、ラインのエンドポイントを x 座標でソートして、反転したエンドポイント ラインに対して生成された異なるピクセルによって引き起こされるメッシュの継ぎ目/穴を避ける必要があることに注意してください。

  4. このライン アルゴリズムをポリゴンのすべての境界線 (AB、BC、CD、DA) に適用します。

    この後、バッファにはx水平線の開始位置と終了位置が含まれます

  5. 画面上の四角形を埋める

    for (y=min(Ay,By,Cy,Dy);y<=max(Ay,By,Cy,Dy);y++)
     draw_horizontal_line(y,buf_x0[y],buf_x1[y],color);
    

わかりやすくするための画像 (低レベルのコンピューター グラフィックスに関する私の講義から取得)

境界バッファーの作成

画像の説明:

  • 垂直の長方形は境界バッファーを表しますbuf_x0[],buf_x1[]
  • 時計回りのワインディング ルールにより、デスティネーション バッファが保証されます。適切にコーディングされている場合buf_x0[y] <= buf_x1[y]、水平線の描画は単一のforループに折りたたまれます

また、このための私の簡単なC++の例もここにあります

于 2013-09-29T12:34:33.227 に答える