swftools-common
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Swftools-common] swfc: Importing SVG elliptical arcs


From: Vladimir Dzhuvinov
Subject: Re: [Swftools-common] swfc: Importing SVG elliptical arcs
Date: Mon, 26 Nov 2007 10:50:29 +0200
User-agent: Thunderbird 2.0.0.6 (X11/20070728)

Jeez, I wanted to spend a pleasant day with no mention of geometry
whatsoever ;)

Yes, I now see the lib/drawer.c:draw_conicTo() function that tries to
solve the geometrical problem of "drawing an arc through 3 points".

It, however, does not check itself whether the arc hasn't gone through
more than a 90 deg angle.

Further down, in draw_string() you call this function to construct a
"circle" given its (x,y) centre and radius. There, before calling
draw_conicTo2() you make sure that the circle is broken down into four
90 degree segments.

According to
http://www.w3.org/TR/SVG11/paths.html#PathDataGeneralInformation the SVG
"Arc" command has the following parameters:

1. the r(x) and r(y) radii
2. the x-axis-rotation
3. large-arc-flag
4. sweep-flag
5. x,y end-point

Hm, let's now see what we have to do to transform the SVG:A command
parameters to the draw_conicTo() parameters:

We have the start and ending points -> good, so we only ;) have to do
the following:

1. Check angle of SVG arc. Break it down into 90 deg. segments if necessary.

2. Find a midpoint on the arc between start and end point.


I can't tell now in what reasonable order (1) and (2) should be tackled.
In any case, it seems that we cannot get around finding the ellipse
(x,y)centre given the A parameters.

Do you think it would be worth digging into the Inkscape codebase for clues?

Vladimir


>> Basically, in Inkscape I noticed that when I drew a smaller object (e.g.
>> rectangle) within the ellipse/circle and did a union of the two - the
>> resulting object - which should obviously have the unmodified outline of
>> the outer ellipse/circle, was no longer described with "arc" commands,
>> but instead with 4 usual "C" (bezier)commands which swfc understands well.
> 
> Interesting. Probably Inkscape does the "union" operation on splines (or
> even lines), and hence before applying the union converts all Arcs to
> Beziers.
> 
>> The first thing that came to my mind was to approximate the arcs with
>> bezier curves that you have already programmed into swftools.
> 
> That's not needed- swftools already has a way to draw Arcs. The
> routine is called "conicTo". It approximates an arc using a 3rd-order
> bezier. (which is then internally converted back to a number of 2nd-order
> beziers at some point)
> It only works reliably for arcs smaller than 90°, though, which is
> consistent with your finding:
> 
>> Tellingly, I also found a message
>> [http://uncommonplace.com/blog/?p=254#comment-1453] saying that Inkscape
>> was in fact using this approximation method to draw elliptical arcs by
>> using a bezier for every 90 deg.
> 
> So I guess the SVG code would need to call that routine four times.


-- 
Vladimir Dzhuvinov * www.TheTransactionCompany.com * PGP key ID AC9A5C6C

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]