如何光栅化旋转的矩形(在2d内由setpixel)

时间:2012-04-08 07:27:01

标签: c algorithm 2d graph-algorithm rasterize

我有一个旋转矩形的四个2d顶点A B C D, 我需要在pixelbufer中栅格化/绘制它(有效) 使用setpixel(x,y,color)

怎么做?

我正在尝试使用像

这样的代码
    // 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;

     }

但是最令人沮丧的是(非常容易出错并且最令人沮丧) 我真的厌倦了昨天整整这一天,我需要找到 也许是一些工作代码而不是试图调试这个

1 个答案:

答案 0 :(得分:5)

要将矩形处理填充为闭合凸多边形(几乎与三角形填充相同)

  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);执行:buf_x?[y]=x;
  4. 目的地是哪个缓冲区取决于行Y方向

    • 如果dy<0则填写buff_x0
    • 如果dy>0则填写buff_x1
    • 如果dy==0buf_x0[y]=min(x)buf_x1[y]=max(x)

      1. 将此线算法应用于多边形的所有边线(AB,BC,CD,DA)
      2. 之后缓冲区包含开始和结束x - 水平线的位置

        1. 在屏幕上填充矩形

          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);
          

    图像清晰(取自我在低级计算机图形学上的讲座)

    border buffer creation

    图片说明:

    • 垂直矩形表示边框缓冲区buf_x0[],buf_x1[]
    • 顺时针缠绕规则可确保目标缓冲区。如果其编码正确而不是buf_x0[y] <= buf_x1[y],那么水平线的绘制会缩小到单个for循环

    here简单的 C ++ 示例