[GRASS5] R_line_width()
Glynn Clements
glynn at gclements.plus.com
Tue Aug 9 16:43:43 EDT 2005
Huidae Cho wrote:
> You're right. The first version was drawing two vertical lines at a
> time. But the horizontal width of line (point) was not correct
> (linewidth"+1"). Well, who cares about this extra one pixel, but it was
> little fat horizontally. If I add one more vertical pixel to avoid this
> problem, a line looked even fatter in both x-y direction.
>
> With the PNG driver, if line width is not that big, it seems working at
> reasonable speed. However, if you have a good idea, please let me know.
The simplest way is to draw parallelograms. If the line is close to
vertical (i.e. |dy|>|dx|) call the original draw_line() linewidth
times, each with different X offset. If it's closer to horizontal, use
a Y offset instead.
E.g.:
int draw_thick_line(int x1, int y1, int x2, int y2)
{
int k = linewidth/2;
int i;
for (i = 0; i < linewidth; i++)
if (abs(y2-y1) > abs(x2-x1))
draw_line(x1-k+i, y1, x2-k+i, y2);
else
draw_line(x1, y1-k+i, x2, y2-k+i);
return 0;
}
This will be adequate except when drawing particularly thick lines
with a significant slope (i.e. neither horizontal nor vertical), where
the caps will be noticably wrong. For lines a few pixels thick, it's
unlikely to matter.
A more accurate (but more complex) solution is to use both X and Y
offsets generated by computing the perpendicular line. The problem
here is that you have to initialise the remainder correctly so that
the "steps" align (otherwise you get "holes").
--
Glynn Clements <glynn at gclements.plus.com>
More information about the grass-dev
mailing list