comparison UnitTestsSources/VolumeRenderingTests.cpp @ 1784:42a2880d690f

unit tests for MPR slicing
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 14 May 2021 18:48:55 +0200
parents 75d3e2ab1fe1
children 4fd065ad1fc0
comparison
equal deleted inserted replaced
1783:75d3e2ab1fe1 1784:42a2880d690f
665 } 665 }
666 } 666 }
667 667
668 668
669 669
670 TEST(VolumeRendering, FlipAxial) 670 TEST(VolumeRendering, MPR)
671 { 671 {
672 double x = 2; 672 double x = 2;
673 double y = 1; 673 double y = 1;
674 OrthancStone::CoordinateSystem3D axial(OrthancStone::LinearAlgebra::CreateVector(x, y, 0), 674 OrthancStone::CoordinateSystem3D axial(OrthancStone::LinearAlgebra::CreateVector(x, y, 0),
675 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0), 675 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
809 809
810 Orthanc::ImageAccessor p; 810 Orthanc::ImageAccessor p;
811 rendered->GetRegion(p, 3, 4, 3, 3); 811 rendered->GetRegion(p, 3, 4, 3, 3);
812 ASSERT_TRUE(AreSameImages(p, patternXY)); 812 ASSERT_TRUE(AreSameImages(p, patternXY));
813 } 813 }
814 } 814
815 } 815 // Tests along the sagittal and coronal axis: cf.
816 // "TEST(VolumeRendering, Pattern)" to understand why Z is flipped
817
818 {
819 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 0),
820 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
821 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0));
822
823 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
824 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Sagittal, axial, cuttingPlane, static_cast<SlicerType>(mode)));
825
826 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 1, 3, true));
827 ASSERT_FLOAT_EQ(150, GetPixelValue(*rendered, 0, 0));
828 ASSERT_FLOAT_EQ(175, GetPixelValue(*rendered, 0, 1));
829 ASSERT_FLOAT_EQ(200, GetPixelValue(*rendered, 0, 2));
830 }
831
832 {
833 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 1),
834 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
835 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0));
836
837 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
838 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Sagittal, axial, cuttingPlane, static_cast<SlicerType>(mode)));
839
840 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 1, 3, true));
841 ASSERT_FLOAT_EQ(75, GetPixelValue(*rendered, 0, 0));
842 ASSERT_FLOAT_EQ(100, GetPixelValue(*rendered, 0, 1));
843 ASSERT_FLOAT_EQ(125, GetPixelValue(*rendered, 0, 2));
844 }
845
846 {
847 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 2),
848 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
849 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0));
850
851 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
852 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Sagittal, axial, cuttingPlane, static_cast<SlicerType>(mode)));
853
854 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 1, 3, true));
855 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0));
856 ASSERT_FLOAT_EQ(25, GetPixelValue(*rendered, 0, 1));
857 ASSERT_FLOAT_EQ(50, GetPixelValue(*rendered, 0, 2));
858 }
859
860 for (double z = -1; z < 4; z += 4) // z in { -1, 3 }, out of volume
861 {
862 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, z),
863 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
864 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0));
865
866 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
867 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Sagittal, axial, cuttingPlane, static_cast<SlicerType>(mode)));
868
869 ASSERT_TRUE(layer.get() == NULL || // This is for DicomVolumeImageMPRSlicer
870 (layer->GetTexture().GetWidth() == 0 && // This is for DicomVolumeImageReslicer
871 layer->GetTexture().GetHeight() == 0));
872 }
873
874 {
875 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 0),
876 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
877 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0));
878
879 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
880 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Coronal, axial, cuttingPlane, static_cast<SlicerType>(mode)));
881
882 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 3, 1, true));
883 ASSERT_FLOAT_EQ(150, GetPixelValue(*rendered, 0, 0));
884 ASSERT_FLOAT_EQ(175, GetPixelValue(*rendered, 1, 0));
885 ASSERT_FLOAT_EQ(200, GetPixelValue(*rendered, 2, 0));
886 }
887
888 {
889 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 1),
890 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
891 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0));
892
893 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
894 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Coronal, axial, cuttingPlane, static_cast<SlicerType>(mode)));
895
896 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 3, 1, true));
897 ASSERT_FLOAT_EQ(75, GetPixelValue(*rendered, 0, 0));
898 ASSERT_FLOAT_EQ(100, GetPixelValue(*rendered, 1, 0));
899 ASSERT_FLOAT_EQ(125, GetPixelValue(*rendered, 2, 0));
900 }
901
902 {
903 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 2),
904 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
905 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0));
906
907 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
908 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Coronal, axial, cuttingPlane, static_cast<SlicerType>(mode)));
909
910 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 3, 1, true));
911 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0));
912 ASSERT_FLOAT_EQ(25, GetPixelValue(*rendered, 1, 0));
913 ASSERT_FLOAT_EQ(50, GetPixelValue(*rendered, 2, 0));
914 }
915
916 for (double z = -1; z < 4; z += 4) // z in { -1, 3 }, out of volume
917 {
918 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, z),
919 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
920 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0));
921
922 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
923 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Coronal, axial, cuttingPlane, static_cast<SlicerType>(mode)));
924
925 ASSERT_TRUE(layer.get() == NULL || // This is for DicomVolumeImageMPRSlicer
926 (layer->GetTexture().GetWidth() == 0 && // This is for DicomVolumeImageReslicer
927 layer->GetTexture().GetHeight() == 0));
928 }
929 }
930 }