计算机如何绘制一条直线?

6

Windows GDI有以下函数:

MoveTo();

LineTo();

它们接受绘制开始和结束的坐标。

但是,这些函数是如何实现的?(特别是LineTo)

它们是否需要计算点A和点B之间的所有点?

这条线是如何精确绘制的?

4个回答

7

是的,它们会计算A和B之间每个单独的点。

最常用的高效方法被称为Bresenham线算法

请注意,Windows LineTo不会绘制最后一个点。当线段相互绘制时,这可以防止端点被重复绘制。


2

没有看过Windows源代码的人无法深入回答这个问题......

但是Windows和其他软件一样:它需要一些算法来绘制直线......其中一个算法可以在这里看到:http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

移动操作(Moveto)“更容易”,因为它只是更新系统已知的当前坐标......


也许,看过Windows源代码的人也是StackOverflow的用户.. :) - DrStrangeLove
可能会有...但即使如此,我也很确定会有一份禁止分享他在源代码中看到的任何内容的保密协议(NDA) :-) - Yahia

1
它不需要计算A和B之间的所有点(这是无限的),而只需要计算A和B之间的离散像素。这通常是一种标准的线栅格化算法。请参见Wikipedia,了解 Bresenham's 线栅格化算法,这是标准教科书例子,通常也是更灵活的栅格化算法的基础。

0

我怀疑这里发生的事情不仅仅是(一种形式的)Bresenham算法,还有(可选的)反锯齿。请参阅this article,了解可能实现的算法(Xiaolin Wu的线性算法)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接