1 //============================================================================
2 // Copyright (c) Kitware, Inc.
3 // All rights reserved.
4 // See LICENSE.txt for details.
5 // This software is distributed WITHOUT ANY WARRANTY; without even
6 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
7 // PURPOSE. See the above copyright notice for more information.
8 //
9 // Copyright 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
10 // Copyright 2014 UT-Battelle, LLC.
11 // Copyright 2014 Los Alamos National Security.
12 //
13 // Under the terms of Contract DE-NA0003525 with NTESS,
14 // the U.S. Government retains certain rights in this software.
15 //
16 // Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
17 // Laboratory (LANL), the U.S. Government retains certain rights in
18 // this software.
19 //============================================================================
20
21 #include <vtkm/cont/testing/MakeTestDataSet.h>
22 #include <vtkm/cont/testing/Testing.h>
23
24 #include <vtkm/filter/ExtractPoints.h>
25
26 using vtkm::cont::testing::MakeTestDataSet;
27
28 namespace
29 {
30
31 class TestingExtractPoints
32 {
33 public:
TestUniformByBox0() const34 void TestUniformByBox0() const
35 {
36 std::cout << "Testing extract points with implicit function (box):" << std::endl;
37 vtkm::cont::DataSet dataset = MakeTestDataSet().Make3DUniformDataSet1();
38
39 // Implicit function
40 vtkm::Vec<vtkm::FloatDefault, 3> minPoint(1.f, 1.f, 1.f);
41 vtkm::Vec<vtkm::FloatDefault, 3> maxPoint(3.f, 3.f, 3.f);
42 auto box = vtkm::cont::make_ImplicitFunctionHandle<vtkm::Box>(minPoint, maxPoint);
43
44 // Setup and run filter to extract by volume of interest
45 vtkm::filter::ExtractPoints extractPoints;
46 extractPoints.SetImplicitFunction(box);
47 extractPoints.SetExtractInside(true);
48 extractPoints.SetCompactPoints(true);
49
50 vtkm::cont::DataSet output = extractPoints.Execute(dataset);
51 VTKM_TEST_ASSERT(test_equal(output.GetCellSet().GetNumberOfCells(), 27),
52 "Wrong result for ExtractPoints");
53
54 vtkm::cont::ArrayHandle<vtkm::Float32> outPointData;
55 output.GetField("pointvar").GetData().CopyTo(outPointData);
56
57 VTKM_TEST_ASSERT(
58 test_equal(output.GetCellSet(0).GetNumberOfPoints(), outPointData.GetNumberOfValues()),
59 "Data/Geometry mismatch for ExtractPoints filter");
60
61 VTKM_TEST_ASSERT(outPointData.GetPortalConstControl().Get(0) == 99.0f,
62 "Wrong point field data");
63 VTKM_TEST_ASSERT(outPointData.GetPortalConstControl().Get(26) == 97.0f,
64 "Wrong point field data");
65 }
66
TestUniformByBox1() const67 void TestUniformByBox1() const
68 {
69 std::cout << "Testing extract points with implicit function (box):" << std::endl;
70 vtkm::cont::DataSet dataset = MakeTestDataSet().Make3DUniformDataSet1();
71
72 // Implicit function
73 vtkm::Vec<vtkm::FloatDefault, 3> minPoint(1.f, 1.f, 1.f);
74 vtkm::Vec<vtkm::FloatDefault, 3> maxPoint(3.f, 3.f, 3.f);
75 auto box = vtkm::cont::make_ImplicitFunctionHandle<vtkm::Box>(minPoint, maxPoint);
76
77 // Setup and run filter to extract by volume of interest
78 vtkm::filter::ExtractPoints extractPoints;
79 extractPoints.SetImplicitFunction(box);
80 extractPoints.SetExtractInside(false);
81 extractPoints.SetCompactPoints(true);
82
83 vtkm::cont::DataSet output = extractPoints.Execute(dataset);
84 VTKM_TEST_ASSERT(test_equal(output.GetCellSet().GetNumberOfCells(), 98),
85 "Wrong result for ExtractPoints");
86
87 vtkm::cont::ArrayHandle<vtkm::Float32> outPointData;
88 output.GetField("pointvar").GetData().CopyTo(outPointData);
89
90 VTKM_TEST_ASSERT(
91 test_equal(output.GetCellSet(0).GetNumberOfPoints(), outPointData.GetNumberOfValues()),
92 "Data/Geometry mismatch for ExtractPoints filter");
93
94 for (vtkm::Id i = 0; i < output.GetCellSet(0).GetNumberOfPoints(); i++)
95 {
96 VTKM_TEST_ASSERT(outPointData.GetPortalConstControl().Get(i) == 0.0f,
97 "Wrong point field data");
98 }
99 }
100
TestUniformBySphere() const101 void TestUniformBySphere() const
102 {
103 std::cout << "Testing extract points with implicit function (sphere):" << std::endl;
104 vtkm::cont::DataSet dataset = MakeTestDataSet().Make3DUniformDataSet1();
105
106 // Implicit function
107 vtkm::Vec<vtkm::FloatDefault, 3> center(2.f, 2.f, 2.f);
108 vtkm::FloatDefault radius(1.8f);
109 auto sphere = vtkm::cont::make_ImplicitFunctionHandle<vtkm::Sphere>(center, radius);
110
111 // Setup and run filter to extract by volume of interest
112 vtkm::filter::ExtractPoints extractPoints;
113 extractPoints.SetImplicitFunction(sphere);
114 extractPoints.SetExtractInside(true);
115
116 vtkm::cont::DataSet output = extractPoints.Execute(dataset);
117 VTKM_TEST_ASSERT(test_equal(output.GetCellSet().GetNumberOfCells(), 27),
118 "Wrong result for ExtractPoints");
119 }
120
TestExplicitByBox0() const121 void TestExplicitByBox0() const
122 {
123 std::cout << "Testing extract points with implicit function (box):" << std::endl;
124 vtkm::cont::DataSet dataset = MakeTestDataSet().Make3DExplicitDataSet5();
125
126 // Implicit function
127 vtkm::Vec<vtkm::FloatDefault, 3> minPoint(0.f, 0.f, 0.f);
128 vtkm::Vec<vtkm::FloatDefault, 3> maxPoint(1.f, 1.f, 1.f);
129 auto box = vtkm::cont::make_ImplicitFunctionHandle<vtkm::Box>(minPoint, maxPoint);
130
131 // Setup and run filter to extract by volume of interest
132 vtkm::filter::ExtractPoints extractPoints;
133 extractPoints.SetImplicitFunction(box);
134 extractPoints.SetExtractInside(true);
135
136 vtkm::cont::DataSet output = extractPoints.Execute(dataset);
137 VTKM_TEST_ASSERT(test_equal(output.GetCellSet().GetNumberOfCells(), 8),
138 "Wrong result for ExtractPoints");
139 }
140
TestExplicitByBox1() const141 void TestExplicitByBox1() const
142 {
143 std::cout << "Testing extract points with implicit function (box):" << std::endl;
144 vtkm::cont::DataSet dataset = MakeTestDataSet().Make3DExplicitDataSet5();
145
146 // Implicit function
147 vtkm::Vec<vtkm::FloatDefault, 3> minPoint(0.f, 0.f, 0.f);
148 vtkm::Vec<vtkm::FloatDefault, 3> maxPoint(1.f, 1.f, 1.f);
149 auto box = vtkm::cont::make_ImplicitFunctionHandle<vtkm::Box>(minPoint, maxPoint);
150
151 // Setup and run filter to extract by volume of interest
152 vtkm::filter::ExtractPoints extractPoints;
153 extractPoints.SetImplicitFunction(box);
154 extractPoints.SetExtractInside(false);
155
156 vtkm::cont::DataSet output = extractPoints.Execute(dataset);
157 VTKM_TEST_ASSERT(test_equal(output.GetCellSet().GetNumberOfCells(), 3),
158 "Wrong result for ExtractPoints");
159 }
160
operator ()() const161 void operator()() const
162 {
163 this->TestUniformByBox0();
164 this->TestUniformByBox1();
165 this->TestUniformBySphere();
166 this->TestExplicitByBox0();
167 this->TestExplicitByBox1();
168 }
169 };
170 }
171
UnitTestExtractPointsFilter(int,char * [])172 int UnitTestExtractPointsFilter(int, char* [])
173 {
174 return vtkm::cont::testing::Testing::Run(TestingExtractPoints());
175 }
176