寻找快速多边形渲染算法

时间:2010-08-09 23:24:07

标签: graphics assembly embedded polygon

我正在使用Microchip dsPIC33FJ128GP802。它是一个基于DSP的小型微控制器,它没有太多的功率(每秒4000万条指令)。我正在寻找一种渲染凸(即简单)多边形的方法。我只处理2D形状,整数数学,以及设置或清除像素(即每像素1位)。我已经有用于绘制快速水平和垂直线的例程(在88个周期内写入多达16个像素),所以我想使用扫描线算法。

然而,我发现的所有算法似乎都依赖于除法(在此处理器上需要18个周期)和浮点数学(在软件中模拟,所以非常慢;它也占用了大量的ROM) ,或者假设我有大量的内存。我只剩下2K,~14K用于我16K的图形RAM。那么有没有人知道任何好的嵌入式机器算法他们可以用简单的C或伪代码实现指向我,我可以在汇编中实现它?最好是在网上,我不住在附近有很多编程书籍的好书店附近。

感谢。 :)

编辑:澄清,这是我正在寻找的多边形填充算法。我可以使用Bresenham的线条绘制算法实现多边形轮廓算法(正如Marc B建议的那样。)

编辑#2:我想让每个人都知道我在Python中获得了一个基本的算法。这是代码的链接。公共域代码。

http://dl.dropbox.com/u/1134084/bresenham_demos.py

5 个答案:

答案 0 :(得分:6)

Bresenham's线算法怎么样?在一些设置之后,它是纯整数数学,并且可以通过沿多边形边缘的起始点的简单迭代来适应绘制多边形。

评论后续:

我会尝试用ASCII绘制它,但它可能看起来像crud。 Bresenham可用于通过选择起始边缘绘制填充多边形,并在平行于该点的画布上迭代移动bresenham线。

假设你有这样的观点:

*(1)
                      *(3)

    *(2)         
                 *(4)

这些以左右排序优先级编号,因此您选择最左侧的起点(1)并决定是要垂直(开始1,2)还是水平(1,3)。这可能取决于你的DSP如何显示它,但让我们选择垂直。

所以......你用1-2线作为你的起始线。您可以使用第1-3和第2-4行作为起点/终点来计算填充线的起点。开始每个人的bresenham计算,并在这两个点之间绘制另一个Bresenham。有点像:

1.1 -> 2.1, then 1.2 -> 2.2, then 1.3 -> 2.3
等等......直到你到达其中任何一行的末尾。在这种情况下,那就是当较低的起点达到(4)时。此时,你开始迭代4,3线,直到你用两个起点到达第3点,然后你就完成了。

*-------
 \\\\\\\\              *
  \\\\\\\\ 
   *-----\\         
         -------  *

破折号是您沿1-3和2-4计算的起点,斜线是填充线。

当然,这只有在点被正确排序并且你有一个凸多边形时才有效。如果它是凹的,你必须非常小心,不要让你的填充线越过边界,或做一些预处理,并将原始的poly细分为两个或更多凸的。

答案 1 :(得分:3)

托马斯,如果您有可用的Bresenham线条绘制算法,则将其用作进一步增强的基础:将多边形划分为子多边形,并使用水平切割线穿过每个顶点。然后,使用Bresenham开始跟踪这些子多边形中的每一个的左侧和右侧。这样,您就可以在多边形中拥有每条扫描线的2个端点。

答案 2 :(得分:3)

您可能需要查看Dobbs博士关于多边形填充/栅格/等的Michael Abrash's articles。它使用定点数学

答案 3 :(得分:1)

将问题分解为两部分可能更容易。首先,找到/写入绘制并填充三角形的算法。其次,编写一个算法,将任意多边形分解成三角形(使用不同的顶点组合)。

要绘制/填充三角形,请使用Bresenham的线算法同时在点0和1之间以及1到2之间绘制一条线。对于每个输入点x,绘制像素,如果它等于或在两条线产生的y点之间。当您到达一个端点时,继续使用未完成的一侧和尚未使用的一侧。

修改 要将凸多边形分成三角形,请按顺序排列点并调用它们P1, P2, ... PN。让P1成为您的“根”点,并使用该点和相邻点的组合构建三角形。例如,五边形会产生三个三角形P1-P2-P3P1-P3-P4P1-P4-P5。通常,具有N边的凸多边形将分解为N-2个三角形。

答案 4 :(得分:1)

我首先将多边形转换为三角形集合并渲染它们,因为三角形很容易通过扫描线渲染。虽然有一些细节。

基本上,draw-triangle子程序将被赋予一个原始三角形并继续:

  1. 拒绝退化三角形(三个顶点中的两个重叠)。
  2. 在Y中对顶点进行排序(因为只有三个可以对排序逻辑进行硬编码)。
  3. 现在,在这一点上你应该知道会有三种三角形:一种是平顶,一种是平底,一般是三角形。您希望通过将每个平面类型拆分为一个来处理一般三角形。这是因为您不希望每条扫描线都进行if测试,以检测斜率是否发生变化。
  4. 要渲染一个平面三角形,您可以并行运行两个Bresenham算法来迭代包含边缘的像素,并使用它们给出的点作为每个水平扫描线的端点。