Bresenham直线算法

133 阅读1分钟

简单高效的直线算法,不支持抗锯齿

假设坐标轴方向xx轴向右,yy轴向下,在(x0,y0)(x_0,y_0)(x1,y1)(x_1,y_1)间绘制一条直线,x1x0>y1y0x_1 - x_0>y_1-y_0,斜率0<k<10<k<1 两点间水平距离为x1x0x_1 - x_0,垂直距离为y1y0y_1-y_0

使用截距形式表示为

y=y1y0x1x0(xx0)+y0y=\frac{y_1-y_0}{x_1-x_0}(x - x_0) + y_0

但是没有必要去用xx计算每一点的yy值,只需找到在xx在增加到某个值时,会使yy增加1

因此可以用y1y0x1x0\frac{y_1-y_0}{x_1-x_0}来表示xx每增加1时,对yy的增加量

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;
    }
	}
}