implement circle_outline function

This commit is contained in:
2021-12-30 16:25:53 +01:00
parent 0f22b1efb9
commit bf7604d385
2 changed files with 52 additions and 0 deletions

Binary file not shown.

View File

@@ -136,6 +136,58 @@ export fn circle(cx: f32, cy: f32, radius: f32, col: i32) {
}
}
export fn circle_outline(cx: f32, cy: f32, radius: f32, col: i32) {
let prev_w: f32;
let y = clamp(nearest(cy - radius) as i32, -1, 241);
let maxY = clamp(nearest(cy + radius) as i32, -1, 241);
loop lines {
let lazy dy = y as f32 - cy + 0.5;
let inline q = radius * radius - dy * dy;
let w = sqrt(max(0 as f32, q));
let xlp = nearest(cx - prev_w) as i32;
let xl = nearest(cx - w) as i32;
let xrp = nearest(cx + prev_w) as i32;
let xr = nearest(cx + w) as i32;
if w >= prev_w {
if xl < xlp {
hline(xl, xlp, y, col);
} else {
if xl < xr {
setPixel(xl, y, col);
}
}
if xr > xrp {
hline(xrp, xr, y, col);
} else {
if xl < xr {
setPixel(xr - 1, y, col);
}
}
} else {
if xl > xlp {
hline(xlp, xl, y - 1, col);
} else {
if xlp < xrp {
setPixel(xlp, y - 1, col);
}
}
if xr < xrp {
hline(xr, xrp, y - 1, col);
} else {
if xlp < xrp {
setPixel(xrp - 1, y - 1, col);
}
}
}
y = y + 1;
prev_w = w;
branch_if y <= maxY: lines;
}
}
export fn line(x1: f32, y1: f32, x2: f32, y2: f32, col: i32) {
let swapTmp: f32;
if x1 > x2 {