201 if (!checkAndCalculateBounds()) {
203 sumSquaredDifferences = std::numeric_limits<T>::quiet_NaN();
204 sumDifferences = std::numeric_limits<T>::quiet_NaN();
206 numSkippedPoints = 0;
210 const auto &gridExpanded = levelSetExpanded->getGrid();
211 const auto gridDelta = gridExpanded.getGridDelta();
213 sumSquaredDifferences = 0.0;
214 sumDifferences = 0.0;
216 numSkippedPoints = 0;
219 std::vector<Vec3D<T>> nodeCoordinates;
220 std::vector<std::array<unsigned, 1>> vertexIndices;
221 std::vector<T> differenceValues;
222 std::vector<T> squaredDifferenceValues;
225 const bool generateMesh = outputMesh !=
nullptr;
230 for (
unsigned i = 0; i <
D; ++i) {
231 outputMesh->minimumExtent[i] = std::numeric_limits<T>::max();
232 outputMesh->maximumExtent[i] = std::numeric_limits<T>::lowest();
236 nodeCoordinates.reserve(levelSetIterated->getNumberOfPoints());
237 vertexIndices.reserve(levelSetIterated->getNumberOfPoints());
238 differenceValues.reserve(levelSetIterated->getNumberOfPoints());
239 squaredDifferenceValues.reserve(levelSetIterated->getNumberOfPoints());
243 auto &iteratedPointData = levelSetIterated->getPointData();
244 std::vector<T> pointDataDistances;
245 if (fillIteratedWithDistances) {
246 pointDataDistances.reserve(levelSetIterated->getNumberOfPoints());
250 viennahrle::ConstSparseIterator<typename Domain<T, D>::DomainType>
251 itIterated(levelSetIterated->getDomain());
252 viennahrle::ConstSparseIterator<typename Domain<T, D>::DomainType>
253 itExpanded(levelSetExpanded->getDomain());
256 while (!itIterated.isFinished()) {
257 if (!itIterated.isDefined()) {
264 auto indices = itIterated.getStartIndices();
267 T xCoord = indices[0] * gridDelta;
268 T yCoord = indices[1] * gridDelta;
272 if (useXRange && (xCoord < xRangeMin || xCoord > xRangeMax)) {
278 if (useYRange && (yCoord < yRangeMin || yCoord > yRangeMax)) {
284 T valueIterated = itIterated.getValue();
286 itExpanded.goToIndicesSequential(indices);
287 T valueExpanded = itExpanded.getValue();
291 if (!itExpanded.isDefined() || std::isinf(valueExpanded) ||
292 std::isinf(valueIterated)) {
299 T diff = std::abs(valueExpanded - valueIterated) * gridDelta;
300 T diffSquared = diff * diff;
301 sumDifferences += diff;
302 sumSquaredDifferences += diffSquared;
309 Vec3D<T> coords{xCoord, yCoord, zCoord};
312 nodeCoordinates.push_back(coords);
315 differenceValues.push_back(diff);
316 squaredDifferenceValues.push_back(diffSquared);
319 std::array<unsigned, 1> vertex = {
320 static_cast<unsigned>(nodeCoordinates.size() - 1)};
321 vertexIndices.push_back(vertex);
324 for (
unsigned i = 0; i <
D; ++i) {
325 outputMesh->minimumExtent[i] =
326 std::min(outputMesh->minimumExtent[i], coords[i]);
327 outputMesh->maximumExtent[i] =
328 std::max(outputMesh->maximumExtent[i], coords[i]);
332 if (fillIteratedWithDistances) {
334 pointDataDistances.push_back(diff);
341 if (generateMesh && !nodeCoordinates.empty()) {
343 outputMesh->nodes = std::move(nodeCoordinates);
346 outputMesh->vertices = std::move(vertexIndices);
349 outputMesh->pointData.insertNextScalarData(std::move(differenceValues),
350 "Absolute differences");
351 outputMesh->pointData.insertNextScalarData(
352 std::move(squaredDifferenceValues),
"Squared differences");
355 if (fillIteratedWithDistances) {
356 iteratedPointData.insertNextScalarData(std::move(pointDataDistances),
357 "DistanceToExpanded");