Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }