软光栅
不借助硬件资源实现光栅化的方式,叫做软光栅。
扫描转换
直线扫描转换算法
数值微分算法——Digital Differential Analyzer
一种直接从直线的微分方程生成直线的方法。通过给定直线的两端点坐标P0 (x0 ,y0 )和P1 (x1 ,y1 ),我们可以得到直线的微分方程:
令ε=1/max(|△x|,|△y|)
- 情况一 斜率绝对值小于1:ε=1/|△x|
- 情况二 斜率绝对值大于1:ε=1/|△y|
令ε=1/max(|△x|,|△y|) 使得ε△x或ε△y中会有一个变成单位步长。算法在最大位移方向上,每次总是走一步
DDA直线生成算法特点
在一个迭代算法中,如果每一步的x、y值是用前一步的值加上一个增量来获得的, 那么,这种算法就称为增量算法。因此,DDA算法是一个增量算法。
- 优点:DDA算法直观、易实现
- 缺点:有浮点数和浮点运算,效率不高
代码实现
#include<stdio.h>
#include<stdlib.h>
#include <graphics.h>
void DDAline(int x0, int y0, int x1, int y1) {
int dx, dy, eps1, k;
float x, y, xIncre, yIncre;
dx = x1 - x0;
dy = y1 - y0;
x = x0;
y = y0;
if(abs(dx) > abs(dy))
eps1 = abs(dx);
else
eps1 = abs(dy);
xIncre = (float)dx / (float)eps1;
yIncre = (float)dy / (float)eps1;
for (k = 0; k <= eps1; k++) {
putpixel((int)(x + 0.5), (int)(y + 0.5));//在对应坐标处输出像素点
x += xIncre;
y += yIncre;
}
}
bresenham算法
- 输入:直线两个端点的坐标P0 (x0 ,y0 )和P1 (x1 ,y1 )
- 输出:最佳逼近这条直线的像素点集
通过给定直线的两端点坐标P0 (x0 ,y0 )和P1 (x1 ,y1 ),可得到直线斜截式表示:y=kx+b
我们还可以写出它的隐式方程:
基本原理
假定0≤k≤1,x是最大位移方向。 M在Q的下方,取Pu;M在Q的上方,取Pd
直线隐式方程起作用
构造判别式
基本原理
通过中点不直线的位置关系引入误差项d,判断误差项的符号来选择候选点
改进的bresenham算法
基本原理
在0≤k≤1情况下改进的Bresenham算法:
- (1)输入直线的两端点P0 (x0 ,y0 )和P1 (x1 ,y1 )。
- (2)计算初始值△x、△y、e=-△x、x=x0、y=y0。
- (3)绘制点(x,y)。
- (4)e更新为e+2△y 判断e的符号 :若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2△x; 否则(x,y)更新为(x+1,y)。
- (5)当直线没有画完时,重复步骤3和4。否则结束。