diff OrthancStone/Sources/Volumes/DicomVolumeImageMPRSlicer.cpp @ 1768:226718777702

fix DicomVolumeImageMPRSlicer::Slice::CreateSceneLayer() for opposite normals
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 11 May 2021 17:18:39 +0200
parents 9ac2a65d4172
children a217140dd41a
line wrap: on
line diff
--- a/OrthancStone/Sources/Volumes/DicomVolumeImageMPRSlicer.cpp	Tue May 11 11:42:08 2021 +0200
+++ b/OrthancStone/Sources/Volumes/DicomVolumeImageMPRSlicer.cpp	Tue May 11 17:18:39 2021 +0200
@@ -89,27 +89,44 @@
     }
     
     const CoordinateSystem3D& system = volume_.GetGeometry().GetProjectionGeometry(projection_);
-      
-    double x0, y0, x1, y1;
-    cuttingPlane.ProjectPoint(x0, y0, system.GetOrigin());
-    cuttingPlane.ProjectPoint(x1, y1, system.GetOrigin() + system.GetAxisX());
 
-    {
-      double xz, yz;
-      cuttingPlane.ProjectPoint(xz, yz, LinearAlgebra::CreateVector(0, 0, 0));
-      texture->SetOrigin(x0 - xz, y0 - yz);
-    }
+    /**
+     * TODO => There was a shift of (0.5, 0.5) introduced by
+     * TextureBaseSceneLayer::GetTransform(). Is it an error?
+     **/
+    
+    Vector pixelSpacing = volume_.GetGeometry().GetVoxelDimensions(projection_);
+
+    double x0, y0, x1, y1, x2, y2;
+    cuttingPlane.ProjectPoint(x0, y0, system.GetOrigin());
+    cuttingPlane.ProjectPoint(x1, y1, system.GetOrigin() + system.GetAxisX() * pixelSpacing[0]);
+    cuttingPlane.ProjectPoint(x2, y2, system.GetOrigin() + system.GetAxisY() * pixelSpacing[1]);
+
+    /**
 
-    double dx = x1 - x0;
-    double dy = y1 - y0;
-    if (!LinearAlgebra::IsCloseToZero(dx) ||
-        !LinearAlgebra::IsCloseToZero(dy))
-    {
-      texture->SetAngle(atan2(dy, dx));
-    }
+       A = [ a11 a12 ; a21 a22 ]
+       
+       (1) A * (0 ; 0) + (b1 ; b2) = (x0 ; y0)
+       (2) A * (1 ; 0) + (b1 ; b2) = (x1 ; y1)
+       (3) A * (0 ; 1) + (b1 ; b2) = (x2 ; y2)
+
+       (2-1) A * (1 ; 0) = (x1 - x0 ; y1 - y0) <=> (a11 ; a21) = (x1 - x0 ; y1 - y0)
+       (3-1) A * (0 ; 1) = (x2 - x0 ; y2 - y0) <=> (a12 ; a22) = (x2 - x0 ; y2 - y0)
+
+    **/
 
-    Vector tmp = volume_.GetGeometry().GetVoxelDimensions(projection_);
-    texture->SetPixelSpacing(tmp[0], tmp[1]);
+    Matrix m(3, 3);
+    m(0, 0) = x1 - x0;  // a11
+    m(0, 1) = x2 - x0;  // a12
+    m(0, 2) = x0;       // b1
+    m(1, 0) = y1 - y0;  // a21
+    m(1, 1) = y2 - y0;  // a22
+    m(1, 2) = y0;       // b2
+    m(2, 0) = 0;
+    m(2, 1) = 0;
+    m(2, 2) = 1;
+    
+    texture->SetTransform(AffineTransform2D(m));
 
     return texture.release();
   }