开发者

circle drawing algorithm for n-pixel border

开发者 https://www.devze.com 2023-04-03 20:07 出处:网络
I know the Bresenham and related algorithms, and I found a good algorithm to draw a circle with a 1-pixel wide border. Is there any \'standard\' algorithm to draw a circle with an n-pixel wide border,

I know the Bresenham and related algorithms, and I found a good algorithm to draw a circle with a 1-pixel wide border. Is there any 'standard' algorithm to draw a circle with an n-pixel wide border, without restoring to drawing n circles?

开发者_StackOverflow中文版

Drawing the pixel and n2 surrounding pixels might be a solution, but it draws many more pixels than needed.

I am writing a graphics library for an embedded system, so I am not looking for a way to do this using an existing library, although a library that does this function and is open source might be a lead.


Compute the points for a single octant for both radii at the same time and simultaneously replicate it eight ways, which is how Bresenham circles are usually drawn anyway. To avoid overdrawing (e.g., for XOR drawing), the second octant should be constrained to draw outside the first octant's x-extents.

Note that this approach breaks down if the line is very thick compared to the radius.


Treat it as a rasterization problem:

Take the bounding box of your annulus. Consider the image rows falling in the bounding box. For each row, compute the intersection with the 2 circles (ie solve x^2+y^2=r^2, so x=sqrt(r^2-y^2) for each, for x,y relative to the circle centres. Fill in the spans. Repeat for next row.

This approach generalizes to all sorts of shapes, can produce sub-pixel coordinates useful for anti-aliasing and scales better with increasing resolution than hacky solutions involving multiple shifted draws.

If the sqrt looks scary for an embedded system, bear in mind there are fast approximate algorithms which would probably be good enough, especially if you're rounding off to the nearest pixel.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号