public override Value Evaluate(FSharpList <Value> args) { PointList points = new PointList(); var input = (args[0] as Value.List).Item; foreach (Value v in input) { Point p = ((Value.Container)v).Item as Point; points.Add(p); } _bsplinecurve = BSplineCurve.by_points(points, true); return(Value.NewContainer(_bsplinecurve)); }
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 void BSplineCurve() { double[][] pts = null; KnotSet knotset = null; int degree = int.MinValue; BSplineCurve bSpline = null; pts = new double[][] { new double[] { 0, 0, 0 }, new double[] { 2, 4, 0 }, new double[] { 4, 0, 0 }, new double[] { 6, 4, 0 }, }; knotset = new KnotSet(new double[] { 0, 0, 0, 0, 1, 1, 1, 1 }); degree = 3; bSpline = new BSplineCurve(pts, knotset, degree); }
public void ParameterAt() { double[][] pts = null; KnotSet knotset = null; int degree = int.MinValue; BSplineCurve bSpline = null; double[] r, a; double t; double e; pts = new double[][] { new double[] { 0, 0, 0 }, new double[] { 2, 4, 0 }, new double[] { 4, 0, 0 }, new double[] { 6, 4, 0 }, }; knotset = new KnotSet(new double[] { 0, 0, 0, 0, 1, 1, 1, 1 }); degree = 3; bSpline = new BSplineCurve(pts, knotset, degree); t = 0.5; a = new double[] { 3, 2, 0 }; r = bSpline.ParameterAt(t); Assert.IsTrue(a.SequenceEqual(r)); pts = new double[][] { new double[] { 0, 0, 0 }, new double[] { 2, 4, 0 }, new double[] { 4, 0, 0 }, new double[] { 6, 4, 0 }, }; knotset = new KnotSet(new double[] { 0, 0, 0, 0, 1, 1, 1, 1 }); degree = 3; bSpline = new BSplineCurve(pts, knotset, degree); t = 0.384; a = new double[] { 2.3040000000000003, 1.9750256640000001, 0 }; r = bSpline.ParameterAt(t); e = 0.0001; Assert.IsTrue(a.SequenceEqual(r, e)); pts = new double[][] { new double[] { 0, 0, 0 }, new double[] { 2, 4, 0 }, new double[] { 4, 0, 0 }, new double[] { 6, 4, 0 }, }; knotset = new KnotSet(new double[] { 0, 0, 0, 0, 1, 1, 1, 1 }); degree = 3; bSpline = new BSplineCurve(pts, knotset, degree); t = 0.884; a = new double[] { 5.304, 2.905969664, 0 }; r = bSpline.ParameterAt(t); e = 0.0001; Assert.IsTrue(a.SequenceEqual(r, e)); pts = new double[][] { new double[] { 1, 0, 0 }, new double[] { 2, 4, 0 }, new double[] { 4, 0, 0 }, new double[] { 6, 4, 0 }, }; knotset = new KnotSet(new double[] { 0, 0, 0, 0, 1, 1, 1, 1 }); degree = 3; bSpline = new BSplineCurve(pts, knotset, degree); t = 0; a = new double[] { 1, 0, 0 }; r = bSpline.ParameterAt(t); e = 0.0001; Assert.IsTrue(a.SequenceEqual(r, e)); pts = new double[][] { new double[] { 1, 0, 0 }, new double[] { 2, 4, 0 }, new double[] { 6, 4, 0 }, }; knotset = new KnotSet(new double[] { 0, 0, 0, 1, 1, 1 }); degree = 2; bSpline = new BSplineCurve(pts, knotset, degree); t = 0; a = new double[] { 1, 0, 0 }; r = bSpline.ParameterAt(t); e = 0.0001; Assert.IsTrue(a.SequenceEqual(r, e)); pts = new double[][] { new double[] { 0, 0, 0 }, new double[] { 2, 4, 0 }, new double[] { 6, 4, 0 }, }; knotset = new KnotSet(new double[] { 0, 0, 0, 1, 1, 1 }); degree = 2; bSpline = new BSplineCurve(pts, knotset, degree); t = 1; a = new double[] { 6, 4, 0 }; r = bSpline.ParameterAt(t); e = 0.0001; Assert.IsTrue(a.SequenceEqual(r, e)); }
public override Value Evaluate(FSharpList<Value> args) { PointList points = new PointList(); var input = (args[0] as Value.List).Item; foreach (Value v in input) { Point p = ((Value.Container)v).Item as Point; points.Add(p); } _bsplinecurve = BSplineCurve.by_points(points); return Value.NewContainer(_bsplinecurve); }