diff OrthancStone/Sources/Toolbox/DicomStructureSet.cpp @ 1904:738814c24574

speed up rendering of axial slices of RT-STRUCT
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 31 Jan 2022 18:22:57 +0100
parents a5e54bd87b25
children e318b524ad3f
line wrap: on
line diff
--- a/OrthancStone/Sources/Toolbox/DicomStructureSet.cpp	Mon Jan 31 18:00:10 2022 +0100
+++ b/OrthancStone/Sources/Toolbox/DicomStructureSet.cpp	Mon Jan 31 18:22:57 2022 +0100
@@ -274,28 +274,52 @@
     }
   }
 
-  bool DicomStructureSet::Polygon::IsOnSlice(const CoordinateSystem3D& slice) const
+  bool DicomStructureSet::Polygon::IsOnSlice(const CoordinateSystem3D& slice,
+                                             const Vector& estimatedNormal,
+                                             double estimatedSliceThickness) const
   {
     bool isOpposite = false;
 
-    if (points_.empty() ||
-        !hasSlice_ ||
-        !GeometryToolbox::IsParallelOrOpposite(isOpposite, slice.GetNormal(), geometry_.GetNormal()))
+    if (points_.empty())
     {
       return false;
     }
-    
-    double d = GeometryToolbox::ProjectAlongNormal(slice.GetOrigin(), geometry_.GetNormal());
-
-    return (LinearAlgebra::IsNear(d, projectionAlongNormal_,
-                                  sliceThickness_ / 2.0));
+    else if (hasSlice_)
+    {
+      // Use the actual geometry of this specific slice
+      if (!GeometryToolbox::IsParallelOrOpposite(isOpposite, slice.GetNormal(), geometry_.GetNormal()))
+      {
+        return false;
+      }
+      else
+      {
+        double d = GeometryToolbox::ProjectAlongNormal(slice.GetOrigin(), geometry_.GetNormal());
+        return (LinearAlgebra::IsNear(d, projectionAlongNormal_, sliceThickness_ / 2.0));
+      }
+    }
+    else
+    {
+      // Use the estimated geometry for the global RT-STRUCT volume
+      if (!GeometryToolbox::IsParallelOrOpposite(isOpposite, slice.GetNormal(), estimatedNormal))
+      {
+        return false;
+      }
+      else
+      {
+        double d1 = GeometryToolbox::ProjectAlongNormal(slice.GetOrigin(), estimatedNormal);
+        double d2 = GeometryToolbox::ProjectAlongNormal(points_.front(), estimatedNormal);
+        return (LinearAlgebra::IsNear(d1, d2, estimatedSliceThickness / 2.0));
+      }
+    }
   }
     
   bool DicomStructureSet::Polygon::Project(double& x1,
                                            double& y1,
                                            double& x2,
                                            double& y2,
-                                           const CoordinateSystem3D& slice) const
+                                           const CoordinateSystem3D& slice,
+                                           const Vector& estimatedNormal,
+                                           double estimatedSliceThickness) const
   {
     if (!hasSlice_ ||
         points_.size() <= 1)
@@ -841,7 +865,7 @@
       {
         const Points& points = polygon->GetPoints();
         
-        if (polygon->IsOnSlice(slice) &&
+        if (polygon->IsOnSlice(slice, GetEstimatedNormal(), GetEstimatedSliceThickness()) &&
             !points.empty())
         {
           chains.push_back(std::vector<ScenePoint2D>());
@@ -938,7 +962,7 @@
       {
         double x1, y1, x2, y2;
 
-        if (polygon->Project(x1, y1, x2, y2, slice))
+        if (polygon->Project(x1, y1, x2, y2, slice, GetEstimatedNormal(), GetEstimatedSliceThickness()))
         {
           double curZ = polygon->GetGeometryOrigin()[2];