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); }
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; } }
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); }
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; }; }