我正在使用Microchip dsPIC33FJ128GP802。它是一个基于DSP的小型微控制器,它没有太多的功率(每秒4000万条指令)。我正在寻找一种渲染凸(即简单)多边形的方法。我只处理2D形状,整数数学,以及设置或清除像素(即每像素1位)。我已经有用于绘制快速水平和垂直线的例程(在88个周期内写入多达16个像素),所以我想使用扫描线算法。
然而,我发现的所有算法似乎都依赖于除法(在此处理器上需要18个周期)和浮点数学(在软件中模拟,所以非常慢;它也占用了大量的ROM) ,或者假设我有大量的内存。我只剩下2K,~14K用于我16K的图形RAM。那么有没有人知道任何好的嵌入式机器算法他们可以用简单的C或伪代码实现指向我,我可以在汇编中实现它?最好是在网上,我不住在附近有很多编程书籍的好书店附近。
感谢。 :)
编辑:澄清,这是我正在寻找的多边形填充算法。我可以使用Bresenham的线条绘制算法实现多边形轮廓算法(正如Marc B建议的那样。)
编辑#2:我想让每个人都知道我在Python中获得了一个基本的算法。这是代码的链接。公共域代码。答案 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-P3
,P1-P3-P4
和P1-P4-P5
。通常,具有N
边的凸多边形将分解为N-2
个三角形。
答案 4 :(得分:1)
我首先将多边形转换为三角形集合并渲染它们,因为三角形很容易通过扫描线渲染。虽然有一些细节。
基本上,draw-triangle
子程序将被赋予一个原始三角形并继续:
if
测试,以检测斜率是否发生变化。