package main import ( "math" ) // Draw a line using dumb func LineDumb(fb *Framebuffer, color uint, x0 uint, y0 uint, x1 uint, y1 uint) { var t float32 for t = 0; t < 1; t += 0.01 { // Very simple interpolation between x and y x := x0 + uint(float32(x1-x0)*t) y := y0 + uint(float32(y1-y0)*t) fb.Set(x, y, color) } } func LineDumb2(fb *Framebuffer, color uint, x0 uint, y0 uint, x1 uint, y1 uint) { for x := x0; x < x1; x++ { // For each pixel across, compute how far across we are and interpolate y t := float32(x-x0) / float32(x1-x0) y := uint(float32(y0)*(1-t) + float32(y1)*t) fb.Set(x, y, color) } } func LineDumb3(fb *Framebuffer, color uint, x0 int, y0 int, x1 int, y1 int) { steep := false // This one makes sure that going pixel by pixel will not make holes in the // other direction by always moving in the less steep direction. if math.Abs(float64(x0-x1)) < math.Abs(float64(y0-y1)) { x0, y0 = y0, x0 x1, y1 = y1, x1 steep = true } // Don't let lines be invisible, always go left to right if x0 > x1 { // need to be left to right x0, x1 = x1, x0 y0, y1 = y1, y0 // Why are we swapping these? I guess because we're swapping the points... } // Same as dumb2, going across pixel by pixel. But "x" here might actually be y // because of the inverted direction for x := x0; x <= x1; x++ { t := float32(x-x0) / float32(x1-x0) y := uint(float32(y0)*(1-t) + float32(y1)*t) if steep { fb.Set(y, uint(x), color) } else { fb.Set(uint(x), y, color) } } }