On 20-Oct-2013 14:35, Nathan Hurst wrote:

There have been papers published on ways to do this efficiently in general (one search term is geometric interpolation). Nobody has implemented a competitive algorithm. I would recommend modifying the ellipse code to use the known approximation directly rather than going via sbasis (or equivalently, generating the approximation in sbasis form rather than using sin,cos in which case Geom::cubicbezierpath_from_sbasis should be the identity).

Recapitulating:

1. The original ellipse -> bezier conversion used one of the worked out solutions which are calculated directly from the ellipse parameters. Probably something like this:

http://www.spaceroots.org/documents/ellipse/

It produced four beziers for any ellipse. These met the needs of most users.

2. Higher precision curve drawing of ellipses was required by some end users for CAD purposes, so the method was changed. This resulted in the default bezier representation of an ellipse being more complex (>4 beziers) than needed for general use. The new method uses a fit parameter which must be changed in a major way from its default value in order to return to beziers similar to (1), and there is currently no way to do this in the GUI. (Unsure: that same parameter is used for other curve -> bezier conversions? Does the end user need to be able to adjust the fit parameter?)

So far so good?

The issue then is how to allow those who need it to obtain a higher precision conversion to beziers without requiring that the average user know anything about it. I suggest that the usual solution to this sort of problem, as applied to Inkscape, would be to modify the toolbar for elliptical drawing to add a "precision" field that normally reads "Default", with other options perhaps called "CAD Low","CAD Medium","CAD High". Each corresponds to a parameter value, but that is not shown to the end user, in case things need to be changed around again at some point in future. Exposing the parameter value is unlikely to be helpful to most users, since it probably will not correspond in a simple way to an easily comprehended measure of error. The bezier generating code looks at this parameter, and when it sees the one corresponding to "Default" it uses the original algorithm, for all of the others it uses Geom::cubicbezierpath_from_sbasis.

In terms of usability that should be fine, and adding the control will not be hard. However, algorithmically I am guessing that Geom::cubicbezierpath_from_sbasis is not as efficient as using some partially precalculated method which uses the a/b ratio of the ellipse in question, at least for whole ellipses. For circles in particular symmetry suggests that there must be an extremely efficient method of determining the best set of Beziers for a given measure of fit.

Regards,

David Mathog mathog@...1176... Manager, Sequence Analysis Facility, Biology Division, Caltech