示例#1
0
        private void C1()
        {
            G1();

            Point2D p0 = BSplineControlPoints[BSplineControlPoints.Count - 2];
            Point2D p1 = BezierControlPoints.First();
            Point2D p2 = BezierControlPoints[1];

            BezierCurve.Scale(
                new PointF(
                    (p1.Location.X - p0.Location.X) / (p2.Location.X - p1.Location.X),
                    (p1.Location.Y - p0.Location.Y) / (p2.Location.Y - p1.Location.Y)
                    ),
                p1.Location
                );

            float scale = BSplineCurve.Degree / (
                BSplineCurve.Knots[BSplineCurve.ControlPointsNum - 1 + BSplineCurve.Degree] -
                BSplineCurve.Knots[BSplineCurve.ControlPointsNum - 1]
                );

            scale /= BezierCurve.Degree;

            BezierCurve.Scale(new PointF(scale, scale), p1.Location);
        }
示例#2
0
        private void C0()
        {
            float deltaX = BSplineControlPoints.Last().Location.X - BezierControlPoints.First().Location.X;
            float deltaY = BSplineControlPoints.Last().Location.Y - BezierControlPoints.First().Location.Y;

            foreach (Point2D p in BezierControlPoints)
            {
                p.Location.X += deltaX;
                p.Location.Y += deltaY;
            }
        }
示例#3
0
        private void G1()
        {
            C0();

            Point2D p0 = BSplineControlPoints[BSplineControlPoints.Count - 2];
            Point2D p1 = BezierControlPoints.First();
            Point2D p2 = BezierControlPoints[1];

            float angle = 0;

            if (p1.Location.X - p0.Location.X <= 0 && p1.Location.Y - p0.Location.Y <= 0)
            {
                angle = (float)PI;
            }
            else if (p1.Location.X - p0.Location.X >= 0 && p1.Location.Y - p0.Location.Y <= 0)
            {
                angle = (float)(PI / 2);
            }
            else if (p1.Location.X - p0.Location.X <= 0 && p1.Location.Y - p0.Location.Y >= 0)
            {
                angle = (float)(-PI / 2);
            }

            BSplineCurve.Rotate(angle, p1.Location);

            if (p2.Location.X - p1.Location.X <= 0 && p2.Location.Y - p1.Location.Y <= 0)
            {
                BezierCurve.Rotate((float)PI, p1.Location);
            }
            else if (p2.Location.X - p1.Location.X >= 0 && p2.Location.Y - p1.Location.Y <= 0)
            {
                BezierCurve.Rotate((float)(PI / 2), p1.Location);
            }
            else if (p2.Location.X - p1.Location.X <= 0 && p2.Location.Y - p1.Location.Y >= 0)
            {
                BezierCurve.Rotate((float)(-PI / 2), p1.Location);
            }

            BezierCurve.Rotate(
                (float)(Atan(Abs(p2.Location.X - p1.Location.X) / Abs(p2.Location.Y - p1.Location.Y)) -
                        Atan(Abs(p1.Location.X - p0.Location.X) / Abs(p1.Location.Y - p0.Location.Y))),
                p1.Location);

            BezierCurve.Rotate(-angle, p1.Location);
            BSplineCurve.Rotate(-angle, p1.Location);
        }
示例#4
0
        public Window()
        {
            InitializeComponent();

            string[] fileLines = File.ReadAllLines(@"points");

            for (int i = 5; i < fileLines.Length; i++)
            {
                string[] coordinates = fileLines[i].Split(';');
                BSplineControlPoints.Add(
                    new Point2D(ParseFloat(coordinates[0]), ParseFloat(coordinates[1]), Color.Coral, panel1)
                    );
            }
            BSplineCurve = new BSpline(BSplineControlPoints[0],
                                       BSplineControlPoints[1],
                                       BSplineControlPoints[2],
                                       BSplineControlPoints[3],
                                       BSplineControlPoints[4],
                                       BSplineControlPoints[5],
                                       Color.OrangeRed);

            for (int i = 0; i < 5; i++)
            {
                string[] coordinates = fileLines[i].Split(';');
                BezierControlPoints.Add(
                    new Point2D(ParseFloat(coordinates[0]), ParseFloat(coordinates[1]), Color.BlueViolet, panel1)
                    );
            }
            BezierCurve = new Bezier(BezierControlPoints[0],
                                     BezierControlPoints[1],
                                     BezierControlPoints[2],
                                     BezierControlPoints[3],
                                     BezierControlPoints[4],
                                     Color.Blue);

            panel1.Paint  += new PaintEventHandler(panel1_Paint);
            button1.Click += (s, e) => { C0(); panel1.Invalidate(); };
            button2.Click += (s, e) => { G1(); panel1.Invalidate(); };
            button3.Click += (s, e) => { C1(); panel1.Invalidate(); };
            button4.Click += (s, e) => { G2(); panel1.Invalidate(); };
            button5.Click += (s, e) => { C2(); panel1.Invalidate(); };

            chBox.Click += (s, e) =>
            {
                ShowControlPoints = !ShowControlPoints;
                foreach (Point2D p in BSplineControlPoints)
                {
                    p.Active = !p.Active;
                }
                foreach (Point2D p in BezierControlPoints)
                {
                    p.Active = !p.Active;
                }
                panel1.Invalidate();
            };

            panel1.MouseWheel += MouseWheelEvent;
            panel1.MouseDown  += (s, e) =>
            {
                if (panel1.Dragging)
                {
                    return;
                }
                DraggingPanel = true;
                MouseLocation = e.Location;
            };
            panel1.MouseMove += (s, e) =>
            {
                if (!DraggingPanel)
                {
                    return;
                }
                PointF newMousePos = e.Location;
                foreach (Point2D p in BSplineControlPoints)
                {
                    p.Location.X += newMousePos.X - MouseLocation.X;
                    p.Location.Y += newMousePos.Y - MouseLocation.Y;
                }
                foreach (Point2D p in BezierControlPoints)
                {
                    p.Location.X += newMousePos.X - MouseLocation.X;
                    p.Location.Y += newMousePos.Y - MouseLocation.Y;
                }
                MouseLocation = newMousePos;
                panel1.Invalidate();
            };
            panel1.MouseUp += (s, e) => { DraggingPanel = false; };
        }