26 auto &domain = levelSet->getDomain();
27 auto &grid = levelSet->getGrid();
30 auto dir = Normalize(Inv(direction));
31 std::vector<T> visibilities(domain.getNumberOfPoints(),
static_cast<T>(-1));
36 for (
int i = 0; i <
D; ++i) {
37 dirNorm += dir[i] * dir[i];
40 if (dirNorm < epsilon) {
41 std::fill(visibilities.begin(), visibilities.end(),
static_cast<T>(1.0));
44 Vec3D<T> minDefinedPoint{};
45 Vec3D<T> maxDefinedPoint{};
47 for (
int i = 0; i <
D; ++i) {
48 minDefinedPoint[i] = std::numeric_limits<T>::max();
49 maxDefinedPoint[i] = std::numeric_limits<T>::lowest();
52 for (viennahrle::SparseIterator<hrleDomainType> it(domain);
53 !it.isFinished(); it.next()) {
58 auto point = it.getStartIndices();
59 for (
int i = 0; i <
D; ++i) {
62 minDefinedPoint[i] = std::min(minDefinedPoint[i], coord);
63 maxDefinedPoint[i] = std::max(maxDefinedPoint[i], coord);
68#pragma omp parallel for
69 for (
unsigned p = 0; p < domain.getNumberOfSegments(); ++p) {
71 const viennahrle::Index<D> startVector =
72 (p == 0) ? grid.getMinGridPoint() : domain.getSegmentation()[p - 1];
74 const viennahrle::Index<D> endVector =
75 (p !=
static_cast<int>(domain.getNumberOfSegments() - 1))
76 ? domain.getSegmentation()[p]
77 : grid.incrementIndices(grid.getMaxGridPoint());
79 for (viennahrle::SparseIterator<hrleDomainType> it(domain, startVector);
80 it.getStartIndices() < endVector; ++it) {
86 Vec3D<T> currentPos{};
87 for (
int i = 0; i <
D; ++i) {
88 currentPos[i] = it.getStartIndices(i);
92 T minLevelSetValue = it.getValue();
93 Vec3D<T> rayPos = currentPos;
96 for (
int i = 0; i <
D; ++i)
99 bool visibility =
true;
103 for (
int i = 0; i <
D; ++i)
107 viennahrle::Index<D> nearestCell;
108 for (
int i = 0; i <
D; ++i)
109 nearestCell[i] =
static_cast<viennahrle::IndexType
>(rayPos[i]);
112 bool outOfBounds =
false;
113 for (
int i = 0; i <
D; ++i) {
114 if (nearestCell[i] < minDefinedPoint[i] ||
115 nearestCell[i] > maxDefinedPoint[i]) {
126 viennahrle::SparseIterator<hrleDomainType>(domain, nearestCell)
130 if (value < minLevelSetValue) {
137 visibilities[it.getPointId()] = visibility ? 1.0 : 0.0;
142 int unassignedCount = 0;
143 for (
size_t i = 0; i < visibilities.size(); ++i) {
144 if (visibilities[i] < 0) {
145 std::cerr <<
"Unassigned visibility at point ID: " << i << std::endl;
149 if (unassignedCount > 0) {
150 std::cerr <<
"[Error] Total unassigned points: " << unassignedCount
154 auto &pointData = levelSet->getPointData();
156 if (
int i = pointData.getScalarDataIndex(visibilitiesLabel); i != -1) {
157 pointData.eraseScalarData(i);
159 pointData.insertNextScalarData(visibilities, visibilitiesLabel);