private void getControlPoints()
        {
            if (dataPoint != null && dataPoint.Length == 3)
            {
                controlPoint    = new MPoint[3];
                controlPoint[0] = dataPoint[0];
                controlPoint[1] = new MPoint((6 * dataPoint[1].X - dataPoint[0].X - dataPoint[2].X) / 4,
                                             (6 * dataPoint[1].Y - dataPoint[0].Y - dataPoint[2].Y) / 4);
                controlPoint[2] = dataPoint[2];
            }

            if (dataPoint != null && dataPoint.Length > 3)
            {
                int n = dataPoint.Length;
                controlPoint = new MPoint[n];
                double[] diag = new double[n];
                double[] sub  = new double[n];
                double[] sup  = new double[n];

                for (int i = 0; i < n; i++)
                {
                    controlPoint[i] = dataPoint[i];
                    diag[i]         = 4;
                    sub[i]          = 1;
                    sup[i]          = 1;
                }

                controlPoint[1] = new MPoint(6 * controlPoint[1].X - controlPoint[0].X,
                                             6 * controlPoint[1].Y - controlPoint[0].Y);
                controlPoint[n - 2] = new MPoint(6 * controlPoint[n - 2].X - controlPoint[n - 1].X,
                                                 6 * controlPoint[n - 2].Y - controlPoint[n - 1].Y);

                for (int i = 2; i < n - 2; i++)
                {
                    controlPoint[i] = new MPoint(6 * controlPoint[i].X, 6 * controlPoint[i].Y);
                }

                for (int i = 2; i < n - 1; i++)
                {
                    sub[i]          = sub[i] / diag[i - 1];
                    diag[i]         = diag[i] - sub[i] * sup[i - 1];
                    controlPoint[i] = new MPoint(controlPoint[i].X - sub[i] * controlPoint[i - 1].X,
                                                 controlPoint[i].Y - sub[i] * controlPoint[i - 1].Y);
                }

                controlPoint[n - 2] = new MPoint(controlPoint[n - 2].X / diag[n - 2],
                                                 controlPoint[n - 2].Y / diag[n - 2]);

                for (int i = n - 3; i > 0; i--)
                {
                    controlPoint[i] = new MPoint((controlPoint[i].X - sup[i] * controlPoint[i + 1].X) / diag[i],
                                                 (controlPoint[i].Y - sup[i] * controlPoint[i + 1].Y) / diag[i]);
                }
            }
        }
        public void setCorrect(Point[] Points)
        {
            for (int i = 0; i < Points[0].X; i++)
            {
                level[i] = (byte)Points[0].Y;
            }
            for (int i = Points[Points.Length - 1].X; i < 256; i++)
            {
                level[i] = (byte)Points[Points.Length - 1].Y;
            }


            dataPoint = new MPoint[Points.Length];
            for (int i = 0; i < Points.Length; i++)
            {
                dataPoint[i] = new MPoint(Points[i]);
            }

            Point[] spt = SplinePoint();
            for (int i = 0; i < spt.Length; i++)
            {
                int n = spt[i].Y;
                if (n < 0)
                {
                    n = 0;
                }
                if (n > 255)
                {
                    n = 255;
                }
                level[Points[0].X + i] = (byte)n;
            }

            for (i = 0; i < PixelsCount; i++)
            {
                Pixels[0]     = level[PixelsBuffer[0]];
                Pixels[1]     = level[PixelsBuffer[1]];
                Pixels[2]     = level[PixelsBuffer[2]];
                Pixels       += Channels;
                PixelsBuffer += Channels;
            }
            Pixels       -= PixelsCountWithChannels;
            PixelsBuffer -= PixelsCountWithChannels;
        }
        private void getSplinePoints()
        {
            splinePoint.Clear();
            if (dataPoint.Length == 1)
            {
                splinePoint.Add(dataPoint[0]);
            }

            if (dataPoint.Length == 2)
            {
                int n = 1;
                n = (int)((dataPoint[1].X - dataPoint[0].X) / precision);
                if (n == 0)
                {
                    n = 1;
                }
                if (n < 0)
                {
                    n = -n;
                }
                for (int j = 0; j < n; j++)
                {
                    double t    = (double)j / (double)n;
                    double resX = (1 - t) * dataPoint[0].X + t * dataPoint[1].X;
                    double resY = (1 - t) * dataPoint[0].Y + t * dataPoint[1].Y;

                    splinePoint.Add(new MPoint(resX, resY));
                }
            }

            if (dataPoint.Length > 2)
            {
                getControlPoints();

                for (int i = 0; i < controlPoint.Length - 1; i++)
                {
                    MPoint b1 = new MPoint(controlPoint[i].X * 2.0 / 3.0 + controlPoint[i + 1].X / 3.0,
                                           controlPoint[i].Y * 2.0 / 3.0 + controlPoint[i + 1].Y / 3.0);
                    MPoint b2 = new MPoint(controlPoint[i].X / 3.0 + controlPoint[i + 1].X * 2.0 / 3.0,
                                           controlPoint[i].Y / 3.0 + controlPoint[i + 1].Y * 2.0 / 3.0);

                    int n = 1;
                    n = (int)((dataPoint[i + 1].X - dataPoint[i].X) / precision);
                    if (n == 0)
                    {
                        n = 1;
                    }
                    if (n < 0)
                    {
                        n = -n;
                    }
                    for (int j = 0; j < n; j++)
                    {
                        double t = (double)j / (double)n;
                        MPoint v = new MPoint(
                            (1 - t) * (1 - t) * (1 - t) * dataPoint[i].X + 3 * (1 - t) * (1 - t) * t * b1.X +
                            3 * (1 - t) * t * t * b2.X + t * t * t * dataPoint[i + 1].X,
                            (1 - t) * (1 - t) * (1 - t) * dataPoint[i].Y + 3 * (1 - t) * (1 - t) * t * b1.Y +
                            3 * (1 - t) * t * t * b2.Y + t * t * t * dataPoint[i + 1].Y);
                        splinePoint.Add(v);
                    }
                }
            }
        }