Skip to content

Commit

Permalink
[KSP & KSR] Bugfixes and doc update (#8613)
Browse files Browse the repository at this point in the history
## Summary of Changes

Fixed redundant initialization of kinetic space partition
Removed unnecessary computations
Fixed and updated doc 

## Release Management

* Affected package(s): Kinetic Space Partition, Kinetic Surface
Reconstruction
* Issue(s) solved (if any): fix #8594
  • Loading branch information
sloriot authored Nov 20, 2024
2 parents f692014 + c71488f commit d0bdc70
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 89 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -289,9 +289,8 @@ class Intersection_graph {
m_initial_intervals.resize(e.size());

std::size_t idx = 0;
for (const auto& edge : e) {
for (const auto& edge : e)
m_initial_intervals[idx++] = m_graph[edge].intervals;
}

m_initial_part_of_partition.resize(m_ifaces.size());
for (idx = 0; idx < m_ifaces.size(); idx++)
Expand All @@ -303,9 +302,8 @@ class Intersection_graph {
CGAL_assertion(e.size() == m_initial_intervals.size());
std::size_t idx = 0;

for (auto edge : e) {
m_graph[edge].intervals = m_initial_intervals[idx];
}
for (auto edge : e)
m_graph[edge].intervals = m_initial_intervals[idx++];

CGAL_assertion(m_ifaces.size() == m_initial_part_of_partition.size());
for (idx = 0; idx < m_ifaces.size(); idx++)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -731,7 +731,7 @@ class Kinetic_space_partition_3 {
}

if (m_parameters.verbose)
std::cout << "ksp v: " << m_partition_nodes[0].m_data->vertices().size() << " f: " << m_partition_nodes[0].face2vertices.size() << " vol: " << m_volumes.size() << std::endl;
std::cout << "ksp v: " << m_partition_nodes[0].m_data->vertices().size() << " f: " << m_partition_nodes[0].face2vertices.size() << " vol: " << m_volumes.size() << std::endl;

return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,9 +284,9 @@ Building_C
<TD class="math" ALIGN=RIGHT NOWRAP>
3.432
<TD class="math" ALIGN=RIGHT NOWRAP>
370
369
<TD class="math" ALIGN=RIGHT NOWRAP>
1.466
1.457
<TD class="math" ALIGN=RIGHT NOWRAP>
40,1
<TD class="math" ALIGN=RIGHT NOWRAP>
Expand Down Expand Up @@ -376,10 +376,10 @@ Meeting Room
<TD class="math" ALIGN=RIGHT NOWRAP>
15
<TD class="math" ALIGN=RIGHT NOWRAP>
0,03
<TD class="math" ALIGN=RIGHT NOWRAP>
10
<TD class="math" ALIGN=RIGHT NOWRAP>
0,03
<TD class="math" ALIGN=RIGHT NOWRAP>
3
<TD class="math" ALIGN=RIGHT NOWRAP>
0,5
Expand All @@ -396,10 +396,10 @@ Full Thing
<TD class="math" ALIGN=RIGHT NOWRAP>
12
<TD class="math" ALIGN=RIGHT NOWRAP>
0,05
<TD class="math" ALIGN=RIGHT NOWRAP>
3
<TD class="math" ALIGN=RIGHT NOWRAP>
0,05
<TD class="math" ALIGN=RIGHT NOWRAP>
1
<TD class="math" ALIGN=RIGHT NOWRAP>
0,5
Expand All @@ -416,10 +416,10 @@ Hilbert cube
<TD class="math" ALIGN=RIGHT NOWRAP>
12
<TD class="math" ALIGN=RIGHT NOWRAP>
0,03
<TD class="math" ALIGN=RIGHT NOWRAP>
5
<TD class="math" ALIGN=RIGHT NOWRAP>
0,03
<TD class="math" ALIGN=RIGHT NOWRAP>
4
<TD class="math" ALIGN=RIGHT NOWRAP>
0,5
Expand Down Expand Up @@ -456,10 +456,10 @@ Building_C
<TD class="math" ALIGN=RIGHT NOWRAP>
15
<TD class="math" ALIGN=RIGHT NOWRAP>
0,5
<TD class="math" ALIGN=RIGHT NOWRAP>
3
<TD class="math" ALIGN=RIGHT NOWRAP>
0,5
<TD class="math" ALIGN=RIGHT NOWRAP>
2
<TD class="math" ALIGN=RIGHT NOWRAP>
0,77
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,15 +171,10 @@ int main(const int argc, const char** argv) {
timer.start();
std::size_t num_shapes = ksr.detect_planar_shapes(param);


std::cout << num_shapes << " detected planar shapes" << std::endl;
std::cout << num_shapes << " regularized detected planar shapes" << std::endl;

FT after_shape_detection = timer.time();

ksr.initialize_partition(param);

FT after_init = timer.time();

ksr.partition(parameters.k_intersections);

FT after_partition = timer.time();
Expand All @@ -198,6 +193,8 @@ int main(const int argc, const char** argv) {

FT after_reconstruction = timer.time();

std::cout << polylist.size() << " polygons, " << vtx.size() << " vertices" << std::endl;

if (polylist.size() > 0)
CGAL::IO::write_polygon_soup("polylist_" + std::to_string(parameters.graphcut_lambda) + (parameters.use_ground ? "_g" : "_") + ".off", vtx, polylist);

Expand All @@ -220,19 +217,16 @@ int main(const int argc, const char** argv) {
else
ksr.reconstruct(l, external_nodes, std::back_inserter(vtx), std::back_inserter(polylist));


if (polylist.size() > 0) {
non_empty = true;
CGAL::IO::write_polygon_soup("polylist_" + std::to_string(l) + (parameters.use_ground ? "_g" : "_") + ".off", vtx, polylist);
}
}

std::cout << "Shape detection: " << after_shape_detection << " seconds!" << std::endl;
std::cout << "Kinetic partition: " << (after_partition - after_shape_detection) << " seconds!" << std::endl;
std::cout << " initialization: " << (after_init - after_shape_detection) << " seconds!" << std::endl;
std::cout << " partition: " << (after_partition - after_init) << " seconds!" << std::endl;
std::cout << "Kinetic reconstruction: " << (after_reconstruction - after_partition) << " seconds!" << std::endl;
std::cout << "Total time: " << time << " seconds!" << std::endl << std::endl;
std::cout << "Shape detection and initialization\nof kinetic partition: " << after_shape_detection << " seconds!" << std::endl;
std::cout << "Kinetic partition: " << (after_partition - after_shape_detection) << " seconds!" << std::endl;
std::cout << "Kinetic reconstruction: " << (after_reconstruction - after_partition) << " seconds!" << std::endl;
std::cout << "Total time: " << time << " seconds!" << std::endl << std::endl;

return (non_empty) ? EXIT_SUCCESS : EXIT_FAILURE;
}
Original file line number Diff line number Diff line change
Expand Up @@ -627,7 +627,6 @@ class Kinetic_surface_reconstruction_3 {
std::vector<std::pair<std::size_t, std::size_t> > m_volume_votes; // pair<inside, outside> votes
std::vector<bool> m_volume_below_ground;
std::vector<std::vector<double> > m_cost_matrix;
std::vector<FT> m_volumes; // normalized volume of each kinetic volume
std::vector<std::size_t> m_labels;

std::size_t m_total_inliers;
Expand Down Expand Up @@ -747,9 +746,9 @@ class Kinetic_surface_reconstruction_3 {
std::cout << "* computing data term ... ";

std::size_t max_inside = 0, max_outside = 0;
for (std::size_t i = 0; i < m_volumes.size(); i++) {
max_inside = (std::max<std::size_t>)(static_cast<std::size_t>(m_cost_matrix[0][i + 6]), max_inside);
max_outside = (std::max<std::size_t>)(static_cast<std::size_t>(m_cost_matrix[1][i + 6]), max_outside);
for (std::size_t i = 6; i < m_cost_matrix[0].size(); i++) {
max_inside = (std::max<std::size_t>)(static_cast<std::size_t>(m_cost_matrix[0][i]), max_inside);
max_outside = (std::max<std::size_t>)(static_cast<std::size_t>(m_cost_matrix[1][i]), max_outside);
}

// Dump volumes colored by votes
Expand Down Expand Up @@ -1743,55 +1742,14 @@ class Kinetic_surface_reconstruction_3 {
return face_area;
}

FT volume(typename LCC::Dart_descriptor volume_dart) {
FT x = 0, y = 0, z = 0;
std::size_t count = 0;
From_exact from_exact;

// Collect vertices to obtain point on the inside.
for (auto& fd : m_lcc.template one_dart_per_incident_cell<2, 3>(volume_dart)) {
typename LCC::Dart_descriptor fdh = m_lcc.dart_descriptor(fd);

for (const auto& vd : m_lcc.template one_dart_per_incident_cell<0, 2>(fdh)) {
const auto &p = from_exact(m_lcc.point(m_lcc.dart_descriptor(vd)));
x += p.x();
y += p.y();
z += p.z();
count++;
}
}

Point_3 center(x / count, y / count, z / count);

FT vol = 0;
// Second iteration for computing the area of each face and the volume spanned with the center point.
for (auto& fd : m_lcc.template one_dart_per_incident_cell<2, 3>(volume_dart)) {
typename LCC::Dart_descriptor fdh = m_lcc.dart_descriptor(fd);

Plane_3 plane;
FT a = area(fdh, plane);
Vector_3 n = plane.orthogonal_vector();

FT distance = CGAL::abs((plane.point() - center) * n);
vol += distance * a / 3.0;
}

return vol;
}

void count_volume_votes_lcc() {
// const int debug_volume = -1;
FT total_volume = 0;
std::size_t num_volumes = m_kinetic_partition.number_of_volumes();
m_volume_votes.clear();
m_volume_votes.resize(num_volumes, std::make_pair(0, 0));

m_volumes.resize(num_volumes, 0);

for (std::size_t i = 6; i < num_volumes; i++) {
for (std::size_t i = 6; i < num_volumes; i++)
m_cost_matrix[0][i] = m_cost_matrix[1][i] = 0;
m_volumes[i] = 0;
}

From_exact from_exact;

Expand Down Expand Up @@ -1829,28 +1787,15 @@ class Kinetic_surface_reconstruction_3 {
m_cost_matrix[1][v[j] + 6] += static_cast<double>(out[j]);
}
}

for (auto& d : m_lcc.template one_dart_per_cell<3>()) {
typename LCC::Dart_descriptor dh = m_lcc.dart_descriptor(d);

std::size_t volume_index = m_lcc.template info<3>(dh).volume_id;
m_volumes[volume_index] = volume(dh);

total_volume += m_volumes[volume_index];
}

// Normalize volumes
for (FT& v : m_volumes)
v /= total_volume;
}

template<typename NamedParameters>
void create_planar_shapes(const NamedParameters& np) {

if (m_points.size() < 3) {
if (m_verbose) std::cout << "* no points found, skipping" << std::endl;
return;
}

if (m_verbose) std::cout << "* getting planar shapes using region growing" << std::endl;

FT xmin, ymin, zmin, xmax, ymax, zmax;
Expand Down

0 comments on commit d0bdc70

Please sign in to comment.