NavisworksTransport/UnitTests/CoordinateSystem/AssemblyEndFaceAnalyzerTests.cs

114 lines
4.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Numerics;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NavisworksTransport.Utils.GeometryAnalysis;
namespace NavisworksTransport.UnitTests.CoordinateSystem
{
[TestClass]
public class AssemblyEndFaceAnalyzerTests
{
[TestMethod]
public void Analyze_RectangularFaceWithSideNoise_ShouldReturnFaceCenter()
{
var triangles = new List<AnalysisTriangle3>();
triangles.AddRange(CreateRectangleFace(-2.0, 2.0, -1.0, 1.0, 10.0));
triangles.AddRange(CreateRectangleFace(-2.0, 2.0, -1.0, 1.0, 8.0));
triangles.Add(new AnalysisTriangle3(
new Vector3(-2.0f, -1.0f, 10.0f),
new Vector3(-2.0f, -1.0f, 9.0f),
new Vector3(-2.0f, 1.0f, 9.0f)));
EndFaceAnalysisResult result = AssemblyEndFaceAnalyzer.Analyze(
triangles,
new Vector3(-1.5f, -0.7f, 10.0f),
new Vector3(1.4f, -0.5f, 10.0f),
new Vector3(1.1f, 0.8f, 10.0f));
Assert.IsTrue(result.IsReliable, result.DiagnosticMessage);
AssertPoint(result.Center, 0.0, 0.0, 10.0);
Assert.AreEqual(2, result.CandidateTriangleCount);
}
[TestMethod]
public void Analyze_SquareRingFace_ShouldReturnRingCenter()
{
var triangles = new List<AnalysisTriangle3>();
triangles.AddRange(CreateRingFace(4.0, 2.0, 5.0));
EndFaceAnalysisResult result = AssemblyEndFaceAnalyzer.Analyze(
triangles,
new Vector3(-3.5f, -3.5f, 5.0f),
new Vector3(3.5f, -3.5f, 5.0f),
new Vector3(3.5f, 3.5f, 5.0f));
Assert.IsTrue(result.IsReliable, result.DiagnosticMessage);
AssertPoint(result.Center, 0.0, 0.0, 5.0);
Assert.IsTrue(result.CandidateTriangleCount >= 8);
}
[TestMethod]
public void Analyze_NearlyCollinearSeedPoints_ShouldFail()
{
var triangles = new List<AnalysisTriangle3>();
triangles.AddRange(CreateRectangleFace(-1.0, 1.0, -1.0, 1.0, 0.0));
EndFaceAnalysisResult result = AssemblyEndFaceAnalyzer.Analyze(
triangles,
new Vector3(0.0f, 0.0f, 0.0f),
new Vector3(1.0f, 0.0f, 0.0f),
new Vector3(2.0f, 0.0f, 0.0f));
Assert.IsFalse(result.IsReliable);
}
private static IEnumerable<AnalysisTriangle3> CreateRectangleFace(double minX, double maxX, double minY, double maxY, double z)
{
yield return new AnalysisTriangle3(
new Vector3((float)minX, (float)minY, (float)z),
new Vector3((float)maxX, (float)minY, (float)z),
new Vector3((float)maxX, (float)maxY, (float)z));
yield return new AnalysisTriangle3(
new Vector3((float)minX, (float)minY, (float)z),
new Vector3((float)maxX, (float)maxY, (float)z),
new Vector3((float)minX, (float)maxY, (float)z));
}
private static IEnumerable<AnalysisTriangle3> CreateRingFace(double outerHalfSize, double innerHalfSize, double z)
{
if (innerHalfSize >= outerHalfSize)
{
throw new ArgumentOutOfRangeException(nameof(innerHalfSize));
}
foreach (AnalysisTriangle3 triangle in CreateRectangleFace(-outerHalfSize, outerHalfSize, innerHalfSize, outerHalfSize, z))
{
yield return triangle;
}
foreach (AnalysisTriangle3 triangle in CreateRectangleFace(-outerHalfSize, outerHalfSize, -outerHalfSize, -innerHalfSize, z))
{
yield return triangle;
}
foreach (AnalysisTriangle3 triangle in CreateRectangleFace(-outerHalfSize, -innerHalfSize, -innerHalfSize, innerHalfSize, z))
{
yield return triangle;
}
foreach (AnalysisTriangle3 triangle in CreateRectangleFace(innerHalfSize, outerHalfSize, -innerHalfSize, innerHalfSize, z))
{
yield return triangle;
}
}
private static void AssertPoint(Vector3 actual, double x, double y, double z)
{
Assert.AreEqual(x, actual.X, 1e-5);
Assert.AreEqual(y, actual.Y, 1e-5);
Assert.AreEqual(z, actual.Z, 1e-5);
}
}
}