【发布时间】:2011-10-16 04:57:15
【问题描述】:
Windows GDI 具有以下功能:
MoveTo();
LineTo();
它们接受开始绘制和停止绘制的坐标。
但是这些功能是如何实现的呢? (尤其是 LineTo)
他们需要计算A点和B点之间的所有点吗?
这条线到底是怎么画的??
【问题讨论】:
Windows GDI 具有以下功能:
MoveTo();
LineTo();
它们接受开始绘制和停止绘制的坐标。
但是这些功能是如何实现的呢? (尤其是 LineTo)
他们需要计算A点和B点之间的所有点吗?
这条线到底是怎么画的??
【问题讨论】:
是的,他们计算 A 和 B 之间的每个单独的点。
最常见的有效方式是Bresenham's Line Algorithm。
请注意,Windows LineTo 不会绘制最后一个点。当线段一个接一个地绘制时,这样可以防止端点被重复绘制。
【讨论】:
没有看过 Windows 源代码的人可以深入回答这个问题... 但是 Windows 就像任何其他软件一样:它需要一些算法来画一条线......你可以在这里看到一个这样的算法http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
Moveto 更“容易”,因为它只是更新系统知道的当前坐标...
【讨论】:
它不需要计算 A 和 B 之间的所有点(它们是无限的),而只需要计算 A 和 B 之间的离散像素。这通常是标准的线光栅化算法。请参阅Wikipedia 了解 Bresenham 的线光栅化算法,这是标准教科书示例,通常是更灵活的光栅化算法的基础。
【讨论】:
我怀疑除了(一种)Bresenham 之外还有更多事情要做,因为还有(可选的)抗锯齿功能。请参阅this article 了解可能实现的算法(吴小林的线算法)
【讨论】: