/// <summary>
/// 获取Bezier近似的点数组 Calculate Bezier line segments
/// </summary>
/// <param name="controlPoints">Bezier曲线控制点数组</param>
/// <param name="outputSegmentCount">输出曲线段数量</param>
/// <returns>近似的点数组</returns>
public static Point[] GetBezierApproximation(Point[] controlPoints, int outputSegmentCount)
{
if (UseLegacyBezier)
return GetBezierApproximationOld(controlPoints, outputSegmentCount);
else
return BezierTools.FlattenTo(controlPoints, .2 / scaledError).ToArray();
}

private static Point[] GetBezierApproximationOld(Point[] controlPoints, int outputSegmentCount)
{
Point[] points = new Point[outputSegmentCount + 1];
for (int i = 0; i <= outputSegmentCount; i++)
{
double t = (double)i / outputSegmentCount;
points[i] = GetBezierPoint(t, controlPoints, 0, controlPoints.Length);
}
return points;
}

private static Point GetBezierPoint(double t, Point[] controlPoints, int index, int count)
{
if (count == 1)
return controlPoints[index];
var P0 = GetBezierPoint(t, controlPoints, index, count - 1);
var P1 = GetBezierPoint(t, controlPoints, index + 1, count - 1);
double x = (1 - t) * P0.X + t * P1.X;

return new Point(x, (1 - t) * P0.Y + t * P1.Y);
}