From 4809964d3dcc4b48a732bbe42f860c2398399e44 Mon Sep 17 00:00:00 2001 From: Tim Wundenberg Date: Fri, 16 Jul 2021 22:41:55 +0200 Subject: [PATCH] add tests and correction for edge cases --- .../Services/ScanConverterServiceTest.cs | 54 ++++++++++--------- .../Services/ScanConverterService.cs | 36 +++++-------- 2 files changed, 43 insertions(+), 47 deletions(-) diff --git a/PointCloudWeb.Server/PointCloudWeb.Server.Tests/Services/ScanConverterServiceTest.cs b/PointCloudWeb.Server/PointCloudWeb.Server.Tests/Services/ScanConverterServiceTest.cs index 96493f8..11220d4 100644 --- a/PointCloudWeb.Server/PointCloudWeb.Server.Tests/Services/ScanConverterServiceTest.cs +++ b/PointCloudWeb.Server/PointCloudWeb.Server.Tests/Services/ScanConverterServiceTest.cs @@ -9,7 +9,6 @@ namespace PointCloudWeb.Server.Tests.Services { [Theory] - [InlineData(1, 1, 1)] [InlineData(2, 2, 2)] [InlineData(2, 1, 1)] [InlineData(1, 2, 1)] @@ -17,6 +16,13 @@ namespace PointCloudWeb.Server.Tests.Services [InlineData(10, 15, 32)] [InlineData(5, 12, 7)] + //Z = 0 is not possible due to lack of Information + [InlineData(0, 0, 0)] + [InlineData(0, 0, 1)] + [InlineData(0, 1, 1)] + [InlineData(1, 0, 1)] + [InlineData(1, 1, 1)] + [InlineData(-1, 1, 1)] [InlineData(1, -1, 1)] [InlineData(-1, -1, 1)] @@ -24,12 +30,17 @@ namespace PointCloudWeb.Server.Tests.Services [InlineData(-5, -12, 7)] [InlineData(-22, 13, 11)] - //[InlineData(1, 1, -1)] - //[InlineData(-1, 1, -1)] - //[InlineData(1, -1, -1)] - //[InlineData(5, 12, -7)] - //[InlineData(-5, 12, -7)] - //[InlineData(-5, -12, -7)] + [InlineData(0, 0, -1)] + [InlineData(0, -1, -1)] + [InlineData(-1, 0, -1)] + [InlineData(-1, -1, -1)] + + [InlineData(1, 1, -1)] + [InlineData(5, 12, -7)] + [InlineData(-1, 1, -1)] + [InlineData(1, -1, -1)] + [InlineData(-5, 12, -7)] + [InlineData(-5, -12, -7)] public static void ScanConverterTest(int x, int y, int z) { var scan = new ScanDataPoint @@ -39,32 +50,27 @@ namespace PointCloudWeb.Server.Tests.Services DistanceMM = (float)Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2) + Math.Pow(z, 2)) }; + if (double.IsNaN(scan.RAX)) + scan.RAX = 0; + if (double.IsNaN(scan.RAY)) + scan.RAY = 0; + //from rad to degree scan.RAX = scan.RAX * 180 / Math.PI; scan.RAY = scan.RAY * 180 / Math.PI; + + if (z < 0) + { + scan.RAX += 270; + scan.RAY += 270; + } + var expected = new Point(x, y, z); var service = new ScanConverterService(); var point = service.Transform(scan); Assert.Equal(expected, point); - //if (scan.RAX >= 0 && scan.RAX < 90) - // scan.RAY = 360 - scan.RAY; - //else if (scan.RAX >= 90 && scan.RAX < 180) - // scan.RAY = 180 - scan.RAY; - - //if (scan.RAX < 270 && scan.RAY >= 270 && scan.RAY < 360) - // scan.RAX = 360 - scan.RAX; - //else if (angle >= 180 && angle < 270) - //{ - // sin *= -1; - // cos *= -1; - //} - //else if (angle >= 270 && angle < 360) - //{ - // sin *= -1; - //} - } } } diff --git a/PointCloudWeb.Server/PointCloudWeb.Server/Services/ScanConverterService.cs b/PointCloudWeb.Server/PointCloudWeb.Server/Services/ScanConverterService.cs index e165669..b9143be 100644 --- a/PointCloudWeb.Server/PointCloudWeb.Server/Services/ScanConverterService.cs +++ b/PointCloudWeb.Server/PointCloudWeb.Server/Services/ScanConverterService.cs @@ -6,32 +6,22 @@ namespace PointCloudWeb.Server.Services { public class ScanConverterService { - - private static void CorrectQuadrants(double angle, ref float sin, ref float cos) - { - if (angle < 0 || angle >= 360) - throw new ArgumentOutOfRangeException(); - if (angle > 90 && angle < 180) - { - cos *= -1; - } - else if (angle >= 180 && angle < 270) - { - sin *= -1; - cos *= -1; - } - else if (angle >= 270 && angle < 360) - { - sin *= -1; - } - } - - private int Round(double value) => (int)Math.Round(value, 0, MidpointRounding.AwayFromZero); + private int Round(double value) => (int)Math.Round(double.IsNaN(value) ? 0 : value, 0, MidpointRounding.AwayFromZero); public Point Transform(ScanDataPoint scan) { + var factorZ = 1; + var degreeXA = scan.RAX; - var degreeXB = 180 - 90 - degreeXA; var degreeYA = scan.RAY; + + if (degreeXA > 270 && degreeYA > 270) + { + degreeXA -= 270; + degreeYA -= 270; + factorZ = -1; + } + + var degreeXB = 180 - 90 - degreeXA; var degreeYB = 180 - 90 - degreeYA; var radXA = degreeXA * Math.PI / 180; @@ -58,7 +48,7 @@ namespace PointCloudWeb.Server.Services { X = Round(z * sinYB / sinYA), Y = Round(z * sinXB / sinXA), - Z = Round(z) + Z = factorZ * Round(z) }; return p;