private PointF EvaluatePolynomial(SplinePolynomial SP, double s) { PointF Pt = new PointF(); Pt.X = (float)(SP.Ax * s * s * s + SP.Bx * s * s + SP.Cx * s + SP.Dx); Pt.Y = (float)(SP.Ay * s * s * s + SP.By * s * s + SP.Cy * s + SP.Dy); return(Pt); }
public List <SplinePolynomial> CalculatePolynomialSpline(List <PointF> ListOfPoints, Func <PointF, PointF> convert = null, string[] SVGCode = null, bool isarea = false) { int i; int n = ListOfPoints.Count; double c = 0.19; List <SplinePolynomial> ListSP = new List <SplinePolynomial>(); for (i = 0; i < n - 1; i++) { SplinePolynomial SP = new SplinePolynomial(); // 1 double x0 = (i == 0) ? ListOfPoints[0].X : ListOfPoints[i - 1].X; double x1 = ListOfPoints[i].X; double x2 = ListOfPoints[i + 1].X; double x3 = (i == n - 2) ? ListOfPoints[n - 1].X : ListOfPoints[i + 2].X; double y0 = (i == 0) ? ListOfPoints[0].Y : ListOfPoints[i - 1].Y; double y1 = ListOfPoints[i].Y; double y2 = ListOfPoints[i + 1].Y; double y3 = (i == n - 2) ? ListOfPoints[n - 1].Y : ListOfPoints[i + 2].Y; if (isarea) { x0 = (i == 0) ? ListOfPoints[n - 2].X : ListOfPoints[i - 1].X; x3 = (i == n - 2) ? ListOfPoints[1].X : ListOfPoints[i + 2].X; y0 = (i == 0) ? ListOfPoints[n - 2].Y : ListOfPoints[i - 1].Y; y3 = (i == n - 2) ? ListOfPoints[1].Y : ListOfPoints[i + 2].Y; } if (SVGCode != null) { PointF XY0 = convert(new PointF((float)x0, (float)y0)); PointF XY1 = convert(new PointF((float)x1, (float)y1)); PointF XY2 = convert(new PointF((float)x2, (float)y2)); PointF XY3 = convert(new PointF((float)x3, (float)y3)); x0 = XY0.X; x1 = XY1.X; x2 = XY2.X; x3 = XY3.X; y0 = XY0.Y; y1 = XY1.Y; y2 = XY2.Y; y3 = XY3.Y; } // 2 double m1x = x1 + c * (x2 - x0); double m2x = x2 - c * (x3 - x1); double m1y = y1 + c * (y2 - y0); double m2y = y2 - c * (y3 - y1); SP.Ax = -3 * m2x + 3 * m1x + x2 - x1; SP.Bx = -6 * m1x + 3 * m2x + 3 * x1; SP.Cx = 3 * m1x - 3 * x1; SP.Dx = x1; SP.Ay = -3 * m2y + 3 * m1y + y2 - y1; SP.By = -6 * m1y + 3 * m2y + 3 * y1; SP.Cy = 3 * m1y - 3 * y1; SP.Dy = y1; if (SVGCode != null) { if (i == 0) { SVGCode[0] += "M " + x1.ToString() + " " + y1.ToString() + " "; } SVGCode[0] += " c " + (m1x - x1).ToString() + " " + (m1y - y1).ToString() + ", " + (m2x - x1).ToString() + " " + (m2y - y1).ToString() + ", " + (x2 - x1).ToString() + " " + (y2 - y1).ToString() + " "; } ListSP.Add(SP); } return(ListSP); }