简单高效的直线算法,不支持抗锯齿
假设坐标轴方向轴向右,轴向下,在和间绘制一条直线,,斜率 两点间水平距离为,垂直距离为
使用截距形式表示为
但是没有必要去用计算每一点的值,只需找到在在增加到某个值时,会使增加1
因此可以用来表示每增加1时,对的增加量
C++实现
void Line(int x0, int y0, int x1, int y1) {
int dx = x1 - x0;
int dy = y1 - y0;
float e = 0.0f;
float de = float(dy) / float(dx);
int y = y0;
for (int i = x0; i < x1; i++) {
setPixel(i, y, color);
e += de;
if (abs(e) >= 0.5f) {
y += 1;
e -= 1.0f;
}
}
}
Rust实现
fn line(x0: u32, y0: u32, x1: u32, y1: u32) {
let dx: u32 = x1 - x0;
let dy: u32 = y1 - y0;
let mut e: f32 = 0.0;
let de: f32 = dy as f32 / dx as f32;
let mut y = y0;
for i in x0..x1 {
setPixel(i, y, color);
e += de;
if e.abs() > 0.5 {
y += 1;
e -= 1.0;
}
}
}