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

2019-05-13 11:33发布

我有四个顶点的2D旋转矩形的ABCD,我需要光栅化/中pixelbufer与setpixel绘制它(有效)(X,Y,颜色)

怎么做?

我与一些代码试图像

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

     }

但它是最令人沮丧的(可怕的错误倾向和最令人沮丧的),我真的厌倦了这种调试运行昨天一整天的,我需要找也许一些工作代码,而不是试图调试这

Answer 1:

填充您矩形处理它作为封闭凸多边形(几乎相同三角形的填充)

  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;

哪个缓冲器是目的地取决于线路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)

    在此之后,缓冲区包含开始和结束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); 

为了清晰图像(从我的演讲采取低层次的计算机图形)

图片描述:

  • 垂直矩形表示边界缓冲器buf_x0[],buf_x1[]
  • 顺时针缠绕规则确保目标缓冲区。 如果其正确编码比buf_x0[y] <= buf_x1[y]以便绘制水平线的colapses单挑for

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



文章来源: how to rasterize rotated rectangle (in 2d by setpixel)