28 SmartPointer<Domain<T, D>> levelSet =
nullptr;
32 std::vector<T> flaggedCells;
40 : levelSet(passedLevelSet) {}
43 : levelSet(passedLevelSet), flatLimit(passedLimit),
44 flatLimit2(flatLimit * flatLimit) {}
48 : levelSet(passedLevelSet), method(passedMethod), flatLimit(passedLimit),
49 flatLimit2(flatLimit * flatLimit) {}
52 flatLimit = threshold;
53 flatLimit2 = flatLimit * flatLimit;
60 method = passedMethod;
66 FeatureDetectionCurvature();
68 FeatureDetectionNormals();
72 auto &pointData = levelSet->getPointData();
75 if (vectorDataPointer ==
nullptr) {
79 *vectorDataPointer = std::move(flaggedCells);
90 void FeatureDetectionCurvature() {
93 auto grid = levelSet->getGrid();
95 std::vector<std::vector<T>> flagsReserve(levelSet->getNumberOfSegments());
97#pragma omp parallel for
98 for (
unsigned p = 0; p < levelSet->getNumberOfSegments(); ++p) {
100 auto &flagsSegment = flagsReserve[p];
101 flagsSegment.reserve(
102 levelSet->getDomain().getDomainSegment(p).getNumberOfPoints());
104 viennahrle::Index<D>
const startVector =
105 (p == 0) ? grid.getMinGridPoint() : domain.getSegmentation()[p - 1];
107 viennahrle::Index<D>
const endVector =
109 ? domain.getSegmentation()[p]
110 : grid.incrementIndices(grid.getMaxGridPoint());
114 neighborIt(levelSet->getDomain(), startVector);
115 neighborIt.getIndices() < endVector; neighborIt.next()) {
117 auto ¢er = neighborIt.getCenter();
118 if (!center.isDefined()) {
120 }
else if (std::abs(center.getValue()) > 0.5) {
121 flagsSegment.push_back(0);
126 if (std::abs(curve) > flatLimit) {
127 flagsSegment.push_back(1);
129 if constexpr (
D == 2) {
130 flagsSegment.push_back(0);
133 if (std::abs(curve) > flatLimit2)
134 flagsSegment.push_back(1);
136 flagsSegment.push_back(0);
142 flaggedCells.reserve(levelSet->getNumberOfPoints());
143 for (
unsigned i = 0; i < levelSet->getNumberOfSegments(); ++i)
144 flaggedCells.insert(flaggedCells.end(), flagsReserve[i].begin(),
145 flagsReserve[i].end());
151 void FeatureDetectionNormals() {
153 flaggedCells.clear();
155 auto &grid = levelSet->getGrid();
157 T cosAngleTreshold = std::cos(flatLimit);
162 const auto &normals = *(levelSet->getPointData().getVectorData(
165 std::vector<std::vector<T>> flagsReserve(levelSet->getNumberOfSegments());
168#pragma omp parallel for
169 for (
unsigned p = 0; p < levelSet->getNumberOfSegments(); ++p) {
171 Vec3D<T> zeroVector{};
173 std::vector<T> &flagsSegment = flagsReserve[p];
174 flagsSegment.reserve(
175 levelSet->getDomain().getDomainSegment(p).getNumberOfPoints());
177 viennahrle::Index<D>
const startVector =
178 (p == 0) ? grid.getMinGridPoint() : domain.getSegmentation()[p - 1];
180 viennahrle::Index<D>
const endVector =
182 ? domain.getSegmentation()[p]
183 : grid.incrementIndices(grid.getMaxGridPoint());
186 neighborIt(levelSet->getDomain(), startVector);
187 neighborIt.getIndices() < endVector; neighborIt.next()) {
188 if (!neighborIt.getCenter().isDefined()) {
190 }
else if (std::abs(neighborIt.getCenter().getValue()) >= 0.5) {
191 flagsSegment.push_back(0);
195 Vec3D<T> centerNormal = normals[neighborIt.getCenter().getPointId()];
199 constexpr unsigned numNeighbors = (
D == 3) ? 27 : 9;
200 for (
unsigned dir = 0; dir < numNeighbors; dir++) {
201 auto neighbor = neighborIt.getNeighbor(dir);
202 if (!neighbor.isDefined())
204 Vec3D<T> currentNormal = normals[neighbor.getPointId()];
206 if (currentNormal != zeroVector) {
209 for (
int j = 0; j <
D; j++) {
210 skp += currentNormal[j] * centerNormal[j];
213 if ((cosAngleTreshold - skp) >= 0.) {
221 flagsSegment.push_back(1);
223 flagsSegment.push_back(0);
228 for (
unsigned i = 0; i < levelSet->getNumberOfSegments(); ++i)
229 flaggedCells.insert(flaggedCells.end(), flagsReserve[i].begin(),
230 flagsReserve[i].end());
Class containing all information about the level set, including the dimensions of the domain,...
Definition lsDomain.hpp:27
viennahrle::Domain< T, D > DomainType
Definition lsDomain.hpp:32
unsigned getNumberOfSegments() const
returns the number of segments, the levelset is split into. This is useful for algorithm parallelisat...
Definition lsDomain.hpp:153
DomainType & getDomain()
get const reference to the underlying hrleDomain data structure
Definition lsDomain.hpp:147