37 lines
824 B
Go
37 lines
824 B
Go
package raster
|
|
|
|
// Circle plots a circle with center x, y and radius r.
|
|
// Limiting behavior:
|
|
// r < 0 plots no pixels.
|
|
// r = 0 plots a single pixel at x, y.
|
|
// r = 1 plots four pixels in a diamond shape around the center pixel at x, y.
|
|
func (b *Bitmap) Circle(x, y, r int, p Pixel) {
|
|
if r < 0 {
|
|
return
|
|
}
|
|
// Bresenham algorithm
|
|
x1, y1, err := -r, 0, 2-2*r
|
|
for {
|
|
b.SetPx(x-x1, y+y1, p)
|
|
b.SetPx(x-y1, y-x1, p)
|
|
b.SetPx(x+x1, y-y1, p)
|
|
b.SetPx(x+y1, y+x1, p)
|
|
r = err
|
|
if r > x1 {
|
|
x1++
|
|
err += x1*2 + 1
|
|
}
|
|
if r <= y1 {
|
|
y1++
|
|
err += y1*2 + 1
|
|
}
|
|
if x1 >= 0 {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
func (b *Bitmap) CircleRgb(x, y, r int, c Rgb) {
|
|
b.Circle(x, y, r, c.Pixel())
|
|
}
|