【问题标题】:how to rasterize rotated rectangle (in 2d by setpixel)如何光栅化旋转的矩形(在 2d 中通过 setpixel)
【发布时间】:2012-04-21 02:44:12
【问题描述】:

我有四个 2d 顶点 A B C D 的旋转矩形, 我需要在像素缓冲区中(有效地)光栅化/绘制它 用 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;

     }

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

【问题讨论】:

  • 你通常会从实现一个画线算法开始(例如,Bresenham's),然后调用它四次,矩形的每一行调用一次。谷歌搜索“布雷森汉姆算法”(或类似的东西)应该会出现 很多 的结果。
  • 我需要填充矩形 - 水平线光栅化会更快 - 就像我的方法一样 - 但我厌倦了调试这个
  • This question/answer 将帮助您完成 95-99% 的工作。
  • 用大量对setpixel 的调用填充一个矩形通常效率不高。
  • @grunge Fightr 好吧,你看到这个问题有一段时间不活跃了,你还需要更好的答案还是你已经做到了。如果您需要特定的代码,请用您需要的参数(颜色、纹理、...)评论我

标签: c algorithm 2d graph-algorithm rasterize


【解决方案1】:

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

  1. 将您的积分排序以匹配缠绕规则

    所以有行AB BC CD DA或反向

  2. 创建左右缓冲区

    地址是y-坐标,它是x-位置的数组,如果需要还有color,texture coordinates,...的数组。对于初学者:

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

    ys 是屏幕y-resolution

  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] &lt;= buf_x1[y] 正确,则水平线的绘制将折叠为单个for 循环

还有here简单的C++我的例子

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 2017-06-21
  • 2015-09-03
  • 1970-01-01
相关资源
最近更新 更多