179 if (!checkAndCalculateBounds()) {
181 sumSquaredDifferences = std::numeric_limits<T>::quiet_NaN();
182 sumDifferences = std::numeric_limits<T>::quiet_NaN();
187 const auto &gridTarget = levelSetTarget->getGrid();
188 const auto gridDelta = gridTarget.getGridDelta();
190 sumSquaredDifferences = 0.0;
191 sumDifferences = 0.0;
195 std::vector<Vec3D<T>> nodeCoordinates;
196 std::vector<std::array<unsigned, 1>> vertexIndices;
197 std::vector<T> differenceValues;
198 std::vector<T> squaredDifferenceValues;
201 const bool generateMesh = outputMesh !=
nullptr;
206 for (
unsigned i = 0; i <
D; ++i) {
207 outputMesh->minimumExtent[i] = std::numeric_limits<T>::max();
208 outputMesh->maximumExtent[i] = std::numeric_limits<T>::lowest();
212 nodeCoordinates.reserve(levelSetSample->getNumberOfPoints());
213 vertexIndices.reserve(levelSetSample->getNumberOfPoints());
214 differenceValues.reserve(levelSetSample->getNumberOfPoints());
215 squaredDifferenceValues.reserve(levelSetSample->getNumberOfPoints());
219 viennahrle::ConstSparseIterator<typename Domain<T, D>::DomainType> itSample(
220 levelSetSample->getDomain());
221 viennahrle::ConstSparseIterator<typename Domain<T, D>::DomainType> itTarget(
222 levelSetTarget->getDomain());
225 while (!itSample.isFinished()) {
226 if (!itSample.isDefined()) {
233 auto indices = itSample.getStartIndices();
236 T xCoord = indices[0] * gridDelta;
237 T yCoord = indices[1] * gridDelta;
241 if (useXRange && (xCoord < xRangeMin || xCoord > xRangeMax)) {
247 if (useYRange && (yCoord < yRangeMin || yCoord > yRangeMax)) {
253 T valueSample = itSample.getValue();
255 itTarget.goToIndicesSequential(indices);
256 T valueTarget = itTarget.getValue();
259 if (!itTarget.isDefined() || std::isinf(valueTarget) ||
260 std::isinf(valueSample)) {
266 T diff = std::abs(valueTarget - valueSample);
267 T diffSquared = diff * diff;
268 sumDifferences += diff;
269 sumSquaredDifferences += diffSquared;
275 Vec3D<T> coords{xCoord, yCoord, zCoord};
278 nodeCoordinates.push_back(coords);
281 differenceValues.push_back(diff);
282 squaredDifferenceValues.push_back(diffSquared);
285 std::array<unsigned, 1> vertex = {
286 static_cast<unsigned>(nodeCoordinates.size() - 1)};
287 vertexIndices.push_back(vertex);
290 for (
unsigned i = 0; i <
D; ++i) {
291 outputMesh->minimumExtent[i] =
292 std::min(outputMesh->minimumExtent[i], coords[i]);
293 outputMesh->maximumExtent[i] =
294 std::max(outputMesh->maximumExtent[i], coords[i]);
303 if (generateMesh && !nodeCoordinates.empty()) {
305 outputMesh->nodes = std::move(nodeCoordinates);
308 outputMesh->vertices = std::move(vertexIndices);
311 outputMesh->pointData.insertNextScalarData(std::move(differenceValues),
312 "Absolute differences");
313 outputMesh->pointData.insertNextScalarData(
314 std::move(squaredDifferenceValues),
"Squared differences");