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

gru*_*htr 2 c algorithm 2d graph-algorithm rasterize

我有旋转矩形的四个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;

     }
Run Code Online (Sandbox Code Playgroud)

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

Spe*_*tre 6

要填充矩形,请将其作为闭合凸多边形(几乎与三角形填充相同)

  1. 命令你的点符合缠绕规则

    所以有AB BC CD DA或反向线

  2. 创建左右缓冲区

    地址是y-coordinate,它是一个-positions数组,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==0那时buf_x0[y]=min(x)buf_x1[y]=max(x)

    1. 将此线算法应用于多边形的所有边界线(AB,BC,CD,DA)

    在此之后,缓冲区包含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);
      
      Run Code Online (Sandbox Code Playgroud)

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

边界缓冲区创建

图片描述:

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

此外在这里简单的C++对我的这个例子