219 if (!checkAndCalculateBounds()) {
221 sumSquaredDifferences = std::numeric_limits<T>::quiet_NaN();
222 sumDifferences = std::numeric_limits<T>::quiet_NaN();
224 numSkippedPoints = 0;
228 const auto &gridExpanded = levelSetExpanded->getGrid();
229 const auto gridDelta = gridExpanded.getGridDelta();
231 sumSquaredDifferences = 0.0;
232 sumDifferences = 0.0;
234 numSkippedPoints = 0;
237 std::vector<Vec3D<T>> nodeCoordinates;
238 std::vector<std::array<unsigned, 1>> vertexIndices;
239 std::vector<T> differenceValues;
240 std::vector<T> squaredDifferenceValues;
243 const bool generateMesh = outputMesh !=
nullptr;
248 for (
unsigned i = 0; i <
D; ++i) {
249 outputMesh->minimumExtent[i] = std::numeric_limits<T>::max();
250 outputMesh->maximumExtent[i] = std::numeric_limits<T>::lowest();
254 nodeCoordinates.reserve(levelSetIterated->getNumberOfPoints());
255 vertexIndices.reserve(levelSetIterated->getNumberOfPoints());
256 differenceValues.reserve(levelSetIterated->getNumberOfPoints());
257 squaredDifferenceValues.reserve(levelSetIterated->getNumberOfPoints());
261 auto &iteratedPointData = levelSetIterated->getPointData();
262 std::vector<T> pointDataDistances;
263 if (fillIteratedWithDistances) {
264 pointDataDistances.reserve(levelSetIterated->getNumberOfPoints());
268 viennahrle::ConstSparseIterator<typename Domain<T, D>::DomainType>
269 itIterated(levelSetIterated->getDomain());
270 viennahrle::ConstSparseIterator<typename Domain<T, D>::DomainType>
271 itExpanded(levelSetExpanded->getDomain());
274 while (!itIterated.isFinished()) {
275 if (!itIterated.isDefined()) {
282 auto indices = itIterated.getStartIndices();
285 T xCoord = indices[0] * gridDelta;
286 T yCoord = indices[1] * gridDelta;
290 if (useXRange && (xCoord < xRangeMin || xCoord > xRangeMax)) {
296 if (useYRange && (yCoord < yRangeMin || yCoord > yRangeMax)) {
302 T valueIterated = itIterated.getValue();
304 itExpanded.goToIndicesSequential(indices);
305 T valueExpanded = itExpanded.getValue();
309 if (!itExpanded.isDefined() || std::isinf(valueExpanded) ||
310 std::isinf(valueIterated)) {
317 T diff = std::abs(valueExpanded - valueIterated) * gridDelta;
318 T diffSquared = diff * diff;
319 sumDifferences += diff;
320 sumSquaredDifferences += diffSquared;
327 Vec3D<T> coords{xCoord, yCoord, zCoord};
330 nodeCoordinates.push_back(coords);
333 differenceValues.push_back(diff);
334 squaredDifferenceValues.push_back(diffSquared);
337 std::array<unsigned, 1> vertex = {
338 static_cast<unsigned>(nodeCoordinates.size() - 1)};
339 vertexIndices.push_back(vertex);
342 for (
unsigned i = 0; i <
D; ++i) {
343 outputMesh->minimumExtent[i] =
344 std::min(outputMesh->minimumExtent[i], coords[i]);
345 outputMesh->maximumExtent[i] =
346 std::max(outputMesh->maximumExtent[i], coords[i]);
350 if (fillIteratedWithDistances) {
352 pointDataDistances.push_back(diff);
359 if (generateMesh && !nodeCoordinates.empty()) {
361 outputMesh->nodes = std::move(nodeCoordinates);
364 outputMesh->vertices = std::move(vertexIndices);
367 outputMesh->pointData.insertNextScalarData(std::move(differenceValues),
368 "Absolute differences");
369 outputMesh->pointData.insertNextScalarData(
370 std::move(squaredDifferenceValues),
"Squared differences");
373 if (fillIteratedWithDistances) {
374 iteratedPointData.insertNextScalarData(std::move(pointDataDistances),
375 "DistanceToExpanded");