Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[KSP & KSR] Bugfixes and doc update #8613

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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;

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