62 if (levelSet ==
nullptr) {
64 .addError(
"No level set was passed to CalculateCurvatures.")
69 if (
unsigned minWidth = std::ceil((maxValue * 8) + 1);
70 levelSet->getLevelSetWidth() < minWidth) {
72 .addWarning(
"CalculateCurvatures: Level set width must be "
74 std::to_string(minWidth) +
". Expanding level set to " +
75 std::to_string(minWidth) +
".")
80 std::vector<std::vector<T>> meanCurvaturesVector(
81 levelSet->getNumberOfSegments());
82 std::vector<std::vector<T>> gaussCurvaturesVector(
83 levelSet->getNumberOfSegments());
85 auto grid = levelSet->getGrid();
86 const bool calculateMean =
89 const bool calculateGauss =
94#pragma omp parallel num_threads(levelSet->getNumberOfSegments())
98 p = omp_get_thread_num();
101 auto &meanCurvatures = meanCurvaturesVector[p];
102 auto &gaussCurvatures = gaussCurvaturesVector[p];
105 meanCurvatures.reserve(
106 levelSet->getDomain().getDomainSegment(p).getNumberOfPoints());
108 if (calculateGauss) {
109 gaussCurvatures.reserve(
110 levelSet->getDomain().getDomainSegment(p).getNumberOfPoints());
113 viennahrle::Index<D>
const startVector =
114 (p == 0) ? grid.getMinGridPoint()
115 : levelSet->getDomain().getSegmentation()[p - 1];
117 viennahrle::Index<D>
const endVector =
118 (p !=
static_cast<int>(levelSet->getNumberOfSegments() - 1))
119 ? levelSet->getDomain().getSegmentation()[p]
120 : grid.incrementIndices(grid.getMaxGridPoint());
123 neighborIt(levelSet->getDomain(), startVector);
124 neighborIt.getIndices() < endVector; neighborIt.next()) {
126 auto ¢er = neighborIt.getCenter();
127 if (!center.isDefined()) {
129 }
else if (std::abs(center.getValue()) > maxValue) {
131 meanCurvatures.push_back(0.);
133 gaussCurvatures.push_back(0.);
141 if (calculateGauss) {
149 unsigned numberOfCurvatures = 0;
150 for (
unsigned i = 0; i < levelSet->getNumberOfSegments(); ++i) {
151 numberOfCurvatures += meanCurvaturesVector[i].size();
153 meanCurvaturesVector[0].reserve(numberOfCurvatures);
155 for (
unsigned i = 1; i < levelSet->getNumberOfSegments(); ++i) {
156 meanCurvaturesVector[0].insert(meanCurvaturesVector[0].end(),
157 meanCurvaturesVector[i].begin(),
158 meanCurvaturesVector[i].end());
162 if (calculateGauss) {
163 unsigned numberOfCurvatures = 0;
164 for (
unsigned i = 0; i < levelSet->getNumberOfSegments(); ++i) {
165 numberOfCurvatures += gaussCurvaturesVector[i].size();
167 gaussCurvaturesVector[0].reserve(numberOfCurvatures);
169 for (
unsigned i = 1; i < levelSet->getNumberOfSegments(); ++i) {
170 gaussCurvaturesVector[0].insert(gaussCurvaturesVector[0].end(),
171 gaussCurvaturesVector[i].begin(),
172 gaussCurvaturesVector[i].end());
178 auto &pointData = levelSet->getPointData();
179 auto scalarDataPointer =
182 if (scalarDataPointer ==
nullptr) {
183 pointData.insertNextScalarData(meanCurvaturesVector[0],
187 *scalarDataPointer = std::move(meanCurvaturesVector[0]);
191 if (calculateGauss) {
192 auto &pointData = levelSet->getPointData();
193 auto scalarDataPointer =
196 if (scalarDataPointer ==
nullptr) {
197 pointData.insertNextScalarData(gaussCurvaturesVector[0],
201 *scalarDataPointer = std::move(gaussCurvaturesVector[0]);