Index: Core/Common/src/Core.Common.Base/Geometry/Point3DExtensions.cs =================================================================== diff -u -r6cdb90fc3f89fe0c44b62d3be7266a0090a6b891 -rca9659ebb5fefd1a32d8b665261ffb136c718297 --- Core/Common/src/Core.Common.Base/Geometry/Point3DExtensions.cs (.../Point3DExtensions.cs) (revision 6cdb90fc3f89fe0c44b62d3be7266a0090a6b891) +++ Core/Common/src/Core.Common.Base/Geometry/Point3DExtensions.cs (.../Point3DExtensions.cs) (revision ca9659ebb5fefd1a32d8b665261ffb136c718297) @@ -61,6 +61,11 @@ throw new ArgumentNullException(nameof(endWorldCoordinate)); } + if (double.IsPositiveInfinity(worldCoordinate.Y) || double.IsNegativeInfinity(worldCoordinate.Y)) + { + return new Point2D(worldCoordinate.Y, worldCoordinate.Z); + } + var worldCoordinate2D = new Point2D(worldCoordinate.X, worldCoordinate.Y); Vector vectorToPoint = worldCoordinate2D - startWorldCoordinate; Index: Core/Common/test/Core.Common.Base.Test/Geometry/Point3DExtensionsTest.cs =================================================================== diff -u -r51b64230b9b947ba32821ed104809429d469959b -rca9659ebb5fefd1a32d8b665261ffb136c718297 --- Core/Common/test/Core.Common.Base.Test/Geometry/Point3DExtensionsTest.cs (.../Point3DExtensionsTest.cs) (revision 51b64230b9b947ba32821ed104809429d469959b) +++ Core/Common/test/Core.Common.Base.Test/Geometry/Point3DExtensionsTest.cs (.../Point3DExtensionsTest.cs) (revision ca9659ebb5fefd1a32d8b665261ffb136c718297) @@ -32,10 +32,10 @@ public void ProjectIntoLocalCoordinates_WorldCoordinateNull_ThrowsArgumentNullException() { // Call - TestDelegate call = () => Point3DExtensions.ProjectIntoLocalCoordinates(null, new Point2D(1.0, 2.0), new Point2D(3.0, 4.0)); + void Call() => Point3DExtensions.ProjectIntoLocalCoordinates(null, new Point2D(1.0, 2.0), new Point2D(3.0, 4.0)); // Assert - var exception = Assert.Throws(call); + var exception = Assert.Throws(Call); Assert.AreEqual("worldCoordinate", exception.ParamName); } @@ -46,10 +46,10 @@ var point = new Point3D(1.0, 2.0, 3.0); // Call - TestDelegate call = () => point.ProjectIntoLocalCoordinates(null, new Point2D(3.0, 4.0)); + void Call() => point.ProjectIntoLocalCoordinates(null, new Point2D(3.0, 4.0)); // Assert - var exception = Assert.Throws(call); + var exception = Assert.Throws(Call); Assert.AreEqual("startWorldCoordinate", exception.ParamName); } @@ -60,17 +60,38 @@ var point = new Point3D(1.0, 2.0, 3.0); // Call - TestDelegate call = () => point.ProjectIntoLocalCoordinates(new Point2D(1.0, 2.0), null); + void Call() => point.ProjectIntoLocalCoordinates(new Point2D(1.0, 2.0), null); // Assert - var exception = Assert.Throws(call); + var exception = Assert.Throws(Call); Assert.AreEqual("endWorldCoordinate", exception.ParamName); } [Test] - public void ProjectIntoLocalCoordinates_WorldCoordinateSameAsStartAndEndWorldCoordinate_ThrowsArgumentException() + [TestCase(double.PositiveInfinity)] + [TestCase(double.NegativeInfinity)] + public void ProjectIntoLocalCoordinates_InfiniteWorldCoordinateY_ReturnsPointAtInfiniteXAndOriginalZ(double worldYCoordinate) { // Setup + double originalZ = new Random(21).NextDouble(); + + var pointToConvert = new Point3D(1.1, worldYCoordinate, originalZ); + + var startPoint = new Point2D(1.0, 1.0); + var endPoint = new Point2D(3.0, 4.0); + + // Call + Point2D convertedPoint = pointToConvert.ProjectIntoLocalCoordinates(startPoint, endPoint); + + // Assert + Assert.AreEqual(worldYCoordinate, convertedPoint.X); + Assert.AreEqual(originalZ, convertedPoint.Y); + } + + [Test] + public void ProjectIntoLocalCoordinates_WorldCoordinateSameAsStartAndEndWorldCoordinate_ReturnsPointAtXZeroAndOriginalZ() + { + // Setup const double originalZ = 3.3; var point = new Point3D(1.1, 2.2, originalZ); @@ -85,7 +106,7 @@ } [Test] - public void ProjectIntoLocalCoordinates_StartAndEndWorldCoordinateLengthSmallerThanTolerance_ThrowsArgumentException() + public void ProjectIntoLocalCoordinates_StartAndEndWorldCoordinateLengthSmallerThanTolerance_ReturnsPointAtXZeroAndOriginalZ() { // Setup const double originalZ = 3.3; @@ -113,10 +134,10 @@ var endPoint = new Point2D(point.X, point.Y + 1e-6); // Call - TestDelegate call = () => point.ProjectIntoLocalCoordinates(startPoint, endPoint); + void Call() => point.ProjectIntoLocalCoordinates(startPoint, endPoint); // Assert - Assert.DoesNotThrow(call); + Assert.DoesNotThrow(Call); } [Test]