mirror of https://github.com/CGAL/cgal
add a test for determinism of Tetrahedral_remeshing
This commit is contained in:
parent
97497b6809
commit
ecd2ed13f8
|
|
@ -16,6 +16,7 @@ create_single_source_cgal_program("test_tetrahedral_remeshing_with_features.cpp"
|
||||||
create_single_source_cgal_program("test_tetrahedral_remeshing_of_one_subdomain.cpp")
|
create_single_source_cgal_program("test_tetrahedral_remeshing_of_one_subdomain.cpp")
|
||||||
create_single_source_cgal_program("test_tetrahedral_remeshing_io.cpp")
|
create_single_source_cgal_program("test_tetrahedral_remeshing_io.cpp")
|
||||||
create_single_source_cgal_program("test_tetrahedral_remeshing_from_mesh_file.cpp")
|
create_single_source_cgal_program("test_tetrahedral_remeshing_from_mesh_file.cpp")
|
||||||
|
create_single_source_cgal_program("test_tetrahedral_remeshing_determinism.cpp")
|
||||||
|
|
||||||
# Test MLS projection
|
# Test MLS projection
|
||||||
add_executable(test_tetrahedral_remeshing_mls
|
add_executable(test_tetrahedral_remeshing_mls
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
//#define CGAL_TETRAHEDRAL_REMESHING_VERBOSE
|
||||||
|
//#define CGAL_TETRAHEDRAL_REMESHING_DEBUG
|
||||||
|
//#define CGAL_TETRAHEDRAL_REMESHING_GENERATE_INPUT_FILES
|
||||||
|
|
||||||
|
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||||
|
|
||||||
|
#include <CGAL/Tetrahedral_remeshing/Remeshing_triangulation_3.h>
|
||||||
|
#include <CGAL/tetrahedral_remeshing.h>
|
||||||
|
#include <CGAL/Tetrahedral_remeshing/tetrahedral_remeshing_io.h>
|
||||||
|
#include <CGAL/Random.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
|
||||||
|
|
||||||
|
typedef CGAL::Tetrahedral_remeshing::Remeshing_triangulation_3<K> Remeshing_triangulation;
|
||||||
|
|
||||||
|
template<typename T3>
|
||||||
|
void generate_input_one_subdomain(const std::size_t nbv, T3& tr)
|
||||||
|
{
|
||||||
|
CGAL::Random rng;
|
||||||
|
|
||||||
|
typedef typename T3::Point Point;
|
||||||
|
std::vector<Point> pts;
|
||||||
|
while (pts.size() < nbv)
|
||||||
|
{
|
||||||
|
const float x = rng.uniform_real(-10.f, 10.f);
|
||||||
|
const float y = rng.uniform_real(-10.f, 10.f);
|
||||||
|
const float z = rng.uniform_real(-10.f, 10.f);
|
||||||
|
|
||||||
|
pts.push_back(Point(x, y, z));
|
||||||
|
}
|
||||||
|
tr.insert(pts.begin(), pts.end());
|
||||||
|
|
||||||
|
for (typename T3::Cell_handle c : tr.finite_cell_handles())
|
||||||
|
c->set_subdomain_index(1);
|
||||||
|
|
||||||
|
assert(tr.is_valid(true));
|
||||||
|
|
||||||
|
#ifdef CGAL_TETRAHEDRAL_REMESHING_GENERATE_INPUT_FILES
|
||||||
|
std::ofstream out("data/triangulation_one_subdomain.binary.cgal",
|
||||||
|
std::ios_base::out | std::ios_base::binary);
|
||||||
|
CGAL::save_binary_triangulation(out, tr);
|
||||||
|
out.close();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
std::cout << "CGAL Random seed = " << CGAL::get_default_random().get_seed() << std::endl;
|
||||||
|
|
||||||
|
// Collect options
|
||||||
|
std::size_t nb_runs = 5;
|
||||||
|
|
||||||
|
Remeshing_triangulation tr;
|
||||||
|
generate_input_one_subdomain(1000, tr);
|
||||||
|
|
||||||
|
const int target_edge_length = (argc > 1) ? atoi(argv[1]) : 1;
|
||||||
|
|
||||||
|
std::ofstream ofs0("in.mesh");
|
||||||
|
CGAL::IO::write_MEDIT(ofs0, tr);
|
||||||
|
ofs0.close();
|
||||||
|
|
||||||
|
Remeshing_triangulation tr_ref = tr; // Keep a reference for comparison
|
||||||
|
|
||||||
|
std::vector<std::string> output_tr;
|
||||||
|
output_tr.reserve(nb_runs);
|
||||||
|
|
||||||
|
for(std::size_t i = 0; i < nb_runs; ++i)
|
||||||
|
{
|
||||||
|
std::cout << "Run " << i << " of " << nb_runs << std::endl;
|
||||||
|
|
||||||
|
tr = tr_ref; // Reset triangulation to reference
|
||||||
|
CGAL::tetrahedral_isotropic_remeshing(tr, target_edge_length);
|
||||||
|
|
||||||
|
std::ostringstream oss;
|
||||||
|
CGAL::IO::write_MEDIT(oss, tr);
|
||||||
|
output_tr.push_back(oss.str());
|
||||||
|
oss.clear();
|
||||||
|
|
||||||
|
if(i == 0)
|
||||||
|
continue; // skip first run, it is the reference
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(0 != output_tr[i-1].compare(output_tr[i]))
|
||||||
|
{
|
||||||
|
std::cerr << "Run " << i << " differs from run " << i-1 << std::endl;
|
||||||
|
assert(false); // This should not happen
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Run " << i << " is identical to run " << i-1 << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue