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

我有四个2d顶点ABCD旋转矩形,我需要栅格化/绘制(有效地)在pixelbufer setpixel(x,y,颜色)

怎么做?

我正在尝试一些代码

// convertilg abcd 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; } 

但它是最令人沮丧的(可怕的bug和最令人沮丧的),我真的很厌倦了这一整天昨天debugging,我需要find一些工作代码,而不是试图debugging这个

要填充你的矩形句柄它作为封闭的凸多边形(几乎相同的三angular形填充)

  1. 为了使您的积分符合缠绕规则

    所以有AB BC CD DA或倒行

  2. 创build左侧和右侧缓冲区

    地址是y -coordinate,它是一个x -positions数组,如果需要的话还有color,texture coordinates,...数组, color,texture coordinates,... 对于初学者:

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

    ys是屏幕y分辨率

  3. 实现任何画线algorithm

    而不是画到屏幕只是将像素的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)

    1. 将此线algorithm应用于多边形的所有边界线(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); 

清晰的图像(从我的低级计算机graphics学讲座中获取)

边界缓冲区创建

图片说明:

  • 垂直矩形表示边界缓冲区buf_x0[],buf_x1[]
  • 顺时针缠绕规则确保目标缓冲区。 如果它的编码比buf_x0[y] <= buf_x1[y]那么水平线的重叠绘制为单个for循环

这里也是这个简单的C ++示例