[cairo] Uniform Line Widths

Behdad Esfahbod behdad at behdad.org
Fri Feb 22 04:00:11 PST 2008


On Fri, 2008-02-22 at 02:36 -0500, Bobby Salazar wrote:
> Ok, that is much simpler than I thought, and works good too.

Good.

> However, my code is written so that the pre-set line width is correct
> for the currently applied transformation matrix.

Well, that can't be the case.  The pen at the applied transformation is
an ellipse (which causes the non-uniform line width).  Which diameter of
the ellipse is the desired line width you want?  Most probably the
smallest.

Depending on your answer, the solution would be different.  The max and
min of the diameter/pen-width are twice the semi-major and semi-minor
axes of the ellipse, which are equal to the singular values of the
non-translation parts of the matrix.  See:

  http://en.wikipedia.org/wiki/Semi-major_axis
  http://www.ee.ic.ac.uk/hp/staff/www/matrix/decomp.html#SVD

Quoting there: "The non-zero singular values of A are the square roots
of the non-zero eigenvalues of A⁺ A." where A⁺ is A-transpose.

Lets see.  Let M be the cairo transformation matrix in question:

      ⌈xx xy⌉
  M = |yx yy|
      ⌊x0 y0⌋

The non-translation part is:

  A = ⌈xx xy⌉
      ⌊yx yy⌋

  A⁺ A = ⌈xx yx⌉⌈xx xy⌉ = ⌈xx²+yx²     xx*xy+yx*yy⌉
         ⌊xy yy⌋⌊yx yy⌋   ⌊xx*xy+yx*yy     xy²+yy²⌋

Name those:

  B = A⁺ A = ⌈a k⌉
             ⌊k b⌋

The eigenvalues of B satisfy:

  λ² - (a+b).λ + a.b - k² = 0

The eigenvalues are:
               __________________
      (a+b) ± √(a+b)² - 4(a.b-k²)
  λ = ---------------------------
                  2

And the Singular values are the root of λs.

That's all.  Not as easy and fast as you expected I assume.  See the
attached code and output.


> If I then set the transformation matrix to be the identity matrix, the
> line width is not correct. Is there an equally simple method of
> mapping a certain line width from any arbitrary transformation matrix
> into the same pixel sized width it would if the identity matrix were
> used? I hope that last sentenced makes sense...

You need to think what the intended pen size in your application is and
reorder your code to not have to go through this.

Cheers,

behdad


PS. Anyone should feel free to put this on cairographics.org/samples or
a separate page of its own or whereever that it will be useful!


> Thanks!
> 
> > -----Original Message-----
> > From: behdad at behdad.org
> > Sent: Wed, 20 Feb 2008 14:17:11 -0500
> > To: bobby8934 at inbox.com
> > Subject: Re: [cairo] Uniform Line Widths
> > 
> > On Wed, 2008-02-20 at 10:39 -0800, Bobby Salazar wrote:
> >> I currently have a function that accepts a cairo context (with a path
> >> already set) and strokes the path with a pre-set width and color. The
> >> context can have any arbitrary transformation already applied to it. So
> >> given this situation, how would I ensure that I get a uniform line width
> >> from the stroke even when they may have applied a deforming scale to the
> >> context? Any ideas would be appreciated!
> > 
> > Something like:
> > 
> >   cairo_save (cr);
> >   cairo_identity_matrix (cr);
> >   cairo_set_line_width (cr, width);
> >   cairo_stroke (cr);
> >   cairo_restore (cr);
> > 
> > 
> >> Thanks!
> > 
> > Have fun with cairo!
> > --
> > behdad
> > http://behdad.org/
> > 
> > "Those who would give up Essential Liberty to purchase a little
> >  Temporary Safety, deserve neither Liberty nor Safety."
> >         -- Benjamin Franklin, 1759
> 
> ____________________________________________________________
> FREE 3D MARINE AQUARIUM SCREENSAVER - Watch dolphins, sharks & orcas on your desktop!
> Check it out at http://www.inbox.com/marineaquarium
> _______________________________________________
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo
-- 
behdad
http://behdad.org/

"Those who would give up Essential Liberty to purchase a little
 Temporary Safety, deserve neither Liberty nor Safety."
        -- Benjamin Franklin, 1759
-------------- next part --------------
A non-text attachment was scrubbed...
Name: singular.c
Type: text/x-csrc
Size: 3734 bytes
Desc: 
Url : http://lists.cairographics.org/archives/cairo/attachments/20080222/53cdf5fb/attachment-0001.c 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: singular.png
Type: image/png
Size: 22700 bytes
Desc: 
Url : http://lists.cairographics.org/archives/cairo/attachments/20080222/53cdf5fb/attachment-0001.png 


More information about the cairo mailing list