diff UnitTestsSources/GeometryToolboxTests.cpp @ 1766:ae18b5cfbd3e

VolumeImageGeometry::DetectProjection() reports if normal is opposite
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 11 May 2021 11:31:34 +0200
parents 177f93c8371c
children 3889ae96d2e9
line wrap: on
line diff
--- a/UnitTestsSources/GeometryToolboxTests.cpp	Tue May 11 11:01:22 2021 +0200
+++ b/UnitTestsSources/GeometryToolboxTests.cpp	Tue May 11 11:31:34 2021 +0200
@@ -666,12 +666,16 @@
   ASSERT_DOUBLE_EQ(-3.0 / 2.0 + 30.0 * 3.0, p[2]);
 
   VolumeProjection proj;
-  ASSERT_TRUE(g.DetectProjection(proj, g.GetAxialGeometry().GetNormal()));
+  bool isOpposite;
+  ASSERT_TRUE(g.DetectProjection(proj, isOpposite, g.GetAxialGeometry().GetNormal()));
   ASSERT_EQ(VolumeProjection_Axial, proj);
-  ASSERT_TRUE(g.DetectProjection(proj, g.GetCoronalGeometry().GetNormal()));
+  ASSERT_FALSE(isOpposite);
+  ASSERT_TRUE(g.DetectProjection(proj, isOpposite, g.GetCoronalGeometry().GetNormal()));
   ASSERT_EQ(VolumeProjection_Coronal, proj);
-  ASSERT_TRUE(g.DetectProjection(proj, g.GetSagittalGeometry().GetNormal()));
+  ASSERT_FALSE(isOpposite);
+  ASSERT_TRUE(g.DetectProjection(proj, isOpposite, g.GetSagittalGeometry().GetNormal()));
   ASSERT_EQ(VolumeProjection_Sagittal, proj);
+  ASSERT_FALSE(isOpposite);
 
   ASSERT_EQ(10u, g.GetProjectionWidth(VolumeProjection_Axial));
   ASSERT_EQ(20u, g.GetProjectionHeight(VolumeProjection_Axial));
@@ -1034,6 +1038,7 @@
     double spacingZ;
     ASSERT_TRUE(slices.ComputeSpacingBetweenSlices(spacingZ));
     ASSERT_FLOAT_EQ(1, spacingZ);
+    ASSERT_TRUE(slices.AreAllSlicesDistinct());
 
     ASSERT_FLOAT_EQ(300.0, slices.GetSliceGeometry(0).GetOrigin() [0]);
     ASSERT_FLOAT_EQ(302.5, slices.GetSliceGeometry(0).GetOrigin() [1]);
@@ -1056,20 +1061,31 @@
     geometry.SetVoxelDimensions(spacingXY, spacingXY, 1);
     geometry.SetAxialGeometry(slices.GetSliceGeometry(0));
 
-    OrthancStone::Vector p, q;
-
-    p = OrthancStone::LinearAlgebra::CreateVector(0, 0, 0, 1);
-    q = OrthancStone::LinearAlgebra::Product(geometry.GetTransform(), p);
+    OrthancStone::Vector q = geometry.GetCoordinates(0, 0, 0);
+    ASSERT_EQ(3u, q.size());
     ASSERT_FLOAT_EQ(300 + spacingXY / 2.0, q[0]);
     ASSERT_FLOAT_EQ(302.5 + spacingXY / 2.0, q[1]);
     ASSERT_FLOAT_EQ(323.11 - 0.5, q[2]);
-    ASSERT_FLOAT_EQ(1, q[3]);
 
-    p = OrthancStone::LinearAlgebra::CreateVector(1, 1, 1, 1);
-    q = OrthancStone::LinearAlgebra::Product(geometry.GetTransform(), p);
+    q = geometry.GetCoordinates(1, 1, 1);
+    ASSERT_EQ(3u, q.size());
     ASSERT_FLOAT_EQ(300 - double(width) * spacingXY + spacingXY / 2.0, q[0]);
     ASSERT_FLOAT_EQ(302.5 - double(height) * spacingXY + spacingXY / 2.0, q[1]);
     ASSERT_FLOAT_EQ(323.11 + 368.0 - 0.5, q[2]);
-    ASSERT_FLOAT_EQ(1, q[3]);
+
+    OrthancStone::VolumeProjection projection;
+    unsigned int slice;
+    ASSERT_TRUE(geometry.DetectSlice(projection, slice, OrthancStone::CoordinateSystem3D("300\\302.5\\690.11", "-1\\0\\0\\0\\-1\\0")));
+    ASSERT_EQ(OrthancStone::VolumeProjection_Axial, projection);
+    ASSERT_EQ(367u, slice);
+    ASSERT_TRUE(geometry.DetectSlice(projection, slice, OrthancStone::CoordinateSystem3D("300\\302.5\\323.11", "-1\\0\\0\\0\\-1\\0")));
+    ASSERT_EQ(OrthancStone::VolumeProjection_Axial, projection);
+    ASSERT_EQ(0u, slice);
+
+    // DOSE instance: RD1.2.752.243.1.1.20210202150624529.3790.85357_DoseTPS.dcm
+    ASSERT_TRUE(geometry.DetectSlice(projection, slice,
+                                     OrthancStone::CoordinateSystem3D("-217.0492\\-161.4141\\376.61", "1\\0\\0\\0\\1\\0")));
+    ASSERT_EQ(OrthancStone::VolumeProjection_Axial, projection);
+    ASSERT_EQ(376u - 323u, slice);
   }
 }