渲染抗锯齿线的宽度问题探讨

摘自:http://permalink.gmane.org/gmane.comp.graphics.agg/1428

问题:

Is it possible to draw non-anti-aliased dashed lines using a Bresenham-type algorithm in Antigrain? For instance, I'd like to draw a 45o dotted line, where every other pixel is solid.

I've tried several approaches, including using agg::renderer_outline_image with an image that defines the dashes (http://permalink.gmane.org/gmane.comp.graphics.agg/972) and using agg::conv_dash and setting gamma_threshold(0.5) (http://permalink.gmane.org/gmane.comp.graphics.agg/1428), but I can't seem to get a clean drawing for the 45o dotted case.

    

 2/ I would like to render aliased lines. After some tests, I'm not able
> to render odd line width. If I try to render a line with a width = 3, I
> got a 4 pixel line. What do I need to do to ?

讨论:
That's not easy. In short words, the visual width of the horizontal or vertical
lines depends not only on the stroke width you have set, but also on the
subpixel position of that line. A common way to draw everything aliased is to
set AA gamma:
ras.gamma(agg::gamma_threshold(0.5)); 

Here you can use scanline_bin and renderer_scanline_bin_solid that work faster.

But the problem still persists; I wrote about it here:http://antigrain.com/tips/line_alignment/line_alignment.agdoc.htmlNow imagine that you draw aliased lines, and set pixel if the coverage value
exceeds a certain threshold. 

In other words you can easily draw aliased lines of exactly 1 pixel width
(Bresenham-like algorithm). Everything wider leads to problems. But even
reguilar jagged lines of 1 pixel width have different visual thickness
depending on the tangent. A line of 45 degree steep has visual thickness of
1/sqrt(2)=0.7 pixels.


你可能感兴趣的:(宽度,agg,问题探讨)