Example #1
0
        public void It_Returns_The_Tangent_At_Given_Parameter(double t, double[] tangentData)
        {
            // Arrange
            int           degree = 3;
            List <Point3> pts    = new List <Point3>
            {
                new (0, 0, 0),
                new (1, 0, 0),
                new (2, 0, 0),
                new (3, 0, 0),
                new (4, 0, 0)
            };
            List <double> weights = new List <double> {
                1, 1, 1, 1, 1
            };
            NurbsCurve curve = new NurbsCurve(pts, weights, degree);
            Vector3    tangentExpectedLinearCurve = new Vector3(1, 0, 0);
            Vector3    tangentExpectedPlanarCurve = new Vector3(tangentData[0], tangentData[1], tangentData[2]);

            // Act
            // Act on a linear nurbs curve.
            Vector3 tangentLinearCurve = curve.TangentAt(t);
            Vector3 tangentPlanarCurve = NurbsCurveCollection.PlanarCurveDegreeThree().TangentAt(t);

            // Assert
            (tangentLinearCurve == tangentExpectedLinearCurve).Should().BeTrue();
            tangentPlanarCurve.EpsilonEquals(tangentExpectedPlanarCurve, GSharkMath.MaxTolerance).Should().BeTrue();
        }
Example #2
0
        public void Returns_True_If_Surface_Is_Close()
        {
            // Act
            NurbsSurface surface = NurbsSurface.FromLoft(NurbsCurveCollection.ClosedCurves(), LoftType.Loose);

            // Assert
            surface.IsClosed(SurfaceDirection.V).Should().BeTrue();
        }
Example #3
0
        public void It_Returns_Parameter_At_The_Given_Length(double segmentLength, double tValueExpected)
        {
            // Arrange
            NurbsBase curve = NurbsCurveCollection.PlanarCurveDegreeThree();

            // Act
            double parameter = curve.ParameterAtLength(segmentLength);

            // Assert
            parameter.Should().BeApproximately(tValueExpected, GSharkMath.MinTolerance);
        }
Example #4
0
        public void It_Returns_The_Length_Of_The_Curve()
        {
            // Arrange
            NurbsBase curve          = NurbsCurveCollection.PlanarCurveDegreeThree();
            double    expectedLength = 50.334675;

            // Act
            double crvLength = curve.Length;

            // Assert
            crvLength.Should().BeApproximately(expectedLength, GSharkMath.MinTolerance);
        }
Example #5
0
        public void Lofted_Surface_Throws_An_Exception_If_Curves_Count_Are_Less_Than_Two()
        {
            // Arrange
            NurbsBase[] crvs = { NurbsCurveCollection.OpenCurves()[0] };

            // Act
            Func <NurbsSurface> func = () => NurbsSurface.FromLoft(crvs);

            // Assert
            func.Should().Throw <Exception>()
            .WithMessage("An invalid number of curves to perform the loft.");
        }
Example #6
0
        public void It_Returns_A_Normal_Lofted_Surface_By_Opened_Curves(double u, double v, double[] pt)
        {
            // Arrange
            Point3 expectedPt = new Point3(pt[0], pt[1], pt[2]);

            // Act
            NurbsSurface surface = NurbsSurface.FromLoft(NurbsCurveCollection.OpenCurves());
            Point3       evalPt  = surface.PointAt(u, v);

            // Assert
            surface.Should().NotBeNull();
            evalPt.EpsilonEquals(expectedPt, GSharkMath.MinTolerance).Should().BeTrue();
        }
Example #7
0
        public void Lofted_Surface_Throws_An_Exception_If_The_All_Curves_Are_Not_Closed_Or_Open()
        {
            // Arrange
            List <NurbsBase> crvs = NurbsCurveCollection.OpenCurves();

            crvs[1] = crvs[1].Close();

            // Act
            Func <NurbsSurface> func = () => NurbsSurface.FromLoft(crvs);

            // Assert
            func.Should().Throw <Exception>()
            .WithMessage("Loft only works if all curves are open, or all curves are closed.");
        }
Example #8
0
        public void Lofted_Surface_Throws_An_Exception_If_There_Are_Null_Curves()
        {
            // Arrange
            List <NurbsBase> crvs = NurbsCurveCollection.OpenCurves();

            crvs.Add(null);

            // Act
            Func <NurbsSurface> func = () => NurbsSurface.FromLoft(crvs);

            // Assert
            func.Should().Throw <Exception>()
            .WithMessage("The input set contains null curves.");
        }
Example #9
0
        public void It_Returns_The_Closest_Point_And_Parameter(double[] ptToCheck, double[] ptExpected, double tValExpected)
        {
            // Arrange
            NurbsBase curve      = NurbsCurveCollection.PlanarCurveDegreeThree();
            Point3    testPt     = new Point3(ptToCheck[0], ptToCheck[1], ptToCheck[2]);
            Point3    expectedPt = new Point3(ptExpected[0], ptExpected[1], ptExpected[2]);

            // Act
            Point3 pt        = curve.ClosestPoint(testPt);
            double parameter = curve.ClosestParameter(testPt);

            // Assert
            parameter.Should().BeApproximately(tValExpected, GSharkMath.MaxTolerance);
            pt.EpsilonEquals(expectedPt, GSharkMath.MaxTolerance).Should().BeTrue();
        }
Example #10
0
        public void It_Returns_Parameter_At_The_Given_Length_Of_A_Bezier()
        {
            // Arrange
            NurbsBase curve = NurbsCurveCollection.PlanarCurveDegreeThree();

            double[] tValuesExpected = new[] { 0, 0.122941, 0.265156, 0.420293, 0.579707, 0.734844, 0.877059, 1 };

            int    steps      = 7;
            double length     = curve.Length / steps;
            double sumLengths = 0.0;

            for (int i = 0; i < steps + 1; i++)
            {
                // Act
                double t             = curve.ParameterAtLength(sumLengths);
                double segmentLength = curve.LengthAt(t);

                // Assert
                t.Should().BeApproximately(tValuesExpected[i], GSharkMath.MaxTolerance);
                segmentLength.Should().BeApproximately(sumLengths, GSharkMath.MaxTolerance);

                sumLengths += length;
            }
        }