private static void DoCubicMidpointSubdivision(Point[] controlPoints, uint depth, double inverseErrorTolerance, List <Point> resultPolyline) { Point[] controlPoints1 = new Point[4] { controlPoints[0], controlPoints[1], controlPoints[2], controlPoints[3] }; Point[] controlPoints2 = new Point[4]; controlPoints2[3] = controlPoints1[3]; controlPoints1[3] = VectorUtilities.Midpoint(controlPoints1[3], controlPoints1[2]); controlPoints1[2] = VectorUtilities.Midpoint(controlPoints1[2], controlPoints1[1]); controlPoints1[1] = VectorUtilities.Midpoint(controlPoints1[1], controlPoints1[0]); controlPoints2[2] = controlPoints1[3]; controlPoints1[3] = VectorUtilities.Midpoint(controlPoints1[3], controlPoints1[2]); controlPoints1[2] = VectorUtilities.Midpoint(controlPoints1[2], controlPoints1[1]); controlPoints2[1] = controlPoints1[3]; controlPoints1[3] = VectorUtilities.Midpoint(controlPoints1[3], controlPoints1[2]); controlPoints2[0] = controlPoints1[3]; --depth; if (depth > 0U) { BezierCurveFlattener.DoCubicMidpointSubdivision(controlPoints1, depth, inverseErrorTolerance, resultPolyline); resultPolyline.Add(controlPoints2[0]); BezierCurveFlattener.DoCubicMidpointSubdivision(controlPoints2, depth, inverseErrorTolerance, resultPolyline); } else { BezierCurveFlattener.DoCubicForwardDifferencing(controlPoints1, inverseErrorTolerance, resultPolyline); resultPolyline.Add(controlPoints2[0]); BezierCurveFlattener.DoCubicForwardDifferencing(controlPoints2, inverseErrorTolerance, resultPolyline); } }
private static void DoCubicMidpointSubdivision(Point[] controlPoints, uint depth, double leftParameter, double rightParameter, double inverseErrorTolerance, List <Point> resultPolyline, List <double> resultParameters) { Point[] controlPoints1 = new Point[4] { controlPoints[0], controlPoints[1], controlPoints[2], controlPoints[3] }; Point[] controlPoints2 = new Point[4]; controlPoints2[3] = controlPoints1[3]; controlPoints1[3] = VectorUtilities.Midpoint(controlPoints1[3], controlPoints1[2]); controlPoints1[2] = VectorUtilities.Midpoint(controlPoints1[2], controlPoints1[1]); controlPoints1[1] = VectorUtilities.Midpoint(controlPoints1[1], controlPoints1[0]); controlPoints2[2] = controlPoints1[3]; controlPoints1[3] = VectorUtilities.Midpoint(controlPoints1[3], controlPoints1[2]); controlPoints1[2] = VectorUtilities.Midpoint(controlPoints1[2], controlPoints1[1]); controlPoints2[1] = controlPoints1[3]; controlPoints1[3] = VectorUtilities.Midpoint(controlPoints1[3], controlPoints1[2]); controlPoints2[0] = controlPoints1[3]; --depth; double num = (leftParameter + rightParameter) * 0.5; if (depth > 0U) { BezierCurveFlattener.DoCubicMidpointSubdivision(controlPoints1, depth, leftParameter, num, inverseErrorTolerance, resultPolyline, resultParameters); resultPolyline.Add(controlPoints2[0]); resultParameters.Add(num); BezierCurveFlattener.DoCubicMidpointSubdivision(controlPoints2, depth, num, rightParameter, inverseErrorTolerance, resultPolyline, resultParameters); } else { BezierCurveFlattener.DoCubicForwardDifferencing(controlPoints1, leftParameter, num, inverseErrorTolerance, resultPolyline, resultParameters); resultPolyline.Add(controlPoints2[0]); resultParameters.Add(num); BezierCurveFlattener.DoCubicForwardDifferencing(controlPoints2, num, rightParameter, inverseErrorTolerance, resultPolyline, resultParameters); } }