コード例 #1
0
ファイル: Geometry.cs プロジェクト: seannguyen/Dynamo
        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));
        }
コード例 #2
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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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));
        }
コード例 #5
0
ファイル: Geometry.cs プロジェクト: kscalvin/Dynamo
        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);
        }