This commit is contained in:
Dmitry Anisimov 2020-12-17 15:56:15 +01:00
parent 3ea8c08da5
commit ffcdf54b76
3 changed files with 128 additions and 73 deletions

View File

@ -137,6 +137,23 @@ public:
}
};
struct Halfedge_to_pface {
using argument_type = Halfedge_index;
using result_type = PFace;
const KSR::size_t support_plane_idx;
const Mesh& mesh;
Halfedge_to_pface(const KSR::size_t sp_idx, const Mesh& m) :
support_plane_idx(sp_idx),
mesh(m)
{ }
const result_type operator()(const argument_type& arg) const {
return result_type(support_plane_idx, mesh.face(arg));
}
};
using PEdge_around_pvertex_iterator =
boost::transform_iterator<Halfedge_to_pedge, CGAL::Halfedge_around_target_iterator<Mesh> >;
using PEdges_around_pvertex = CGAL::Iterator_range<PEdge_around_pvertex_iterator>;
@ -145,6 +162,10 @@ public:
boost::transform_iterator<Halfedge_to_pedge, CGAL::Halfedge_around_face_iterator<Mesh> >;
using PEdges_of_pface = CGAL::Iterator_range<PEdge_of_pface_iterator>;
using PFace_around_pvertex_iterator =
boost::transform_iterator<Halfedge_to_pface, CGAL::Halfedge_around_target_iterator<Mesh> >;
using PFaces_around_pvertex = CGAL::Iterator_range<PFace_around_pvertex_iterator>;
using IVertex = typename Intersection_graph::Vertex_descriptor;
using IEdge = typename Intersection_graph::Edge_descriptor;
@ -692,6 +713,28 @@ public:
return out;
}
const PFaces_around_pvertex pfaces_around_pvertex(const PVertex& pvertex) const {
return PFaces_around_pvertex(
boost::make_transform_iterator(
halfedges_around_target(halfedge(pvertex.second, mesh(pvertex)), mesh(pvertex)).begin(),
Halfedge_to_pface(pvertex.first, mesh(pvertex))),
boost::make_transform_iterator(
halfedges_around_target(halfedge(pvertex.second, mesh(pvertex)), mesh(pvertex)).end(),
Halfedge_to_pface(pvertex.first, mesh(pvertex))));
}
void non_null_pfaces_around_pvertex(
const PVertex& pvertex, std::vector<PFace>& pfaces) const {
pfaces.clear();
const auto nfaces = pfaces_around_pvertex(pvertex);
for (const auto pface : nfaces) {
if (pface.second == Support_plane::Mesh::null_face()) continue;
pfaces.push_back(pface);
}
}
const PVertices_of_pface pvertices_of_pface(const PFace& pface) const {
return PVertices_of_pface(
@ -1402,12 +1445,9 @@ public:
pvertices[2] = propagated;
const PFace new_pface = add_pface(pvertices);
if (m_verbose) std::cout << "- new pface: " << lstr(new_pface) << std::endl;
this->k(new_pface) = k;
CGAL_assertion(new_pface.second != Face_index());
if (m_verbose) {
std::cout << "- new face: " << lstr(new_pface) << std::endl;
}
return pvertices;
}
@ -1977,6 +2017,7 @@ public:
if (m_verbose) std::cout << "- propagated: " << point_3(propagated) << std::endl;
const PFace new_pface = add_pface(std::array<PVertex, 3>{pvertex, propagated, previous});
if (m_verbose) std::cout << "- new pface: " << lstr(new_pface) << std::endl;
this->k(new_pface) = this->k(pface);
previous = propagated;
@ -2164,6 +2205,7 @@ public:
if (m_verbose) std::cout << "- propagated: " << point_3(propagated) << std::endl;
const PFace new_pface = add_pface(std::array<PVertex, 3>{pvertex, previous, propagated});
if (m_verbose) std::cout << "- new pface: " << lstr(new_pface) << std::endl;
this->k(new_pface) = this->k(pface);
previous = propagated;
@ -2454,6 +2496,7 @@ public:
std::cout << "- adding new pface" << std::endl;
}
const PFace new_pface = add_pface(std::array<PVertex, 3>{new_pvertices[i], new_pvertices[i + 1], pvertex});
if (m_verbose) std::cout << "- new pface: " << lstr(new_pface) << std::endl;
this->k(new_pface) = k;
++num_added_pfaces;
}
@ -2549,6 +2592,10 @@ public:
std::cout << "* number of removed hanging faces: " << num_removed_faces << std::endl;
}
// CGAL_assertion_msg(false, "TODO: DEBUG THIS FUNCTION!");
// TODO: Should I also implement here the part that removes all
// identical pfaces within the same support plane? If the k intersection
// criteria works well, that should not be necessary!
}
const std::size_t check_edge(const IEdge& iedge) {
@ -2793,7 +2840,7 @@ public:
boost::make_transform_iterator(pvertices.end(), unary_f));
// Very slow!
if (true) {
if (check_equal_faces) {
for (const auto oface : pfaces) {
if (oface == pface) continue;
@ -2882,7 +2929,7 @@ public:
void check_integrity(
const bool check_simplicity = false,
const bool check_convexity = false,
const bool check_equal_faces = false) const {
const bool check_equal_faces = true) const {
for (KSR::size_t i = 0; i < number_of_support_planes(); ++i) {
if (!is_mesh_valid(check_simplicity, check_convexity, check_equal_faces, i)) {

View File

@ -540,6 +540,9 @@ private:
dump(m_data, "iter-" + std::to_string(iteration));
dump_event(m_data, event, "iter-" + std::to_string(iteration));
}
// const KSR::size_t sp_debug_idx = 23;
// dump_2d_surface_mesh(m_data, sp_debug_idx, "iter-" + std::to_string(iteration) +
// "-surface-mesh-" + std::to_string(sp_debug_idx));
}
m_data.update_positions(current_time);

View File

@ -35,6 +35,7 @@ struct Polygon_map {
const bool run_test(
const std::string input_filename,
const std::vector<unsigned int>& ks,
const std::size_t num_iters,
std::size_t& num_tests) {
@ -47,7 +48,7 @@ const bool run_test(
std::cout << std::endl;
std::cout << "--INPUT FILE: " << input_filename << std::endl;
const Polygon_map polygon_map(input_vertices);
for (unsigned int k = 1; k <= 6; ++k) {
for (const auto k : ks) {
std::cout << std::endl << "--INPUT K: " << k << std::endl;
for (std::size_t iter = 0; iter < num_iters; ++iter) {
std::cout << std::endl << "--ITERATION #" << iter + 1 << " BEGIN!" << std::endl;
@ -57,16 +58,6 @@ const bool run_test(
std::cout << std::endl << "--ITERATION #" << iter + 1 << " END!" << std::endl;
}
}
std::cout << std::endl << "--INPUT K: " << 100 << std::endl;
for (std::size_t iter = 0; iter < num_iters; ++iter) {
std::cout << std::endl << "--ITERATION #" << iter + 1 << " BEGIN!" << std::endl;
KSR ksr(false, false);
assert(ksr.partition(input_faces, polygon_map, 100));
ksr.clear();
std::cout << std::endl << "--ITERATION #" << iter + 1 << " END!" << std::endl;
}
return true;
}
@ -75,78 +66,92 @@ int main (const int argc, const char** argv) {
std::size_t num_tests = 0;
const std::size_t num_iters = 3;
std::vector<unsigned int> ks;
for (unsigned int k = 1; k <= 6; ++k) {
ks.push_back(k);
}
ks.push_back(100);
// Stress tests 0.
assert(run_test("data/stress-test-0/test-1-polygon-a.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-1-polygon-b.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-1-polygon-c.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-1-polygon-d.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-2-polygons-ab.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-2-polygons-ac.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-2-polygons-ad.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-2-polygons-bc.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-2-polygons-bd.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-2-polygons-cd.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-3-polygons-abc.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-3-polygons-abd.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-3-polygons-acd.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-3-polygons-bcd.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-4-polygons-abcd.off", num_iters, num_tests));
assert(run_test("data/stress-test-0/test-6-polygons.off" , num_iters, num_tests));
assert(run_test("data/stress-test-0/test-1-polygon-a.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-1-polygon-b.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-1-polygon-c.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-1-polygon-d.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-2-polygons-ab.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-2-polygons-ac.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-2-polygons-ad.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-2-polygons-bc.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-2-polygons-bd.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-2-polygons-cd.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-3-polygons-abc.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-3-polygons-abd.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-3-polygons-acd.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-3-polygons-bcd.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-4-polygons-abcd.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-0/test-6-polygons.off" , ks, num_iters, num_tests));
// Stress tests 1.
assert(run_test("data/stress-test-1/test-1-rnd-polygons-1-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-1/test-2-rnd-polygons-1-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-1/test-3-rnd-polygons-1-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-1/test-4-rnd-polygons-1-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-1/test-5-rnd-polygons-2-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-1/test-6-rnd-polygons-2-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-1/test-7-rnd-polygons-2-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-1/test-8-rnd-polygons-3-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-1/test-1-rnd-polygons-1-4.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-1/test-2-rnd-polygons-1-4.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-1/test-3-rnd-polygons-1-4.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-1/test-4-rnd-polygons-1-4.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-1/test-5-rnd-polygons-2-4.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-1/test-6-rnd-polygons-2-4.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-1/test-7-rnd-polygons-2-4.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-1/test-8-rnd-polygons-3-4.off", ks, num_iters, num_tests));
// Stress tests 2.
assert(run_test("data/stress-test-2/test-1-rnd-polygons-1-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-2/test-2-rnd-polygons-1-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-2/test-3-rnd-polygons-1-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-2/test-4-rnd-polygons-1-3.off", num_iters, num_tests));
assert(run_test("data/stress-test-2/test-5-rnd-polygons-2-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-2/test-6-rnd-polygons-3-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-2/test-1-rnd-polygons-1-4.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-2/test-2-rnd-polygons-1-4.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-2/test-3-rnd-polygons-1-4.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-2/test-4-rnd-polygons-1-3.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-2/test-5-rnd-polygons-2-4.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-2/test-6-rnd-polygons-3-4.off", ks, num_iters, num_tests));
// Stress tests 3.
assert(run_test("data/stress-test-3/test-1-rnd-polygons-2-3.off" , num_iters, num_tests));
assert(run_test("data/stress-test-3/test-2-rnd-polygons-2-3.off" , num_iters, num_tests));
assert(run_test("data/stress-test-3/test-3-rnd-polygons-2-3.off" , num_iters, num_tests));
assert(run_test("data/stress-test-3/test-4-rnd-polygons-2-4.off" , num_iters, num_tests));
assert(run_test("data/stress-test-3/test-5-rnd-polygons-1-3.off" , num_iters, num_tests));
assert(run_test("data/stress-test-3/test-6-rnd-polygons-2-3.off" , num_iters, num_tests));
assert(run_test("data/stress-test-3/test-7-rnd-polygons-2-4.off" , num_iters, num_tests));
assert(run_test("data/stress-test-3/test-8-rnd-polygons-2-10.off", num_iters, num_tests));
assert(run_test("data/stress-test-3/test-9-rnd-polygons-4-4.off" , num_iters, num_tests));
assert(run_test("data/stress-test-3/test-10-rnd-polygons-5-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-3/test-1-rnd-polygons-2-3.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-3/test-2-rnd-polygons-2-3.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-3/test-3-rnd-polygons-2-3.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-3/test-4-rnd-polygons-2-4.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-3/test-5-rnd-polygons-1-3.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-3/test-6-rnd-polygons-2-3.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-3/test-7-rnd-polygons-2-4.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-3/test-8-rnd-polygons-2-10.off", ks, num_iters, num_tests));
assert(run_test("data/stress-test-3/test-9-rnd-polygons-4-4.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-3/test-10-rnd-polygons-5-4.off", ks, num_iters, num_tests));
// Stress tests 4.
assert(run_test("data/stress-test-4/test-1-rnd-polygons-2-6.off" , num_iters, num_tests));
assert(run_test("data/stress-test-4/test-2-rnd-polygons-3-8.off" , num_iters, num_tests));
assert(run_test("data/stress-test-4/test-3-rnd-polygons-4-4.off" , num_iters, num_tests));
assert(run_test("data/stress-test-4/test-4-rnd-polygons-4-6.off" , num_iters, num_tests));
assert(run_test("data/stress-test-4/test-5-rnd-polygons-6-4.off" , num_iters, num_tests));
assert(run_test("data/stress-test-4/test-6-rnd-polygons-5-6.off" , num_iters, num_tests));
assert(run_test("data/stress-test-4/test-7-rnd-polygons-7-6.off" , num_iters, num_tests));
assert(run_test("data/stress-test-4/test-8-rnd-polygons-7-8.off" , num_iters, num_tests));
assert(run_test("data/stress-test-4/test-9-rnd-polygons-12-4.off", num_iters, num_tests));
assert(run_test("data/stress-test-4/test-1-rnd-polygons-2-6.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-4/test-2-rnd-polygons-3-8.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-4/test-3-rnd-polygons-4-4.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-4/test-4-rnd-polygons-4-6.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-4/test-5-rnd-polygons-6-4.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-4/test-6-rnd-polygons-5-6.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-4/test-7-rnd-polygons-7-6.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-4/test-8-rnd-polygons-7-8.off" , ks, num_iters, num_tests));
assert(run_test("data/stress-test-4/test-9-rnd-polygons-12-4.off", ks, num_iters, num_tests));
// Real data tests.
assert(run_test("data/real-data-test/building-a-10polygons-10planes.off", num_iters, num_tests));
assert(run_test("data/real-data-test/building-b-15squares-15planes.off" , num_iters, num_tests));
assert(run_test("data/real-data-test/building-a-10polygons-10planes.off", ks, num_iters, num_tests));
assert(run_test("data/real-data-test/building-b-15squares-15planes.off" , ks, num_iters, num_tests));
// Edge case tests.
assert(run_test("data/edge-case-test/test-2-polygons.off" , num_iters, num_tests)); // edge touch
assert(run_test("data/edge-case-test/test-4-polygons.off" , num_iters, num_tests)); // edge touch / 2 coplanar
assert(run_test("data/edge-case-test/test-5-polygons.off" , num_iters, num_tests)); // edge touch / vertex touch / 2 coplanar
// assert(run_test("data/edge-case-test/test-20-polygons.off", num_iters, num_tests)); // 2 overlap and coplanar
assert(run_test("data/edge-case-test/test-2-polygons.off" , ks, num_iters, num_tests)); // edge touch
assert(run_test("data/edge-case-test/test-4-polygons.off" , ks, num_iters, num_tests)); // edge touch / 2 coplanar
assert(run_test("data/edge-case-test/test-5-polygons.off" , ks, num_iters, num_tests)); // edge touch / vertex touch / 2 coplanar
std::vector<unsigned int> ts;
ts.push_back(1); ts.push_back(2); ts.push_back(4);
ts.push_back(5); ts.push_back(6); ts.push_back(100);
assert(run_test("data/edge-case-test/test-20-polygons.off", ts, num_iters, num_tests)); // 2 overlap and coplanar
std::cout << std::endl << "--OUTPUT STATS:" << std::endl;
std::cout << "* number of iterations per test: " << num_iters << std::endl;
std::cout << "* k intersections: {1,2,3,4,5,6,100}" << std::endl;
std::cout << "* k intersections: {";
for (const auto k : ks) {
std::cout << k << ",";
}
std::cout << "...}" << std::endl;
std::cout << std::endl << "ALL " << num_tests << " TESTS SUCCESS!" << std::endl;
return EXIT_SUCCESS;