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 for
93 for (
unsigned p = 0; p < levelSet->getNumberOfSegments(); ++p) {
95 auto &meanCurvatures = meanCurvaturesVector[p];
96 auto &gaussCurvatures = gaussCurvaturesVector[p];
99 meanCurvatures.reserve(
100 levelSet->getDomain().getDomainSegment(p).getNumberOfPoints());
102 if (calculateGauss) {
103 gaussCurvatures.reserve(
104 levelSet->getDomain().getDomainSegment(p).getNumberOfPoints());
107 viennahrle::Index<D>
const startVector =
108 (p == 0) ? grid.getMinGridPoint()
109 : levelSet->getDomain().getSegmentation()[p - 1];
111 viennahrle::Index<D>
const endVector =
112 (p !=
static_cast<int>(levelSet->getNumberOfSegments() - 1))
113 ? levelSet->getDomain().getSegmentation()[p]
114 : grid.incrementIndices(grid.getMaxGridPoint());
117 neighborIt(levelSet->getDomain(), startVector);
118 neighborIt.getIndices() < endVector; neighborIt.next()) {
120 auto ¢er = neighborIt.getCenter();
121 if (!center.isDefined()) {
123 }
else if (std::abs(center.getValue()) > maxValue) {
125 meanCurvatures.push_back(0.);
127 gaussCurvatures.push_back(0.);
135 if (calculateGauss) {
143 unsigned numberOfCurvatures = 0;
144 for (
unsigned i = 0; i < levelSet->getNumberOfSegments(); ++i) {
145 numberOfCurvatures += meanCurvaturesVector[i].size();
147 meanCurvaturesVector[0].reserve(numberOfCurvatures);
149 for (
unsigned i = 1; i < levelSet->getNumberOfSegments(); ++i) {
150 meanCurvaturesVector[0].insert(meanCurvaturesVector[0].end(),
151 meanCurvaturesVector[i].begin(),
152 meanCurvaturesVector[i].end());
156 if (calculateGauss) {
157 unsigned numberOfCurvatures = 0;
158 for (
unsigned i = 0; i < levelSet->getNumberOfSegments(); ++i) {
159 numberOfCurvatures += gaussCurvaturesVector[i].size();
161 gaussCurvaturesVector[0].reserve(numberOfCurvatures);
163 for (
unsigned i = 1; i < levelSet->getNumberOfSegments(); ++i) {
164 gaussCurvaturesVector[0].insert(gaussCurvaturesVector[0].end(),
165 gaussCurvaturesVector[i].begin(),
166 gaussCurvaturesVector[i].end());
172 auto &pointData = levelSet->getPointData();
173 auto scalarDataPointer =
176 if (scalarDataPointer ==
nullptr) {
177 pointData.insertNextScalarData(meanCurvaturesVector[0],
181 *scalarDataPointer = std::move(meanCurvaturesVector[0]);
185 if (calculateGauss) {
186 auto &pointData = levelSet->getPointData();
187 auto scalarDataPointer =
190 if (scalarDataPointer ==
nullptr) {
191 pointData.insertNextScalarData(gaussCurvaturesVector[0],
195 *scalarDataPointer = std::move(gaussCurvaturesVector[0]);