62 if (levelSet ==
nullptr) {
63 VIENNACORE_LOG_ERROR(
"No level set was passed to CalculateCurvatures.");
68 if (
unsigned minWidth = std::ceil((maxValue * 8) + 1);
69 levelSet->getLevelSetWidth() < minWidth) {
70 VIENNACORE_LOG_WARNING(
"CalculateCurvatures: Level set width must be "
72 std::to_string(minWidth) +
73 ". Expanding level set to " +
74 std::to_string(minWidth) +
".");
78 std::vector<std::vector<T>> meanCurvaturesVector(
79 levelSet->getNumberOfSegments());
80 std::vector<std::vector<T>> gaussCurvaturesVector(
81 levelSet->getNumberOfSegments());
83 auto grid = levelSet->getGrid();
84 const bool calculateMean =
87 const bool calculateGauss =
92#pragma omp parallel num_threads(levelSet->getNumberOfSegments())
96 p = omp_get_thread_num();
99 auto &meanCurvatures = meanCurvaturesVector[p];
100 auto &gaussCurvatures = gaussCurvaturesVector[p];
103 meanCurvatures.reserve(
104 levelSet->getDomain().getDomainSegment(p).getNumberOfPoints());
106 if (calculateGauss) {
107 gaussCurvatures.reserve(
108 levelSet->getDomain().getDomainSegment(p).getNumberOfPoints());
111 viennahrle::Index<D>
const startVector =
112 (p == 0) ? grid.getMinGridPoint()
113 : levelSet->getDomain().getSegmentation()[p - 1];
115 viennahrle::Index<D>
const endVector =
116 (p !=
static_cast<int>(levelSet->getNumberOfSegments() - 1))
117 ? levelSet->getDomain().getSegmentation()[p]
118 : grid.incrementIndices(grid.getMaxGridPoint());
121 neighborIt(levelSet->getDomain(), startVector);
122 neighborIt.getIndices() < endVector; neighborIt.next()) {
124 auto ¢er = neighborIt.getCenter();
125 if (!center.isDefined()) {
127 }
else if (std::abs(center.getValue()) > maxValue) {
129 meanCurvatures.push_back(0.);
131 gaussCurvatures.push_back(0.);
139 if (calculateGauss) {
147 unsigned numberOfCurvatures = 0;
148 for (
unsigned i = 0; i < levelSet->getNumberOfSegments(); ++i) {
149 numberOfCurvatures += meanCurvaturesVector[i].size();
151 meanCurvaturesVector[0].reserve(numberOfCurvatures);
153 for (
unsigned i = 1; i < levelSet->getNumberOfSegments(); ++i) {
154 meanCurvaturesVector[0].insert(meanCurvaturesVector[0].end(),
155 meanCurvaturesVector[i].begin(),
156 meanCurvaturesVector[i].end());
160 if (calculateGauss) {
161 unsigned numberOfCurvatures = 0;
162 for (
unsigned i = 0; i < levelSet->getNumberOfSegments(); ++i) {
163 numberOfCurvatures += gaussCurvaturesVector[i].size();
165 gaussCurvaturesVector[0].reserve(numberOfCurvatures);
167 for (
unsigned i = 1; i < levelSet->getNumberOfSegments(); ++i) {
168 gaussCurvaturesVector[0].insert(gaussCurvaturesVector[0].end(),
169 gaussCurvaturesVector[i].begin(),
170 gaussCurvaturesVector[i].end());
176 auto &pointData = levelSet->getPointData();
177 auto scalarDataPointer =
180 if (scalarDataPointer ==
nullptr) {
181 pointData.insertNextScalarData(meanCurvaturesVector[0],
185 *scalarDataPointer = std::move(meanCurvaturesVector[0]);
189 if (calculateGauss) {
190 auto &pointData = levelSet->getPointData();
191 auto scalarDataPointer =
194 if (scalarDataPointer ==
nullptr) {
195 pointData.insertNextScalarData(gaussCurvaturesVector[0],
199 *scalarDataPointer = std::move(gaussCurvaturesVector[0]);