如何解决吴小林算法中的端点计算是做什么的?
Xiaolin Wu algorithm 在两点之间绘制一条抗锯齿线。这些点可以位于子像素处,即非整数坐标。我假设读者熟悉该算法并且只回忆重要的特征。我们遍历线的主要(较长)轴,假设它是 x 轴,基本上逐列进行。在每一列中,我们为两个像素着色。计算等价于:将一个 1x1 的正方形放在一条线上,在其 x 坐标是给定像素列的中心的点上。让我们称它为 S。如果我们将每个像素视为平面中的一个 1x1 正方形,我们现在计算 S 与其跨越的两个像素中的每一个之间的相交面积,并将这些面积用作为每个像素着色的强度.
这很好也很清楚,但是端点的计算是怎么回事?由于端点可能位于非整数位置,因此必须将它们视为特殊情况。这是链接的维基百科文章中用于处理第一个端点 x0,y0 的伪代码:
// handle first endpoint
xend := round(x0)
yend := y0 + gradient * (xend - x0)
xgap := rfpart(x0 + 0.5)
xpxl1 := xend // this will be used in the main loop
ypxl1 := ipart(yend)
plot(ypxl1,xpxl1,rfpart(yend) * xgap)
plot(ypxl1+1,fpart(yend) * xgap)
我编辑掉了 if (steep)
条件,所以这是线的斜率小于 1 的情况的代码。rfpart
是 1-fpart
,而 {{1} } 是小数部分。 fpart
是整数部分。
我只是不知道这个计算应该做什么,而且我在网上找不到任何解释。我可以看到 ipart
是 yend
上方线的 y 坐标,xend
是起点 xend
所在像素的 x 坐标。为什么我们还要费心计算(x0,y0)
?就好像我们将线延伸到最近的整数 x 坐标。
我意识到我们正在使用特定的强度为端点所在的像素以及它的正上方或下方的像素着色。我只是不明白这些强度的来源背后的逻辑。
解决方法
使用 Xiaolin Wu 算法(以及一般的亚像素渲染技术),我们假设屏幕是一个连续的几何平面,每个像素是该平面的 1x1 正方形区域。我们将像素的中心标识为具有整数坐标的点。
首先,我们找到线的所谓“长轴”,即线最长的轴。假设它是 x 轴。我们现在遍历该线穿过的每个 1 像素宽的列。对于每一列,我们找到位于该列中心的线上的点,即 x 轴是一个整数。我们想象有一个以该点为中心的 1x1 正方形。该正方形将完全填充该列的宽度,并将重叠两个不同的像素。我们根据正方形和像素之间重叠的面积为每个像素着色。
对于端点,我们做的事情略有不同:我们仍然绘制一个以线与柱中心线相交的地方为中心的正方形,但是我们在水平方向上将该正方形切掉线的端点。如下图所示。
这是四个像素的放大视图。黑色十字代表这些像素的中心,红线是我们要绘制的线。红色圆圈 (x0,y0)
是线的起点,线应从该点向右延伸。
您可以看到以红色十字为中心的灰色方块。每个像素将根据与这些正方形的重叠区域进行着色。但是,在左列中,我们在 x 坐标 x0
处截断了正方形。在浅灰色中,您可以看到整个正方形,但只有深灰色部分用于面积计算。可能还有其他方法可以处理端点,例如,我们可以将深灰色区域向上移动一点,使其垂直居中于 y 坐标 y0
。据推测,它不会产生太大的明显差异,而且计算效率很高。
我使用维基百科伪代码中的变量名称对绘图进行了注释。
,该算法在端点处是近似的。这是有道理的,因为精确计算将相当复杂(并且取决于端点的类型),因为结果几乎无法感知。重要的是沿线段的混叠。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。