线条

线条是光栅显示器上一组突出显示的像素 (或打印页上的一组点,) 由两个点标识:起点和终点。 位于起点的像素始终包含在行中,并且始终排除位于终点的像素。 (这种行有时称为 inclusive-exclusive.)

当应用程序调用其中一个线条绘制函数时,图形设备接口 (GDI) (在某些情况下是设备驱动程序)确定应突出显示的像素。 GDI 是一个动态链接库, (DLL) 处理来自应用程序的图形函数调用并将这些调用传递给设备驱动程序。 设备驱动程序是一个 DLL,它接收来自 GDI 的输入,将输入转换为设备命令,并将这些命令传递给相应的设备。 GDI 使用数字差分分析器 (DDA) 来确定定义线条的像素集。 DDA 通过检查线条上的每个点并识别显示图面上的像素 (或打印页上的点,) 与这些点相对应,来确定像素集。 下图显示了一条线、起点、终点以及使用简单 DDA 突出显示的像素。

图中显示了像素网格、起始点和终点、线条以及沿线像素的底纹

最简单且最常见的 DDA 是 Bresenham(增量)DDA。 此算法的修改版本在 Windows 中绘制线条。 增量 DDA 因其简单性而得到注意到,但也因其不准确而得到注意到。 因为它舍入到最接近的整数值,因此它有时无法表示应用程序请求的原始行。 GDI 使用的 DDA 不会舍入到最接近的整数。 因此,此新 DDA 生成的输出有时在外观上更接近于应用程序请求的原始行。

注意

如果应用程序需要使用新 DDA 无法实现的行输出,它可以通过调用 LineDDA 函数并提供专用 DDA (LineDDAProc) 来绘制自己的线条。 但是, LineDDA 函数的线条绘制速度比线条绘制函数慢得多。 如果速度是主要考虑因素,请不要在应用程序中使用此函数。

 

应用程序可以使用新的 DDA 绘制单条线和多个连接的线段。 应用程序可以通过调用 LineTo 函数绘制单行。 此函数绘制一条从当前位置到指定终点(但不包括)的线条。 应用程序可以通过调用 Polyline 函数来绘制一系列连接的线段,并提供指定每个线段的终点的点数组。 应用程序可以通过调用 PolyPolyline 函数来绘制多个不连续的连接线段系列,并提供所需的终点。

下图显示了通过调用 LineToPolylinePolyPolyline 函数创建的行输出。

显示一条直线、一个“l”形框和两个三维形状的插图