public void HermiteSpline_Basic()
        {
            var pts = new List <Autodesk.Revit.DB.XYZ>()
            {
                new Autodesk.Revit.DB.XYZ(1, 0, 0),
                new Autodesk.Revit.DB.XYZ(1, 1, 0),
                new Autodesk.Revit.DB.XYZ(0.5, 1, 0),
                new Autodesk.Revit.DB.XYZ(0, 1, 0)
            };

            var ts = new Autodesk.Revit.DB.HermiteSplineTangents
            {
                StartTangent = new Autodesk.Revit.DB.XYZ(0, 1, 0),
                EndTangent   = new Autodesk.Revit.DB.XYZ(-1, 0, 0)
            };

            var revitSpline = Autodesk.Revit.DB.HermiteSpline.Create(pts, false, ts);

            var protoCurve = revitSpline.ToProtoType(false);

            Assert.NotNull(protoCurve);
            Assert.IsAssignableFrom <Autodesk.DesignScript.Geometry.NurbsCurve>(protoCurve);

            var protoSpline = (Autodesk.DesignScript.Geometry.NurbsCurve)protoCurve;

            protoSpline.StartPoint.ShouldBeApproximately(pts[0]);
            protoSpline.EndPoint.ShouldBeApproximately(pts.Last());

            protoSpline.TangentAtParameter(0.0).ShouldBeApproximately(revitSpline.Tangents[0]);
            protoSpline.TangentAtParameter(1.0).ShouldBeApproximately(revitSpline.Tangents.Last());

            var tessPts = revitSpline.Tessellate();

            // assert the tesselation is very close to original curve
            // what's the best tolerance to use here?
            foreach (var pt in tessPts)
            {
                var closestPt = protoSpline.ClosestPointTo(pt.ToPoint(false));
                Assert.Less(closestPt.DistanceTo(pt.ToPoint(false)), 1e-6);
            }
        }
        public void HermiteSpline_Basic()
        {
            var pts = new List<Autodesk.Revit.DB.XYZ>()
            {
                new Autodesk.Revit.DB.XYZ(1,0,0),
                new Autodesk.Revit.DB.XYZ(1,1,0),
                new Autodesk.Revit.DB.XYZ(0.5,1,0),
                new Autodesk.Revit.DB.XYZ(0,1,0)
            };

            var ts = new Autodesk.Revit.DB.HermiteSplineTangents
            {

                StartTangent = new Autodesk.Revit.DB.XYZ(0, 1, 0),
                EndTangent = new Autodesk.Revit.DB.XYZ(-1, 0, 0)
            };

            var revitSpline = Autodesk.Revit.DB.HermiteSpline.Create(pts, false, ts);

            var protoCurve = revitSpline.ToProtoType(false);

            Assert.NotNull(protoCurve);
            Assert.IsAssignableFrom<Autodesk.DesignScript.Geometry.NurbsCurve>(protoCurve);

            var protoSpline = (Autodesk.DesignScript.Geometry.NurbsCurve)protoCurve;

            protoSpline.StartPoint.ShouldBeApproximately(pts[0]);
            protoSpline.EndPoint.ShouldBeApproximately(pts.Last());

            protoSpline.TangentAtParameter(0.0).ShouldBeApproximately(revitSpline.Tangents[0]);
            protoSpline.TangentAtParameter(1.0).ShouldBeApproximately(revitSpline.Tangents.Last());

            var tessPts = revitSpline.Tessellate();

            // assert the tesselation is very close to original curve
            // what's the best tolerance to use here?
            foreach (var pt in tessPts)
            {
                var closestPt = protoSpline.GetClosestPoint(pt.ToPoint(false));
                Assert.Less(closestPt.DistanceTo(pt.ToPoint(false)), 1e-6);
            }

        }