3

我有一个旋转矩形的四个二维顶点 ABCD,我需要使用 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;

     }

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

4

1 回答 1

8

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

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

    请注意,您必须在光栅化之前按 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 回答