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