Exemplo n.º 1
0
 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);
     }
 }
Exemplo n.º 2
0
        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);
            }
        }