2D rational NURBS to non-rational Beziers curve approximation

Hello, I’m new to this forum. I’m using openNURBS as C++ import library of 3DM files in my 2D CAD/CAM software. My application use segments, lines and cubic beziers to model simple geometries and polylines. While importing 3DM files I need to “convert” nurbs planar curves to beziers represenation, possibly controlling the approximation error. I tried to use ON_NurbsCurve::MakePiecewiseBezier(); and than getting bezier control points by iterating through the control vertex:

curve.MakePiecewiseBezier();
int span_count = curve.SpanCount();
int order = curve.m_order;
for(int spani = 0; spani < span_count; spani++) {
	ON_3dPoint *ctrl_points = new ON_3dPoint[order];
	//Load bezier control points
	for(int i = 0; i < order; i++ ){
		curve.GetCV(spani*(order-1) + i,ctrl_points[i]);
	}
	//Use control points to create bezier with our representation,
	// if the order is 3 elevate degree to make cubic bezier
	...
}

What I obtain with this code is a very raw approximation of the original curve. For example from a NURBS circle I obtain four quadratic bezier which is very inaccurate.
Am I using the functions in the correct way? Can you give me any suggestion about the approximation I’m trying to do?

Edit:

After further investigation I found that my approach generally works, but for some reason fail with the attached file… Circle.3dm (22.3 KB)
This is what I obtain after conversion:

Where am I missing?

I found that the problem is that the curve is rational. I tried to use curve.MakeNonRational(); before calling curve.MakePiecewiseBezier(); but I get the same result. Any ideas?

You need to set the weights on the control points and use rational Bézier curves to accurately model the four arcs. They should be overlapping.

A circle can only be represented by a rational curve.

Thany you for your answer! Yes, I know that circular arcs can’t be represented exactly by a non-rational bezier curve, but they can be well approximated by a chain of (non-rational) cubic beziers, this is the representation we use in our software. I wrongly thought that MakePiecewiseBezier did such approximation. So I need to find a way to approximate a rational curve with a non-rational one.

No, a rational NURBS will be converted to one or more rational Bezier curves.

To approximate a rational curve with a non-rational one, maybe find a (large-ish) number of points on the rational NURBS curve and interpolate a non-rational NURBS curve through them. Then, convert the non-rational approximate curve to Bezier pieces.

Just in case google lands me (or anyone else) back here again.

BezierCurve.CreateCubicBeziers

Is a good choice for the fitting because it will create non-rational curves while fitting - a gurantee not provided on other fitting routines.