add tests and correction for edge cases
This commit is contained in:
@@ -9,7 +9,6 @@ namespace PointCloudWeb.Server.Tests.Services
|
|||||||
{
|
{
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[InlineData(1, 1, 1)]
|
|
||||||
[InlineData(2, 2, 2)]
|
[InlineData(2, 2, 2)]
|
||||||
[InlineData(2, 1, 1)]
|
[InlineData(2, 1, 1)]
|
||||||
[InlineData(1, 2, 1)]
|
[InlineData(1, 2, 1)]
|
||||||
@@ -17,6 +16,13 @@ namespace PointCloudWeb.Server.Tests.Services
|
|||||||
[InlineData(10, 15, 32)]
|
[InlineData(10, 15, 32)]
|
||||||
[InlineData(5, 12, 7)]
|
[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)]
|
[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(-5, -12, 7)]
|
||||||
[InlineData(-22, 13, 11)]
|
[InlineData(-22, 13, 11)]
|
||||||
|
|
||||||
//[InlineData(1, 1, -1)]
|
[InlineData(0, 0, -1)]
|
||||||
//[InlineData(-1, 1, -1)]
|
[InlineData(0, -1, -1)]
|
||||||
//[InlineData(1, -1, -1)]
|
[InlineData(-1, 0, -1)]
|
||||||
//[InlineData(5, 12, -7)]
|
[InlineData(-1, -1, -1)]
|
||||||
//[InlineData(-5, 12, -7)]
|
|
||||||
//[InlineData(-5, -12, -7)]
|
[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)
|
public static void ScanConverterTest(int x, int y, int z)
|
||||||
{
|
{
|
||||||
var scan = new ScanDataPoint
|
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))
|
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
|
//from rad to degree
|
||||||
scan.RAX = scan.RAX * 180 / Math.PI;
|
scan.RAX = scan.RAX * 180 / Math.PI;
|
||||||
scan.RAY = scan.RAY * 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 expected = new Point(x, y, z);
|
||||||
|
|
||||||
var service = new ScanConverterService();
|
var service = new ScanConverterService();
|
||||||
var point = service.Transform(scan);
|
var point = service.Transform(scan);
|
||||||
Assert.Equal(expected, point);
|
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;
|
|
||||||
//}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,32 +6,22 @@ namespace PointCloudWeb.Server.Services
|
|||||||
{
|
{
|
||||||
public class ScanConverterService
|
public class ScanConverterService
|
||||||
{
|
{
|
||||||
|
private int Round(double value) => (int)Math.Round(double.IsNaN(value) ? 0 : value, 0, MidpointRounding.AwayFromZero);
|
||||||
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);
|
|
||||||
public Point Transform(ScanDataPoint scan)
|
public Point Transform(ScanDataPoint scan)
|
||||||
{
|
{
|
||||||
|
var factorZ = 1;
|
||||||
|
|
||||||
var degreeXA = scan.RAX;
|
var degreeXA = scan.RAX;
|
||||||
var degreeXB = 180 - 90 - degreeXA;
|
|
||||||
var degreeYA = scan.RAY;
|
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 degreeYB = 180 - 90 - degreeYA;
|
||||||
|
|
||||||
var radXA = degreeXA * Math.PI / 180;
|
var radXA = degreeXA * Math.PI / 180;
|
||||||
@@ -58,7 +48,7 @@ namespace PointCloudWeb.Server.Services
|
|||||||
{
|
{
|
||||||
X = Round(z * sinYB / sinYA),
|
X = Round(z * sinYB / sinYA),
|
||||||
Y = Round(z * sinXB / sinXA),
|
Y = Round(z * sinXB / sinXA),
|
||||||
Z = Round(z)
|
Z = factorZ * Round(z)
|
||||||
};
|
};
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
|
|||||||
Reference in New Issue
Block a user