bool Segment(Canvas &canvas, int x, int y, unsigned radius, Angle start, Angle end, bool horizon) { // dont draw if out of view if (!IsCircleVisible(canvas, x, y, radius)) return false; const int istart = NATIVE_TO_INT(start.Native()); const int iend = NATIVE_TO_INT(end.Native()); unsigned npoly = 0; RasterPoint pt[67]; // add center point if (!horizon) { pt[0].x = x; pt[0].y = y; npoly = 1; } segment_poly(pt, x, y, radius, istart, iend, npoly); assert(npoly <= ARRAY_SIZE(pt)); if (npoly) canvas.DrawTriangleFan(pt, npoly); return true; }
bool KeyHole(Canvas &canvas, int x, int y, unsigned radius, Angle start, Angle end, unsigned inner_radius) { // dont draw if out of view if (!IsCircleVisible(canvas, x, y, radius)) return false; const int istart = NATIVE_TO_INT(start.Native()); const int iend = NATIVE_TO_INT(end.Native()); unsigned npoly = 0; RasterPoint pt[66*2]; segment_poly(pt, x, y, radius, istart, iend, npoly); segment_poly(pt, x, y, inner_radius, iend, istart, npoly); assert(npoly < ARRAY_SIZE(pt)); if (npoly) canvas.DrawPolygon(pt, npoly); return true; }
bool Annulus(Canvas &canvas, PixelPoint center, unsigned radius, Angle start, Angle end, unsigned inner_radius) { // dont draw if out of view if (!IsCircleVisible(canvas, center, radius)) return false; const int istart = NATIVE_TO_INT(start.Native()); const int iend = NATIVE_TO_INT(end.Native()); unsigned npoly = 0; BulkPixelPoint pt[66*2]; segment_poly(pt, center, radius, istart, iend, npoly); segment_poly(pt, center, inner_radius, iend, istart, npoly, false); assert(npoly <= ARRAY_SIZE(pt)); if (npoly) canvas.DrawPolygon(pt, npoly); return true; }