前言:
学习笔记,随时更新。如有谬误,欢迎指正。
说明:
- 红色字体为较为重要部分。
- 绿色字体为个人理解部分。
原文链接:https://learn.microsoft.com/en-us/windows/win32/gdi/lines-and-curves
9 直线和曲线
1.直线和曲线用于在光栅设备上绘制图形输出。
9.1 关于直线和曲线
- 许多类型的应用程序使用直线和曲线在光栅设备上绘制图形输出。计算机辅助设计( CAD )和绘图应用程序使用直线和曲线来勾画对象的轮廓、指定对象的中心、对象的尺寸等。电子表格应用程序使用直线和曲线来绘制网格、图表和图形。文字处理应用程序使用行在一页文本上创建规则和边框。
9.1.1 直线
-
线是光栅显示器上的一组高亮像素(或打印页面上的一组点),由两点标识:起点和终点。位于起始点的像素始终包含在该线中,而位于结束点的像素始终被排除在外。(这种界线有时被称为包容性-排他性。)
-
当应用程序调用其中一个绘制函数时, GDI 或者在某些情况下是设备驱动程序,决定应该突出显示哪些像素。 GDI 是一个动态链接库( DLL ),它处理来自应用程序的图形函数调用,并将这些调用传递给设备驱动程序。设备驱动程序是一个 DLL ,它接收来自 GDI 的输入,将输入转换为设备命令,并将这些命令传递给适当的设备。 GDI 使用数字差分分析仪( DDA )来确定定义一条线的像素集。 DDA 通过检查线上的每个点并识别显示面(或打印页面上的点)上与这些点对应的那些像素来确定像素集。
-
最简单和最常见的 DDA 是 Bresenham DDA ,或增量 DDA 。该算法的修改版本在 Windows 中绘制线条。增量 DDA 以其简单性而著称,但也以其不准确性而著称。因为它四舍五入到最接近的整数值,所以它有时不能表示应用程序请求的原始行。 GDI 使用的 DDA 不会四舍五入到最接近的整数。因此,这个新的 DDA 产生的输出有时在外观上更接近应用程序所请求的原始行。(如果应用程序需要使用新 DDA 无法实现的行输出,它可以通过调用 LineDDA 函数并提供专用 DDA ( LineDDAProc ) 来绘制自己的线条。 但是, LineDDA 函数的线条绘制速度比线条绘制函数慢得多。如果速度是主要考虑因素,请不要在应用程序中使用此函数。)
-
应用程序可以使用新的 DDA 来绘制单线和多个连接的线段。应用程序可以通过调用 LineTo 函数绘制一条线。此函数绘制一条从当前位置直至(但不包括)指定终点的线。应用程序可以通过调用 Polyline 函数绘制一系列相连的线段,并提供指定每个线段终点的点数组。应用程序可以通过调用 PolyPolyline 函数来绘制多个不相连的串联线段,并提供所需的端点。
9.1.2 曲线
-
规则曲线是栅格显示器上的一组高亮像素(或打印页面上的点),它们定义了圆锥截面的周长(或周长的一部分)。不规则曲线是一组像素,它们定义了一条不适合圆锥截面周长的曲线。终点被排除在曲线之外,就像它被排除在直线之外一样。
-
当应用程序调用其中一个曲线绘制函数时, GDI 将曲线分解为许多极小的离散线段。在确定每个线段的端点(起点和终点)之后, GDI 通过应用其 DDA 确定哪些像素(或点)定义每条线。
-
应用程序可以通过调用 Arc 函数绘制椭圆或椭圆的一部分。当调用 Arc 函数时,应用程序指定边界矩形和径向的坐标。
当绘制另一个对象的弧线时,应用程序可以调用 SetArcDirection 和 GetArcDirection 函数来控制绘制对象的方向(顺时针或逆时针)。绘制圆弧和其他对象的默认方向是逆时针方向。
-
除了绘制椭圆或椭圆的部分外,应用程序还可以绘制称为贝塞尔曲线的不规则曲线。贝塞尔曲线是一种不规则曲线,其曲率由四个控制点( p1 、 p2 、 p3 和 p4 )定义。控制点 p1 和 p4 定义曲线的起点和终点,控制点 p2 和 p3 通过标记曲线方向反转的点来定义曲线的形状。应用程序可以通过调用 PolyBezier 函数来绘制不规则曲线,并提供适当的控制点。
9.1.3 混合线条和曲线
-
除了绘制直线或曲线之外,应用程序还可以通过调用单个函数来绘制直线和曲线输出的组合。例如,应用程序可以通过调用 AngleArc 函数来绘制饼状图的轮廓。
AngleArc 函数沿着圆的周长绘制一个圆弧,并绘制一条连接圆弧起点和圆心的直线。除了使用 AngleArc 函数,应用程序还可以通过使用 PolyDraw 函数组合直线和不规则曲线输出。
9.1.4 直线和曲线属性
-
DC 包含影响直线和曲线输出的属性。直线和曲线属性包括当前位置、画刷样式、画刷颜色、笔样式、笔颜色、变换等。
-
任何 DC 的默认当前位置位于逻辑(或世界)空间中的点( 0,0 )。可以通过调用 MoveToEx 函数并传递一组新坐标来将这些坐标设置为新位置。(有两组直线和曲线绘制函数。第一组保留 DC 中的当前位置,第二组改变该位置。可以通过检查函数名来识别改变当前位置的函数。如果函数名以介词“ To ”结尾,则该函数将当前位置设置为绘制的最后一条线( LineTo , ArcTo , PolylineTo 或 PolyBezierTo )的终点。如果函数名不以该介词结尾,则保持当前位置不变( Arc 、 Polyline 或 PolyBezier )。)
-
默认的画刷是纯白色画刷。应用程序可以通过调用 CreateBrushIndirect 函数来创建一个新的画刷。创建画刷之后,应用程序可以通过调用 SelectObject 函数将其选择到 DC 中。 Windows 提供了一套完整的函数来创建、选择和更改应用程序 DC 中的画刷。有关这些函数和画刷的更多信息,请参见画刷。
-
默认笔是一支装饰性的纯黑色笔,宽度为 1 像素。应用程序可以使用 ExtCreatePen 函数创建笔。创建笔之后,应用程序可以通过调用 SelectObject 函数将其选择到 DC 中。 Windows 提供了一套完整的函数来创建、选择和更改应用程序 DC 中的笔。有关这些函数和笔的详细信息,请参见笔。
-
默认的变换是单位变换(由单位矩阵指定)。应用程序可以通过调用 SetWorldTransform 函数来指定一个新的变换。 Windows 提供了一套完整的函数,通过改变直线和曲线的宽度、位置和总体外观来变换直线和曲线。有关这些函数的详细信息,请参见坐标空间和变换。
9.2 使用直线和曲线
9.2.1 绘制标记
- 有关详细信息,请参阅绘制标记。
9.2.2 绘制饼图
- 有关详细信息,请参阅绘制饼图。
9.3 线条和曲线参考
9.3.1 线条和曲线函数
- 有关详细信息,请参阅线条和曲线函数。