# HG changeset patch # User Sebastien Jodogne # Date 1620807973 -7200 # Node ID a217140dd41a2dc891ae30741ada417920d77bfd # Parent 226718777702e0094cdff788f4209fb0dec1ffe1 refactoring diff -r 226718777702 -r a217140dd41a OrthancStone/Sources/Scene2D/TextureBaseSceneLayer.cpp --- a/OrthancStone/Sources/Scene2D/TextureBaseSceneLayer.cpp Tue May 11 17:18:39 2021 +0200 +++ b/OrthancStone/Sources/Scene2D/TextureBaseSceneLayer.cpp Wed May 12 10:26:13 2021 +0200 @@ -160,6 +160,44 @@ } + void TextureBaseSceneLayer::SetCuttingPlaneTransform(const CoordinateSystem3D& cuttingPlane, + const Vector& origin, + const Vector& pixelOffsetX, + const Vector& pixelOffsetY) + { + double x0, y0, x1, y1, x2, y2; + cuttingPlane.ProjectPoint(x0, y0, origin); + cuttingPlane.ProjectPoint(x1, y1, origin + pixelOffsetX); + cuttingPlane.ProjectPoint(x2, y2, origin + pixelOffsetY); + + /** + + 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) + + **/ + + 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; + + SetTransform(AffineTransform2D(m)); + } + + AffineTransform2D TextureBaseSceneLayer::GetTransform() const { if (transform_.get() == NULL) diff -r 226718777702 -r a217140dd41a OrthancStone/Sources/Scene2D/TextureBaseSceneLayer.h --- a/OrthancStone/Sources/Scene2D/TextureBaseSceneLayer.h Tue May 11 17:18:39 2021 +0200 +++ b/OrthancStone/Sources/Scene2D/TextureBaseSceneLayer.h Wed May 12 10:26:13 2021 +0200 @@ -24,6 +24,7 @@ #include "ISceneLayer.h" #include "../Toolbox/AffineTransform2D.h" +#include "../Toolbox/CoordinateSystem3D.h" #include #include @@ -125,6 +126,14 @@ void ClearTransform(); + // Initialize a transform that maps a texture slice in 3D, to a + // cutting plane (the cutting plane should be parallel to the 3D + // slice). The "pixelOffsetX/Y" must take pixel spacing into account. + void SetCuttingPlaneTransform(const CoordinateSystem3D& cuttingPlane, + const Vector& origin, // coordinates of the center of the voxel + const Vector& pixelOffsetX, // 3D offset from (0,0) voxel to (1,0) voxel + const Vector& pixelOffsetY); // 3D offset from (0,0) voxel to (0,1) voxel + AffineTransform2D GetTransform() const; virtual void GetBoundingBox(Extent2D& target) const ORTHANC_OVERRIDE; diff -r 226718777702 -r a217140dd41a OrthancStone/Sources/Volumes/DicomVolumeImageMPRSlicer.cpp --- a/OrthancStone/Sources/Volumes/DicomVolumeImageMPRSlicer.cpp Tue May 11 17:18:39 2021 +0200 +++ b/OrthancStone/Sources/Volumes/DicomVolumeImageMPRSlicer.cpp Wed May 12 10:26:13 2021 +0200 @@ -97,36 +97,9 @@ 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]); - - /** - - 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) - - **/ - - 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)); + texture->SetCuttingPlaneTransform(cuttingPlane, system.GetOrigin(), + system.GetAxisX() * pixelSpacing[0], + system.GetAxisY() * pixelSpacing[1]); return texture.release(); }