Output Primitives
点

线

数学上的直线是「连续」的,意味着在直线上可以找到无限多个点。我们可以在任意位置找到这个直线上的点。
但计算机屏幕是基于「栅格化」的,也就是说,它的显示内容是由很多小的矩形区域组成的,这些小区域就是像素。每个像素都有一个明确的位置和颜色,而不是连续的点,屏幕只能在「离散」的像素网格上显示图像。
因此,绘制一条直线时,关键是如何在这些像素上 “逼近” 理论中的连续直线。
DDA 算法 🌟

Digital Differential Analyzer
数字微分分析器,它的基本思想是利用直线的斜率来逐步计算直线上的每个像素的位置。
- 计算直线斜率:
- 计算增量:
- 决定绘制方向:
- 如果 ,即 ,则沿 方向绘制
- 如果 ,即 ,则沿 方向绘制
- 如果 ,即
(So, we can represent it as )
例题:线段的起点为 ,终点为 ,应用 DDA 算法绘制这条线段。


Bresenham 算法
用于在像素网格中绘制直线。与传统的浮点计算方法(如 DDA算法)不同,Bresenham 算法通过使用「整数运算」来避免浮点运算,提高了计算效率。
- 计算增量:
- 计算决定参数 (Decision Paramter):
- 也称为误差项 (Error Item)
- 决定绘制方向:
- 如果
- 如果
例题:线段的起点为 ,终点为 ,应用 Bresenham 算法绘制这条线段。
- …


中点算法
- 计算增量:
- 计算决定参数:
- 决定绘制方向:
- 如果
- 如果
例题:线段的起点为 ,终点为 ,应用 Mid-point 算法绘制这条线段。
- → Case 2 is satisfied
- …


多边形

填充区域

种子填充算法
Seed Fill Algorithm,选择一个起始点,称为“种子”,该点位于多边形的边界内。

可以进一步细分为两种算法:
洪水填充
Flood fill,使用单一颜色填充多边形的整个区域,填充过程通过互相连接的像素来完成。它类似于绘图程序中的“油漆桶”工具。
- 选择一个种子像素作为起点。
- 检查当前像素的颜色。如果是填充区域的颜色,则将该像素填充为指定颜色。
- 继续处理它的邻居像素(通常是上下左右四个方向,或包括对角线的八个方向)。
- 重复此过程,直到所有满足条件的像素都被填充。

边界填充
Boundary fill
- 选择一个种子像素作为起点。
- 检查当前像素的颜色。如果它既不是边界颜色也不是填充区域颜色,则将该像素填充为指定颜色。
- 继续处理该像素的邻居像素(通常是上下左右四个方向)。
- 重复此过程,直到遇到边界颜色。

扫描线算法
Scan Line Algorithm,通过扫描水平线来填充颜色,这些水平线与多边形的边界相交,并在交点之间填充颜色。
