diff --git a/Modules/Core/Common/test/Baseline/itkPointSetToImageFilterTest1.png.sha512 b/Modules/Core/Common/test/Baseline/itkPointSetToImageFilterTest1.png.sha512 new file mode 100644 index 00000000000..cf8fc0ec4b4 --- /dev/null +++ b/Modules/Core/Common/test/Baseline/itkPointSetToImageFilterTest1.png.sha512 @@ -0,0 +1 @@ +4676daffcc379ed78b411cebb9966722609e26fb2b7d4e709454d4fcd0e75ed040ec8bac9da98326f4a86cd75aa17fb0531f3a2de9dcac0188adbec190a5bec3 diff --git a/Modules/Core/Common/test/Baseline/itkPointSetToImageFilterTest2.mha.sha512 b/Modules/Core/Common/test/Baseline/itkPointSetToImageFilterTest2.mha.sha512 new file mode 100644 index 00000000000..bcc88b74151 --- /dev/null +++ b/Modules/Core/Common/test/Baseline/itkPointSetToImageFilterTest2.mha.sha512 @@ -0,0 +1 @@ +a76fc3e9eac7c8c2cf7e1a77091e8de94712a1843f25eae0cc3629202223e40cd148bcd0457c1f48c03ccead138c7ed4c2d2aaeb29ac8a578ff65c8888149e95 diff --git a/Modules/Core/Common/test/CMakeLists.txt b/Modules/Core/Common/test/CMakeLists.txt index b36bd1be647..655ffc8a003 100644 --- a/Modules/Core/Common/test/CMakeLists.txt +++ b/Modules/Core/Common/test/CMakeLists.txt @@ -87,6 +87,8 @@ itkMultipleLogOutputTest.cxx itkVectorTest.cxx itkImageTest.cxx itkPointSetTest.cxx +itkPointSetToImageFilterTest1.cxx +itkPointSetToImageFilterTest2.cxx itkBresenhamLineTest.cxx itkSparseFieldLayerTest.cxx itkDataObjectTest.cxx @@ -345,6 +347,14 @@ itk_add_test(NAME itkIteratorTests COMMAND ITKCommon1TestDriver itkIteratorTests itk_add_test(NAME itkObjectFactoryTest COMMAND ITKCommon1TestDriver itkObjectFactoryTest) itk_add_test(NAME itkVectorTest COMMAND ITKCommon1TestDriver itkVectorTest) itk_add_test(NAME itkPointSetTest COMMAND ITKCommon1TestDriver itkPointSetTest) +itk_add_test(NAME itkPointSetToImageFilterTest1 + COMMAND ITKCommon1TestDriver + --compare DATA{Baseline/itkPointSetToImageFilterTest1.png} ${ITK_TEST_OUTPUT_DIR}/itkPointSetToImageFilterTest1.png + itkPointSetToImageFilterTest1 ${ITK_TEST_OUTPUT_DIR}/itkPointSetToImageFilterTest1.png) +itk_add_test(NAME itkPointSetToImageFilterTest2 + COMMAND ITKCommon1TestDriver + --compare DATA{Baseline/itkPointSetToImageFilterTest2.mha} ${ITK_TEST_OUTPUT_DIR}/itkPointSetToImageFilterTest2.mha + itkPointSetToImageFilterTest2 DATA{${ITK_DATA_ROOT}/Input/VascularTreePointSet.txt} ${ITK_TEST_OUTPUT_DIR}/itkPointSetToImageFilterTest2.mha) itk_add_test(NAME itkBresenhamLineTest COMMAND ITKCommon1TestDriver itkBresenhamLineTest) itk_add_test(NAME itkSparseFieldLayerTest COMMAND ITKCommon1TestDriver itkSparseFieldLayerTest) itk_add_test(NAME itkDataObjectTest COMMAND ITKCommon1TestDriver itkDataObjectTest) diff --git a/Modules/Core/Common/test/itkPointSetToImageFilterTest1.cxx b/Modules/Core/Common/test/itkPointSetToImageFilterTest1.cxx new file mode 100644 index 00000000000..2e8e1d68e3c --- /dev/null +++ b/Modules/Core/Common/test/itkPointSetToImageFilterTest1.cxx @@ -0,0 +1,114 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#include "itkImageFileWriter.h" +#include "itkPointSetToImageFilter.h" +#include "itkPointSet.h" +#include "itkTestingMacros.h" + + +int +itkPointSetToImageFilterTest1(int argc, char * argv[]) +{ + if (argc != 2) + { + std::cerr << "Missing parameters." << std::endl; + std::cerr << "Usage: " << itkNameOfTestExecutableMacro(argv); + std::cerr << " outputImageFile" << std::endl; + return EXIT_FAILURE; + } + + constexpr unsigned int PointSetDimension = 2; + constexpr unsigned int ImageDimension = 2; + + using PointSetPointType = float; + using PixelType = unsigned char; + + using PointSetType = itk::PointSet; + using BinaryImageType = itk::Image; + + using PointSetType = itk::PointSet; + + using PointType = PointSetType::PointType; + + auto pointSet = PointSetType::New(); + + // Create a point set describing a circle + float radius = 100.0; + unsigned int count = 0; + for (float theta = 0; theta < 2.0 * itk::Math::pi; theta += 0.1) + { + PointType point; + point[0] = radius * std::cos(theta); + point[1] = radius * std::sin(theta); + + pointSet->SetPoint(count, point); + count++; + } + + using FilterType = itk::PointSetToImageFilter; + auto filter = FilterType::New(); + + ITK_EXERCISE_BASIC_OBJECT_METHODS(filter, PointSetToImageFilter, ImageSource); + + + BinaryImageType::SpacingType::ValueType spacingValue = 1.0; + BinaryImageType::SpacingType spacing; + spacing.Fill(spacingValue); + filter->SetSpacing(spacing); + ITK_TEST_SET_GET_VALUE(spacing, filter->GetSpacing()); + + BinaryImageType::PointType origin{ { -125, -125 } }; + filter->SetOrigin(origin); + ITK_TEST_SET_GET_VALUE(origin, filter->GetOrigin()); + + typename BinaryImageType::DirectionType direction; + direction.SetIdentity(); + filter->SetDirection(direction); + ITK_TEST_SET_GET_VALUE(direction, filter->GetDirection()); + + typename BinaryImageType::ValueType insideValue = itk::NumericTraits::OneValue(); + filter->SetInsideValue(insideValue); + ITK_TEST_SET_GET_VALUE(insideValue, filter->GetInsideValue()); + + typename BinaryImageType::ValueType outsideValue = + itk::NumericTraits::ZeroValue(); + filter->SetOutsideValue(outsideValue); + ITK_TEST_SET_GET_VALUE(outsideValue, filter->GetOutsideValue()); + + typename BinaryImageType::SizeType size = { { 250, 250 } }; + filter->SetSize(size); + ITK_TEST_SET_GET_VALUE(size, filter->GetSize()); + + filter->SetInput(pointSet); + ITK_TEST_SET_GET_VALUE(pointSet, filter->GetInput()); + + unsigned int idx = 0; + ITK_TEST_SET_GET_VALUE(pointSet, filter->GetInput(idx)); + + ITK_TRY_EXPECT_NO_EXCEPTION(filter->Update()); + + + BinaryImageType::Pointer binaryImage = filter->GetOutput(); + + itk::WriteImage(binaryImage, argv[1]); + + + std::cout << "Test finished." << std::endl; + return EXIT_SUCCESS; +} diff --git a/Modules/Core/Common/test/itkPointSetToImageFilterTest2.cxx b/Modules/Core/Common/test/itkPointSetToImageFilterTest2.cxx new file mode 100644 index 00000000000..14deaeb4464 --- /dev/null +++ b/Modules/Core/Common/test/itkPointSetToImageFilterTest2.cxx @@ -0,0 +1,91 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#include "itkImageFileWriter.h" +#include "itkPointSetToImageFilter.h" +#include "itkPointSet.h" +#include "itkTestingMacros.h" + + +int +itkPointSetToImageFilterTest2(int argc, char * argv[]) +{ + if (argc != 3) + { + std::cerr << "Missing parameters." << std::endl; + std::cerr << "Usage: " << itkNameOfTestExecutableMacro(argv); + std::cerr << " pointSetFile outputImageFile" << std::endl; + return EXIT_FAILURE; + } + + constexpr unsigned int PointSetDimension = 3; + constexpr unsigned int ImageDimension = 3; + + using PointSetPointType = float; + using PixelType = unsigned char; + + using PointSetType = itk::PointSet; + using BinaryImageType = itk::Image; + + using PointSetType = itk::PointSet; + + auto pointSet = PointSetType::New(); + + using PointType = PointSetType::PointType; + + using PointsContainer = PointSetType::PointsContainer; + auto pointContainer = PointsContainer::New(); + + PointType point; + + // Read the point set + std::ifstream file; + file.open(argv[1]); + if (file.fail()) + { + std::cerr << "Error opening point set file with name : " << std::endl; + std::cerr << argv[1] << std::endl; + return EXIT_FAILURE; + } + + unsigned int pointId = 0; + file >> point; + while (!file.eof()) + { + pointContainer->InsertElement(pointId, point); + file >> point; + pointId++; + } + pointSet->SetPoints(pointContainer); + + using FilterType = itk::PointSetToImageFilter; + auto filter = FilterType::New(); + + filter->SetInput(pointSet); + + ITK_TRY_EXPECT_NO_EXCEPTION(filter->Update()); + + + BinaryImageType::Pointer binaryImage = filter->GetOutput(); + + itk::WriteImage(binaryImage, argv[2]); + + + std::cout << "Test finished." << std::endl; + return EXIT_SUCCESS; +} diff --git a/Testing/Data/Input/VascularTreePointSet.txt b/Testing/Data/Input/VascularTreePointSet.txt new file mode 100644 index 00000000000..ef0c7d9d3b6 --- /dev/null +++ b/Testing/Data/Input/VascularTreePointSet.txt @@ -0,0 +1,486 @@ + -1.854 -165.771 -709.500 + -3.670 -163.955 -709.500 + -1.854 -165.166 -708.500 + -1.248 -166.982 -707.500 + -1.248 -166.982 -706.500 + -1.248 -166.982 -705.500 + -1.248 -166.982 -704.500 + -1.248 -167.588 -703.500 + -1.248 -167.588 -702.500 + -1.248 -166.377 -701.500 + -1.248 -166.982 -700.500 + -1.248 -168.193 -699.500 + -0.643 -166.982 -698.500 + -1.248 -166.982 -697.500 + -1.248 -168.193 -696.500 + -1.248 -167.588 -695.500 + -1.854 -167.588 -694.500 + -1.854 -166.982 -693.500 + -1.248 -168.193 -692.500 + -1.854 -168.193 -691.500 + -1.854 -168.193 -690.500 + -1.854 -168.193 -689.500 + -1.248 -170.010 -688.500 + -1.854 -169.404 -687.500 + -1.854 -170.010 -686.500 + -1.854 -168.799 -685.500 + -1.854 -170.615 -684.500 + -1.854 -170.615 -683.500 + -1.854 -170.010 -682.500 + -1.854 -168.799 -681.500 + -1.854 -169.404 -680.500 + -1.854 -169.404 -680.500 + -1.854 -170.010 -679.500 + -1.854 -170.615 -678.500 + -1.854 -171.826 -677.500 + -1.248 -171.826 -676.500 + -1.854 -171.826 -675.500 + -1.854 -171.826 -674.500 + -1.854 -171.221 -673.500 + -1.854 -166.377 -673.500 + -1.248 -172.432 -672.500 + -1.854 -172.432 -671.500 + -1.854 -172.432 -670.500 + -1.854 -171.221 -669.500 + -1.854 -172.432 -668.500 + -1.248 -172.432 -667.500 + -1.854 -173.037 -666.500 + -1.854 -171.826 -665.500 + -1.248 -173.643 -664.500 + -1.854 -173.643 -663.500 + -1.854 -173.643 -662.500 + -1.854 -173.037 -661.500 + -1.854 -168.193 -661.500 + -1.248 -174.248 -660.500 + -1.854 -174.248 -659.500 + -1.854 -174.248 -658.500 + -2.459 -174.248 -657.500 + -3.670 -172.432 -657.500 + -2.459 -174.248 -656.500 + -3.670 -172.432 -656.500 + -2.459 -174.248 -655.500 + -4.275 -172.432 -655.500 + -2.459 -174.248 -654.500 + -4.275 -172.432 -654.500 + -1.854 -174.854 -653.500 + -4.275 -172.432 -653.500 + -2.459 -174.854 -652.500 + -3.670 -173.037 -652.500 + -1.854 -174.854 -651.500 + -4.275 -173.037 -651.500 + -2.459 -175.459 -650.500 + -4.275 -173.037 -650.500 + -1.854 -175.459 -649.500 + -3.670 -173.643 -649.500 + -2.459 -175.459 -648.500 + -3.670 -173.643 -648.500 + -1.854 -176.064 -647.500 + -1.854 -176.064 -646.500 + -1.248 -176.064 -645.500 + -1.854 -175.459 -644.500 + -1.248 -170.615 -644.500 + -1.248 -176.064 -643.500 + -1.854 -176.670 -642.500 + -1.248 -176.670 -641.500 + -1.854 -176.064 -640.500 + -1.854 -171.221 -640.500 + -1.854 -177.275 -639.500 + -1.854 -177.275 -638.500 + -1.854 -177.275 -637.500 + -1.854 -177.881 -636.500 + -1.854 -178.486 -635.500 + -1.248 -178.486 -634.500 + -1.248 -179.092 -633.500 + -1.248 -179.092 -632.500 + -1.248 -179.092 -631.500 + -1.248 -178.486 -630.500 + -1.248 -178.486 -629.500 + -1.854 -178.486 -628.500 + -1.854 -178.486 -627.500 + -1.854 -178.486 -626.500 + -1.248 -178.486 -625.500 + -1.248 -178.486 -624.500 + -1.248 -178.486 -623.500 + -1.248 -178.486 -622.500 + -1.248 -178.486 -621.500 + -0.643 -177.881 -620.500 + -1.248 -177.881 -619.500 + -3.670 -176.064 -619.500 + -1.854 -177.881 -618.500 + -3.670 -176.670 -618.500 + -1.248 -178.486 -617.500 + -1.248 -177.275 -616.500 + -1.854 -176.670 -615.500 + -0.643 -176.670 -615.500 + -1.248 -176.670 -614.500 + -1.854 -176.670 -614.500 + -1.854 -176.670 -613.500 + -1.248 -176.670 -613.500 + -1.854 -176.670 -612.500 + -1.248 -176.670 -612.500 + -1.854 -176.670 -611.500 + -1.248 -176.670 -611.500 + -1.854 -176.064 -610.500 + -1.248 -176.064 -610.500 + -1.248 -176.064 -609.500 + -1.248 -176.064 -609.500 + -0.643 -176.670 -608.500 + -1.248 -176.670 -608.500 + -0.643 -176.670 -607.500 + -1.248 -176.670 -607.500 + -0.643 -176.670 -606.500 + -1.248 -176.670 -606.500 + -1.248 -176.670 -605.500 + -1.248 -176.670 -605.500 + -1.854 -176.670 -604.500 + -0.643 -176.670 -604.500 + -1.854 -177.275 -603.500 + -1.248 -176.670 -602.500 + -1.854 -176.670 -601.500 + -1.248 -176.670 -601.500 + -0.643 -176.670 -600.500 + -0.643 -176.670 -599.500 + -1.248 -176.670 -598.500 + -0.643 -177.275 -597.500 + -0.643 -177.275 -596.500 + -0.643 -177.881 -595.500 + -0.643 -177.881 -594.500 + -0.643 -177.881 -593.500 + -0.643 -177.881 -592.500 + -0.643 -177.881 -591.500 + -0.037 -177.881 -590.500 + -0.037 -177.881 -589.500 + -0.643 -177.881 -588.500 + -0.643 -177.881 -587.500 + -0.643 -177.881 -586.500 + -1.248 -177.275 -585.500 + -0.037 -177.275 -584.500 + -2.459 -175.459 -584.500 + -0.643 -177.275 -583.500 + -0.037 -177.881 -582.500 + -0.037 -177.881 -581.500 + -0.037 -177.881 -580.500 + -0.037 -177.881 -579.500 + -0.037 -177.881 -578.500 + -0.037 -177.881 -577.500 + -0.037 -177.881 -576.500 + -0.037 -177.881 -575.500 + -0.037 -177.881 -574.500 + -0.037 -177.881 -573.500 + -0.037 -177.881 -572.500 + -0.037 -177.881 -571.500 + 0.568 -177.275 -570.500 + 0.568 -178.486 -569.500 + 0.568 -178.486 -568.500 + -0.643 -177.881 -567.500 + 0.568 -177.881 -566.500 + 1.174 -178.486 -565.500 + 1.174 -178.486 -564.500 + 0.568 -177.881 -563.500 + 0.568 -177.881 -562.500 + 0.568 -179.092 -561.500 + 0.568 -179.697 -560.500 + 1.174 -179.697 -559.500 + 0.568 -179.092 -558.500 + 0.568 -179.697 -557.500 + 0.568 -178.486 -556.500 + 0.568 -179.697 -555.500 + 1.174 -179.092 -554.500 + 0.568 -179.092 -553.500 + 0.568 -177.275 -553.500 + 1.174 -179.092 -552.500 + 1.174 -179.092 -551.500 + 1.174 -179.697 -550.500 + 1.779 -180.908 -549.500 + 1.174 -180.908 -548.500 + 1.174 -180.303 -547.500 + 1.174 -175.459 -547.500 + 1.174 -180.908 -546.500 + 1.779 -181.514 -545.500 + 1.779 -181.514 -544.500 + 1.779 -181.514 -543.500 + 1.174 -180.303 -542.500 + 0.568 -178.486 -542.500 + 1.779 -181.514 -541.500 + 2.385 -181.514 -540.500 + 2.385 -181.514 -539.500 + 2.385 -182.119 -538.500 + 2.385 -180.908 -537.500 + 1.779 -176.670 -537.500 + 2.385 -182.119 -536.500 + 2.385 -182.119 -535.500 + 2.385 -182.725 -534.500 + 1.779 -181.514 -533.500 + 0.568 -180.303 -533.500 + 2.385 -182.119 -532.500 + 2.385 -177.275 -532.500 + 2.990 -182.725 -531.500 + 2.990 -182.725 -530.500 + 2.385 -183.330 -529.500 + 2.990 -182.725 -528.500 + 2.990 -182.119 -527.500 + 2.385 -182.119 -526.500 + 1.779 -180.908 -526.500 + 2.990 -182.725 -525.500 + 2.990 -182.725 -524.500 + 2.990 -183.936 -523.500 + 2.990 -182.725 -522.500 + 3.596 -183.330 -521.500 + 3.596 -184.541 -520.500 + 3.596 -184.541 -519.500 + 3.596 -184.541 -518.500 + 3.596 -183.330 -517.500 + 4.201 -185.146 -516.500 + 4.807 -183.936 -515.500 + 4.201 -185.146 -514.500 + 3.596 -184.541 -513.500 + 1.779 -182.725 -513.500 + 4.201 -185.146 -512.500 + 4.201 -184.541 -511.500 + 4.201 -179.697 -511.500 + 4.807 -185.752 -510.500 + 4.807 -185.752 -509.500 + 4.807 -185.752 -508.500 + 4.807 -184.541 -507.500 + 4.201 -185.146 -506.500 + 4.201 -185.146 -505.500 + 2.990 -183.330 -505.500 + 4.807 -184.541 -504.500 + 4.807 -184.541 -503.500 + 4.807 -185.146 -502.500 + 4.807 -185.146 -501.500 + 4.807 -185.146 -500.500 + 4.807 -185.146 -499.500 + 4.807 -185.146 -498.500 + 4.807 -185.146 -497.500 + 4.807 -185.146 -496.500 + 4.807 -185.146 -495.500 + 5.412 -184.541 -494.500 + 5.412 -184.541 -493.500 + 5.412 -185.146 -492.500 + 5.412 -185.146 -491.500 + 5.412 -185.146 -490.500 + 4.807 -185.752 -489.500 + 4.807 -185.752 -488.500 + 4.807 -185.146 -487.500 + 4.807 -185.146 -486.500 + 4.807 -185.146 -485.500 + 4.807 -185.146 -484.500 + 4.807 -185.146 -483.500 + 4.807 -185.146 -482.500 + 4.807 -185.146 -481.500 + 4.807 -185.146 -480.500 + 4.807 -185.146 -479.500 + 4.807 -185.146 -478.500 + 4.807 -185.146 -477.500 + 4.807 -185.146 -476.500 + 4.807 -185.146 -475.500 + 4.807 -185.146 -474.500 + 4.807 -185.146 -473.500 + 4.807 -185.752 -472.500 + 4.807 -185.752 -471.500 + 5.412 -185.146 -470.500 + 5.412 -185.146 -469.500 + 5.412 -185.146 -468.500 + 5.412 -185.146 -467.500 + 4.807 -185.146 -466.500 + 4.807 -185.146 -465.500 + 5.412 -184.541 -464.500 + 4.807 -184.541 -463.500 + 4.807 -184.541 -462.500 + 4.807 -184.541 -461.500 + 5.412 -185.146 -460.500 + 3.596 -183.330 -460.500 + 6.018 -185.146 -459.500 + 3.596 -182.725 -459.500 + 6.018 -184.541 -458.500 + 3.596 -182.725 -458.500 + 6.623 -184.541 -457.500 + 2.990 -182.119 -457.500 + 7.229 -185.146 -456.500 + 4.201 -182.725 -456.500 + 7.834 -185.146 -455.500 + 4.201 -182.725 -455.500 + 7.834 -184.541 -454.500 + 4.201 -182.725 -454.500 + 8.439 -185.146 -453.500 + 2.385 -182.119 -453.500 + 8.439 -184.541 -452.500 + 1.779 -182.119 -452.500 + 9.045 -184.541 -451.500 + 1.174 -182.119 -451.500 + 9.650 -184.541 -450.500 + 0.568 -182.119 -450.500 + 9.650 -184.541 -449.500 + 0.568 -182.119 -449.500 + 10.256 -184.541 -448.500 + -0.037 -182.119 -448.500 + 10.861 -184.541 -447.500 + -0.643 -182.119 -447.500 + 10.861 -184.541 -446.500 + -1.248 -182.119 -446.500 + 11.467 -185.146 -445.500 + -1.854 -182.119 -445.500 + 11.467 -185.146 -444.500 + -2.459 -182.119 -444.500 + 12.678 -185.146 -443.500 + -3.064 -182.119 -443.500 + 13.283 -185.146 -442.500 + -3.670 -182.119 -442.500 + 13.889 -185.146 -441.500 + -4.275 -182.119 -441.500 + 14.494 -185.146 -440.500 + -4.881 -182.119 -440.500 + 15.100 -185.146 -439.500 + -5.486 -182.119 -439.500 + 15.705 -185.146 -438.500 + -6.092 -182.119 -438.500 + 15.705 -185.146 -437.500 + -6.697 -182.119 -437.500 + 16.311 -185.146 -436.500 + -7.303 -182.119 -436.500 + 16.916 -184.541 -435.500 + -8.514 -182.119 -435.500 + 17.521 -184.541 -434.500 + -8.514 -182.725 -434.500 + 18.127 -185.146 -433.500 + -9.119 -182.725 -433.500 + 18.127 -185.146 -432.500 + -9.725 -182.725 -432.500 + 18.732 -185.146 -431.500 + -10.330 -182.725 -431.500 + 19.338 -185.146 -430.500 + -10.330 -182.725 -430.500 + 19.943 -185.146 -429.500 + -10.936 -182.725 -429.500 + -12.146 -182.119 -429.500 + 19.943 -185.752 -428.500 + -11.541 -182.725 -428.500 + 21.154 -185.146 -427.500 + -12.146 -182.725 -427.500 + 21.154 -185.146 -426.500 + -12.752 -182.119 -426.500 + 21.760 -185.146 -425.500 + -13.963 -182.119 -425.500 + 22.365 -185.146 -424.500 + -14.568 -182.119 -424.500 + 23.576 -184.541 -423.500 + -13.963 -182.119 -423.500 + 23.576 -185.146 -422.500 + -14.568 -182.119 -422.500 + 23.576 -185.146 -421.500 + -15.174 -182.119 -421.500 + 24.182 -185.146 -420.500 + -15.174 -182.119 -420.500 + 24.787 -185.146 -419.500 + -15.779 -181.514 -419.500 + 25.393 -185.146 -418.500 + -16.385 -180.908 -418.500 + 25.393 -185.146 -417.500 + -16.990 -180.908 -417.500 + 25.998 -184.541 -416.500 + -17.596 -180.303 -416.500 + 26.604 -184.541 -415.500 + 27.209 -184.541 -414.500 + 27.209 -184.541 -413.500 + 27.814 -184.541 -412.500 + 28.420 -184.541 -411.500 + 28.420 -183.936 -410.500 + 28.420 -184.541 -409.500 + 29.025 -183.936 -408.500 + 29.025 -183.936 -407.500 + 29.631 -183.936 -406.500 + 29.631 -183.936 -405.500 + 29.631 -183.936 -404.500 + 29.631 -183.330 -403.500 + 30.236 -183.330 -402.500 + 30.236 -183.330 -401.500 + 30.236 -183.330 -400.500 + 30.842 -183.330 -399.500 + 31.447 -182.725 -398.500 + 32.053 -182.725 -397.500 + 31.447 -182.725 -396.500 + 32.053 -183.330 -395.500 + 30.842 -183.330 -394.500 + 32.053 -183.330 -393.500 + 30.842 -183.936 -392.500 + 32.053 -182.725 -391.500 + 32.053 -177.881 -391.500 + 32.053 -183.330 -390.500 + 32.053 -183.330 -389.500 + 30.842 -182.725 -388.500 + 32.053 -182.725 -387.500 + 31.447 -182.119 -386.500 + 31.447 -182.119 -385.500 + 31.447 -181.514 -384.500 + 32.053 -180.908 -383.500 + 32.053 -180.908 -382.500 + 30.842 -179.697 -381.500 + 30.842 -179.697 -380.500 + 30.842 -179.092 -379.500 + 30.842 -179.092 -378.500 + 30.842 -178.486 -377.500 + 30.236 -178.486 -376.500 + 30.236 -177.881 -375.500 + 30.236 -173.037 -375.500 + 30.236 -177.275 -374.500 + 30.236 -176.670 -373.500 + 29.631 -177.881 -372.500 + 29.025 -177.275 -371.500 + 27.814 -175.459 -371.500 + 29.631 -177.275 -370.500 + 29.631 -176.670 -369.500 + 29.025 -176.670 -368.500 + 29.025 -176.064 -367.500 + 28.420 -176.064 -366.500 + 27.814 -175.459 -365.500 + 25.393 -173.037 -365.500 + 27.814 -175.459 -364.500 + 27.209 -174.854 -363.500 + 26.604 -174.248 -362.500 + 24.787 -172.432 -362.500 + 27.209 -174.248 -361.500 + 26.604 -174.248 -360.500 + 25.998 -173.643 -359.500 + 25.998 -173.643 -358.500 + 24.787 -173.037 -357.500 + 24.787 -173.037 -356.500 + 24.182 -172.432 -355.500 + 23.576 -171.826 -354.500 + 20.549 -169.404 -354.500 + 23.576 -171.826 -353.500 + 19.943 -169.404 -353.500 + 22.365 -171.826 -352.500 + 22.365 -170.615 -351.500 + 21.760 -165.771 -351.500 + 21.760 -171.221 -350.500 + 21.760 -170.010 -349.500 + 21.154 -170.615 -348.500 + 20.549 -170.615 -347.500 + 19.338 -169.404 -346.500 + 18.732 -165.166 -346.500 + 18.732 -170.010 -345.500 + 18.732 -169.404 -344.500 + 17.521 -169.404 -343.500 + 17.521 -169.404 -342.500 + 16.916 -168.799 -341.500 + 15.100 -168.193 -340.500 + 15.100 -163.350 -340.500 + 15.100 -168.799 -339.500 + 15.100 -167.588 -338.500 + 13.889 -167.588 -337.500 + 12.678 -168.193 -336.500 + 12.678 -168.193 -335.500 + 11.467 -167.588 -334.500 + 10.861 -167.588 -333.500 + 10.256 -166.982 -332.500 + 7.834 -165.771 -332.500 + 6.623 -165.166 -332.500 + 9.045 -166.377 -331.500 + 8.439 -165.771 -331.500 + 6.623 -165.771 -330.500 + 8.439 -165.771 -330.500 + 4.807 -165.771 -329.500 + 9.045 -165.166 -329.500 + 6.623 -166.377 -328.500 + 7.229 -165.771 -328.500