26 auto &domain = levelSet->getDomain();
27 auto &grid = levelSet->getGrid();
30 Vec3D<T> minDefinedPoint;
31 Vec3D<T> maxDefinedPoint;
33 for (
int i = 0; i <
D; ++i) {
34 minDefinedPoint[i] = std::numeric_limits<T>::max();
35 maxDefinedPoint[i] = std::numeric_limits<T>::lowest();
38 for (viennahrle::SparseIterator<hrleDomainType> it(domain);
39 !it.isFinished(); it.next()) {
44 auto point = it.getStartIndices();
45 for (
int i = 0; i <
D; ++i) {
48 minDefinedPoint[i] = std::min(minDefinedPoint[i], coord);
49 maxDefinedPoint[i] = std::max(maxDefinedPoint[i], coord);
55 auto dir = Normalize(Inv(direction));
56 std::vector<T> visibilities(domain.getNumberOfPoints(),
static_cast<T>(-1));
58#pragma omp parallel num_threads(levelSet->getNumberOfSegments())
62 p = omp_get_thread_num();
65 const viennahrle::Index<D> startVector =
66 (p == 0) ? grid.getMinGridPoint() : domain.getSegmentation()[p - 1];
68 const viennahrle::Index<D> endVector =
69 (p !=
static_cast<int>(domain.getNumberOfSegments() - 1))
70 ? domain.getSegmentation()[p]
71 : grid.incrementIndices(grid.getMaxGridPoint());
73 for (viennahrle::SparseIterator<hrleDomainType> it(domain, startVector);
74 it.getStartIndices() < endVector; ++it) {
81 for (
int i = 0; i <
D; ++i) {
82 currentPos[i] = it.getStartIndices(i);
86 T minLevelSetValue = it.getValue();
87 Vec3D<T> rayPos = currentPos;
90 for (
int i = 0; i <
D; ++i)
93 bool visibility =
true;
97 for (
int i = 0; i <
D; ++i)
101 viennahrle::Index<D> nearestCell;
102 for (
int i = 0; i <
D; ++i)
103 nearestCell[i] =
static_cast<viennahrle::IndexType
>(rayPos[i]);
106 bool outOfBounds =
false;
107 for (
int i = 0; i <
D; ++i) {
108 if (nearestCell[i] < minDefinedPoint[i] ||
109 nearestCell[i] > maxDefinedPoint[i]) {
120 viennahrle::SparseIterator<hrleDomainType>(domain, nearestCell)
124 if (value < minLevelSetValue) {
131 visibilities[it.getPointId()] = visibility ? 1.0 : 0.0;
135 int unassignedCount = 0;
136 for (
size_t i = 0; i < visibilities.size(); ++i) {
137 if (visibilities[i] < 0) {
138 std::cerr <<
"Unassigned visibility at point ID: " << i << std::endl;
142 if (unassignedCount > 0) {
143 std::cerr <<
"[Error] Total unassigned points: " << unassignedCount
147 auto &pointData = levelSet->getPointData();
149 if (
int i = pointData.getScalarDataIndex(visibilitiesLabel); i != -1) {
150 pointData.eraseScalarData(i);
152 pointData.insertNextScalarData(visibilities, visibilitiesLabel);