def to_bspline(): b1 = bezier[0] _g1_continuity_curves = [b1] for b2 in bezier[1:]: if have_bezier_curves_g1_continuity(b1, b2, g1_tol): _g1_continuity_curves.append(b2) else: yield bezier_to_bspline(_g1_continuity_curves) _g1_continuity_curves = [b2] b1 = b2 if _g1_continuity_curves: yield bezier_to_bspline(_g1_continuity_curves)
def test_quality_of_bezier_to_bspline_conversion_1(): # This test shows the close relationship between cubic Bézier- and # cubic B-spline curves. points0 = B1.approximate(10) points1 = bezier_to_bspline([B1]).approximate(10) for p0, p1 in zip(points0, points1): assert p0.isclose(p1) is True, "conversion should be perfect"
def test_quality_of_bezier_to_bspline_conversion_2(): # This test shows the close relationship between cubic Bézier- and # cubic B-spline curves. # Remove duplicate point between the two curves: points0 = list(B1.approximate(10)) + list(B2.approximate(10))[1:] points1 = bezier_to_bspline([B1, B2]).approximate(20) for p0, p1 in zip(points0, points1): assert p0.isclose(p1) is True, "conversion should be perfect"
def test_bezier_curves_to_bspline_error(): with pytest.raises(ValueError): bezier_to_bspline([]) # one or more curves expected
def test_bezier_curves_to_bspline(b1, b2): bspline = bezier_to_bspline([b1, b2]) # Remove duplicate control point between two adjacent curves: expected = list(b1.control_points) + list(b2.control_points)[1:] assert bspline.degree == 3, "should be a cubic B-spline" assert bspline.control_points == tuple(expected)
# http://help.autodesk.com/view/OARX/2018/ENU/?guid=OREF-AcDbSpline__setFitData_AcGePoint3dArray__AcGeVector3d__AcGeVector3d__AcGe__KnotParameterization_int_double # Remark in the AutoCAD ObjectARX reference for AcDbSpline about construction # of a B-spline from fit points: # degree has no effect. A spline with degree=3 is always constructed when # interpolating a series of fit points. # Sadly this works only for short simple splines. doc, msp = setup() msp.add_spline(points, degree=2, dxfattribs={ 'layer': 'BricsCAD B-spline', 'color': 2 }) bezier_curves = cubic_bezier_interpolation(points) s = bezier_to_bspline(bezier_curves) msp.add_spline(dxfattribs={ 'color': 6, 'layer': 'Cubic Bezier Curve Interpolation' }).apply_construction_tool(s) zoom.extents(msp) doc.saveas(DIR / 'concept-4-cubic-bezier-curves.dxf') # ---------------------------------------------------------------------------- # A better way to create a SPLINE defined by control vertices from fit points # without given end tangents for SHORT B-splines: # ---------------------------------------------------------------------------- doc, msp = setup() # Create SPLINE defined by fit points only: