213 if (!checkAndCalculateBounds()) {
215 sumSquaredDifferences = std::numeric_limits<T>::quiet_NaN();
216 sumDifferences = std::numeric_limits<T>::quiet_NaN();
218 numSkippedPoints = 0;
222 const auto &gridExpanded = levelSetExpanded->getGrid();
223 const auto gridDelta = gridExpanded.getGridDelta();
225 sumSquaredDifferences = 0.0;
226 sumDifferences = 0.0;
228 numSkippedPoints = 0;
231 std::vector<Vec3D<T>> nodeCoordinates;
232 std::vector<std::array<unsigned, 1>> vertexIndices;
233 std::vector<T> differenceValues;
234 std::vector<T> squaredDifferenceValues;
237 const bool generateMesh = outputMesh !=
nullptr;
242 for (
unsigned i = 0; i <
D; ++i) {
243 outputMesh->minimumExtent[i] = std::numeric_limits<T>::max();
244 outputMesh->maximumExtent[i] = std::numeric_limits<T>::lowest();
248 nodeCoordinates.reserve(levelSetIterated->getNumberOfPoints());
249 vertexIndices.reserve(levelSetIterated->getNumberOfPoints());
250 differenceValues.reserve(levelSetIterated->getNumberOfPoints());
251 squaredDifferenceValues.reserve(levelSetIterated->getNumberOfPoints());
255 auto &iteratedPointData = levelSetIterated->getPointData();
256 std::vector<T> pointDataDistances;
257 if (fillIteratedWithDistances) {
258 pointDataDistances.reserve(levelSetIterated->getNumberOfPoints());
262 viennahrle::ConstSparseIterator<typename Domain<T, D>::DomainType>
263 itIterated(levelSetIterated->getDomain());
264 viennahrle::ConstSparseIterator<typename Domain<T, D>::DomainType>
265 itExpanded(levelSetExpanded->getDomain());
268 while (!itIterated.isFinished()) {
269 if (!itIterated.isDefined()) {
276 auto indices = itIterated.getStartIndices();
279 T xCoord = indices[0] * gridDelta;
280 T yCoord = indices[1] * gridDelta;
284 if (useXRange && (xCoord < xRangeMin || xCoord > xRangeMax)) {
290 if (useYRange && (yCoord < yRangeMin || yCoord > yRangeMax)) {
296 T valueIterated = itIterated.getValue();
298 itExpanded.goToIndicesSequential(indices);
299 T valueExpanded = itExpanded.getValue();
303 if (!itExpanded.isDefined() || std::isinf(valueExpanded) ||
304 std::isinf(valueIterated)) {
311 T diff = std::abs(valueExpanded - valueIterated) * gridDelta;
312 T diffSquared = diff * diff;
313 sumDifferences += diff;
314 sumSquaredDifferences += diffSquared;
321 Vec3D<T> coords{xCoord, yCoord, zCoord};
324 nodeCoordinates.push_back(coords);
327 differenceValues.push_back(diff);
328 squaredDifferenceValues.push_back(diffSquared);
331 std::array<unsigned, 1> vertex = {
332 static_cast<unsigned>(nodeCoordinates.size() - 1)};
333 vertexIndices.push_back(vertex);
336 for (
unsigned i = 0; i <
D; ++i) {
337 outputMesh->minimumExtent[i] =
338 std::min(outputMesh->minimumExtent[i], coords[i]);
339 outputMesh->maximumExtent[i] =
340 std::max(outputMesh->maximumExtent[i], coords[i]);
344 if (fillIteratedWithDistances) {
346 pointDataDistances.push_back(diff);
353 if (generateMesh && !nodeCoordinates.empty()) {
355 outputMesh->nodes = std::move(nodeCoordinates);
358 outputMesh->vertices = std::move(vertexIndices);
361 outputMesh->pointData.insertNextScalarData(std::move(differenceValues),
362 "Absolute differences");
363 outputMesh->pointData.insertNextScalarData(
364 std::move(squaredDifferenceValues),
"Squared differences");
367 if (fillIteratedWithDistances) {
368 iteratedPointData.insertNextScalarData(std::move(pointDataDistances),
369 "DistanceToExpanded");