

On 20190122 11:23 AM (4), JimT wrote:
> If you want a Bezier Spline approximation to an arc of a circle subtending angle
> theta at the centre, the four control points are
>
> (1,0), (1,a), (cos(theta) + asin(theta),sin(theta) 
> acos(theta)),(cos(theta),sin(theta))
>
> where a = (8/3)(sin(theta/2)  sin(theta)/2)/(1cos(theta))
Hmmm. This is the formula for 'a' that I used for the ring shank cross
section in GemCuts:
#declare Gem__fn_Bezier_arc = function (x)
{ (8 * cos (x / 2)  4  4 * cos (x)) / (3 * sin (x))
}
Presumably, they are somehow the same formula, though I haven't figured
out how to reduce one to the other.
> As mentioned before, this is tangent to the circle at theta/2 as well as the
> endpoints and outside the circle otherwise. For theta = pi/2 the defect is
> 0.03% of the radius. For theta = pi it is 1.8%, still not bad, but for theta =
> 5pi/4 it is an unusable 7.6%.
My notes say that the curve deviates markedly from a circle if x > 90
degrees (pi / 2), though I did not quantify the error.
> Tweaking a to have the spline cross the circle twice reduces the error only to
> about 70% of the value given and is probably not worth it.
For large angles I just use 2 segments.
I've actually tried multiple crossings to approximate a quadrant of a
superquadric ellipse, but it required an arbitrary amount of fudging. I
do not have a general formula for this. I also tried using two 45
degree segments, but the result was horrible.
> If anyone wants code for a single segment Bezier Spline sphere sweep, I will
> post it again, since the last time was years ago.
There are two Object Collection modules that already do this for
multiple segments: PointArrays and SphereSweep.
Post a reply to this message

