# HG changeset patch # User Sebastien Jodogne # Date 1621010935 -7200 # Node ID 42a2880d690f1492db1af1aa5fb844e5dd6bd6a6 # Parent 75d3e2ab1fe165f4c5de7e23a78cf09ca8bafd4a unit tests for MPR slicing diff -r 75d3e2ab1fe1 -r 42a2880d690f UnitTestsSources/VolumeRenderingTests.cpp --- a/UnitTestsSources/VolumeRenderingTests.cpp Fri May 14 18:30:24 2021 +0200 +++ b/UnitTestsSources/VolumeRenderingTests.cpp Fri May 14 18:48:55 2021 +0200 @@ -667,7 +667,7 @@ -TEST(VolumeRendering, FlipAxial) +TEST(VolumeRendering, MPR) { double x = 2; double y = 1; @@ -811,5 +811,120 @@ rendered->GetRegion(p, 3, 4, 3, 3); ASSERT_TRUE(AreSameImages(p, patternXY)); } + + // Tests along the sagittal and coronal axis: cf. + // "TEST(VolumeRendering, Pattern)" to understand why Z is flipped + + { + OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 0), + OrthancStone::LinearAlgebra::CreateVector(1, 0, 0), + OrthancStone::LinearAlgebra::CreateVector(0, 1, 0)); + + std::unique_ptr layer( + Slice3x3x1Pattern(OrthancStone::VolumeProjection_Sagittal, axial, cuttingPlane, static_cast(mode))); + + std::unique_ptr rendered(Render(layer.release(), 1, 3, true)); + ASSERT_FLOAT_EQ(150, GetPixelValue(*rendered, 0, 0)); + ASSERT_FLOAT_EQ(175, GetPixelValue(*rendered, 0, 1)); + ASSERT_FLOAT_EQ(200, GetPixelValue(*rendered, 0, 2)); + } + + { + OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 1), + OrthancStone::LinearAlgebra::CreateVector(1, 0, 0), + OrthancStone::LinearAlgebra::CreateVector(0, 1, 0)); + + std::unique_ptr layer( + Slice3x3x1Pattern(OrthancStone::VolumeProjection_Sagittal, axial, cuttingPlane, static_cast(mode))); + + std::unique_ptr rendered(Render(layer.release(), 1, 3, true)); + ASSERT_FLOAT_EQ(75, GetPixelValue(*rendered, 0, 0)); + ASSERT_FLOAT_EQ(100, GetPixelValue(*rendered, 0, 1)); + ASSERT_FLOAT_EQ(125, GetPixelValue(*rendered, 0, 2)); + } + + { + OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 2), + OrthancStone::LinearAlgebra::CreateVector(1, 0, 0), + OrthancStone::LinearAlgebra::CreateVector(0, 1, 0)); + + std::unique_ptr layer( + Slice3x3x1Pattern(OrthancStone::VolumeProjection_Sagittal, axial, cuttingPlane, static_cast(mode))); + + std::unique_ptr rendered(Render(layer.release(), 1, 3, true)); + ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0)); + ASSERT_FLOAT_EQ(25, GetPixelValue(*rendered, 0, 1)); + ASSERT_FLOAT_EQ(50, GetPixelValue(*rendered, 0, 2)); + } + + for (double z = -1; z < 4; z += 4) // z in { -1, 3 }, out of volume + { + OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, z), + OrthancStone::LinearAlgebra::CreateVector(1, 0, 0), + OrthancStone::LinearAlgebra::CreateVector(0, 1, 0)); + + std::unique_ptr layer( + Slice3x3x1Pattern(OrthancStone::VolumeProjection_Sagittal, axial, cuttingPlane, static_cast(mode))); + + ASSERT_TRUE(layer.get() == NULL || // This is for DicomVolumeImageMPRSlicer + (layer->GetTexture().GetWidth() == 0 && // This is for DicomVolumeImageReslicer + layer->GetTexture().GetHeight() == 0)); + } + + { + OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 0), + OrthancStone::LinearAlgebra::CreateVector(1, 0, 0), + OrthancStone::LinearAlgebra::CreateVector(0, 1, 0)); + + std::unique_ptr layer( + Slice3x3x1Pattern(OrthancStone::VolumeProjection_Coronal, axial, cuttingPlane, static_cast(mode))); + + std::unique_ptr rendered(Render(layer.release(), 3, 1, true)); + ASSERT_FLOAT_EQ(150, GetPixelValue(*rendered, 0, 0)); + ASSERT_FLOAT_EQ(175, GetPixelValue(*rendered, 1, 0)); + ASSERT_FLOAT_EQ(200, GetPixelValue(*rendered, 2, 0)); + } + + { + OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 1), + OrthancStone::LinearAlgebra::CreateVector(1, 0, 0), + OrthancStone::LinearAlgebra::CreateVector(0, 1, 0)); + + std::unique_ptr layer( + Slice3x3x1Pattern(OrthancStone::VolumeProjection_Coronal, axial, cuttingPlane, static_cast(mode))); + + std::unique_ptr rendered(Render(layer.release(), 3, 1, true)); + ASSERT_FLOAT_EQ(75, GetPixelValue(*rendered, 0, 0)); + ASSERT_FLOAT_EQ(100, GetPixelValue(*rendered, 1, 0)); + ASSERT_FLOAT_EQ(125, GetPixelValue(*rendered, 2, 0)); + } + + { + OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 2), + OrthancStone::LinearAlgebra::CreateVector(1, 0, 0), + OrthancStone::LinearAlgebra::CreateVector(0, 1, 0)); + + std::unique_ptr layer( + Slice3x3x1Pattern(OrthancStone::VolumeProjection_Coronal, axial, cuttingPlane, static_cast(mode))); + + std::unique_ptr rendered(Render(layer.release(), 3, 1, true)); + ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0)); + ASSERT_FLOAT_EQ(25, GetPixelValue(*rendered, 1, 0)); + ASSERT_FLOAT_EQ(50, GetPixelValue(*rendered, 2, 0)); + } + + for (double z = -1; z < 4; z += 4) // z in { -1, 3 }, out of volume + { + OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, z), + OrthancStone::LinearAlgebra::CreateVector(1, 0, 0), + OrthancStone::LinearAlgebra::CreateVector(0, 1, 0)); + + std::unique_ptr layer( + Slice3x3x1Pattern(OrthancStone::VolumeProjection_Coronal, axial, cuttingPlane, static_cast(mode))); + + ASSERT_TRUE(layer.get() == NULL || // This is for DicomVolumeImageMPRSlicer + (layer->GetTexture().GetWidth() == 0 && // This is for DicomVolumeImageReslicer + layer->GetTexture().GetHeight() == 0)); + } } }