吴小林算法中的端点计算是做什么的?

如何解决吴小林算法中的端点计算是做什么的?

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 的情况的代码rfpart1-fpart,而 {{1} } 是小数部分。 fpart 是整数部分。

我只是不知道这个计算应该做什么,而且我在网上找不到任何解释。我可以看到 ipartyend 上方线的 y 坐标,xend 是起点 xend 所在像素的 x 坐标。为什么我们还要费心计算(x0,y0)?就好像我们将线延伸到最近的整数 x 坐标。

我意识到我们正在使用特定的强度为端点所在的像素以及它的正上方或下方的像素着色。我只是不明白这些强度的来源背后的逻辑。

解决方法

使用 Xiaolin Wu 算法(以及一般的亚像素渲染技术),我们假设屏幕是一个连续的几何平面,每个像素是该平面的 1x1 正方形区域。我们将像素的中心标识为具有整数坐标的点。

首先,我们找到线的所谓“长轴”,即线最长的轴。假设它是 x 轴。我们现在遍历该线穿过的每个 1 像素宽的列。对于每一列,我们找到位于该列中心的线上的点,即 x 轴是一个整数。我们想象有一个以该点为中心的 1x1 正方形。该正方形将完全填充该列的宽度,并将重叠两个不同的像素。我们根据正方形和像素之间重叠的面积为每个像素着色。

对于端点,我们做的事情略有不同:我们仍然绘制一个以线与柱中心线相交的地方为中心的正方形,但是我们在水平方向上将该正方形切掉线的端点。如下图所示。

enter image description here

这是四个像素的放大视图。黑色十字代表这些像素的中心,红线是我们要绘制的线。红色圆圈 (x0,y0) 是线的起点,线应从该点向右延伸。

您可以看到以红色十字为中心的灰色方块。每个像素将根据与这些正方形的重叠区域进行着色。但是,在左列中,我们在 x 坐标 x0 处截断了正方形。在浅灰色中,您可以看到整个正方形,但只有深灰色部分用于面积计算。可能还有其他方法可以处理端点,例如,我们可以将深灰色区域向上移动一点,使其垂直居中于 y 坐标 y0。据推测,它不会产生太大的明显差异,而且计算效率很高。

我使用维基百科伪代码中的变量名称对绘图进行了注释。

,

该算法在端点处是近似的。这是有道理的,因为精确计算将相当复杂(并且取决于端点的类型),因为结果几乎无法感知。重要的是沿线段的混叠。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?