min_edge_length -> max_edge_length

This commit is contained in:
Sébastien Loriot 2015-07-02 14:39:35 +02:00
parent 20c1ae4741
commit 7894e0e071
5 changed files with 40 additions and 40 deletions

View File

@ -289,8 +289,8 @@ private:
double m_omega_H; double m_omega_H;
/** Controling the smoothness of the medial approximation. */ /** Controling the smoothness of the medial approximation. */
double m_omega_P; double m_omega_P;
/** Edges with length less than `min_edge_length` will be collapsed. */ /** Edges with length less than `max_edge_length` will be collapsed. */
double m_min_edge_length; double m_max_edge_length;
/** Triangles with angle greater than `alpha_TH` will be split. */ /** Triangles with angle greater than `alpha_TH` will be split. */
double m_alpha_TH; double m_alpha_TH;
/** Value very close to zero. */ /** Value very close to zero. */
@ -356,7 +356,7 @@ double diagonal_length(const Bbox_3& bbox)
} }
double init_min_edge_length() double init_max_edge_length()
{ {
vertex_iterator vb, ve; vertex_iterator vb, ve;
boost::tie(vb, ve) = vertices(m_tmesh); boost::tie(vb, ve) = vertices(m_tmesh);
@ -382,7 +382,7 @@ public:
* - `area_variation_factor() == 0.0001` * - `area_variation_factor() == 0.0001`
* - `max_iterations() == 500` * - `max_iterations() == 500`
* - `is_medially_centered() == true` * - `is_medially_centered() == true`
* - `min_edge_length()` == 0.002 * the length of the diagonal of the bounding box of `tmesh` * - `max_edge_length()` == 0.002 * the length of the diagonal of the bounding box of `tmesh`
* *
* @pre `tmesh` is a triangulated surface mesh without borders and has exactly one connected component. * @pre `tmesh` is a triangulated surface mesh without borders and has exactly one connected component.
* @param tmesh * @param tmesh
@ -424,10 +424,10 @@ public:
} }
/// During the local remeshing step, an edge will be split /// During the local remeshing step, an edge will be split
/// if it is longer than `min_edge_length()`. /// if it is longer than `max_edge_length()`.
double min_edge_length() double max_edge_length()
{ {
return m_min_edge_length; return m_max_edge_length;
} }
void set_max_triangle_angle(double value) void set_max_triangle_angle(double value)
@ -435,9 +435,9 @@ public:
m_alpha_TH = value; m_alpha_TH = value;
} }
void set_min_edge_length(double value) void set_max_edge_length(double value)
{ {
m_min_edge_length = value; m_max_edge_length = value;
} }
/// @} /// @}
@ -679,7 +679,7 @@ public:
} }
/** /**
* Collapses edges of the meso-skeleton with length less than `min_edge_length()` and returns the number of edges collapsed. * Collapses edges of the meso-skeleton with length less than `max_edge_length()` and returns the number of edges collapsed.
*/ */
std::size_t collapse_edges() std::size_t collapse_edges()
{ {
@ -864,7 +864,7 @@ private:
m_delta_area = 0.0001; m_delta_area = 0.0001;
m_max_iterations = 500; m_max_iterations = 500;
m_is_medially_centered = true; m_is_medially_centered = true;
m_min_edge_length = init_min_edge_length(); m_max_edge_length = init_max_edge_length();
m_alpha_TH = 110 * (CGAL_PI / 180.0); m_alpha_TH = 110 * (CGAL_PI / 180.0);
m_zero_TH = 1e-7; m_zero_TH = 1e-7;
} }
@ -1104,10 +1104,10 @@ private:
vertex_descriptor vi = source(h, m_tmesh); vertex_descriptor vi = source(h, m_tmesh);
vertex_descriptor vj = target(h, m_tmesh); vertex_descriptor vj = target(h, m_tmesh);
/// \todo do not use sqrt but square m_min_edge_length /// \todo do not use sqrt but square m_max_edge_length
double edge_length = sqrt(squared_distance(get(m_tmesh_point_pmap, vi), double edge_length = sqrt(squared_distance(get(m_tmesh_point_pmap, vi),
get(m_tmesh_point_pmap, vj))); get(m_tmesh_point_pmap, vj)));
if (internal::is_collapse_ok(m_tmesh, h) && edge_length < m_min_edge_length) if (internal::is_collapse_ok(m_tmesh, h) && edge_length < m_max_edge_length)
{ {
Point p = midpoint( Point p = midpoint(
get(vertex_point, m_tmesh, source(h, m_tmesh)), get(vertex_point, m_tmesh, source(h, m_tmesh)),
@ -1310,7 +1310,7 @@ private:
if (m_is_vertex_fixed_map.find(idx) == m_is_vertex_fixed_map.end()) if (m_is_vertex_fixed_map.find(idx) == m_is_vertex_fixed_map.end())
{ {
bool willbefixed = internal::is_vertex_degenerate(m_tmesh, m_tmesh_point_pmap, bool willbefixed = internal::is_vertex_degenerate(m_tmesh, m_tmesh_point_pmap,
v, m_min_edge_length); v, m_max_edge_length);
if (willbefixed) if (willbefixed)
{ {
m_is_vertex_fixed_map[idx] = willbefixed; m_is_vertex_fixed_map[idx] = willbefixed;
@ -1329,7 +1329,7 @@ private:
std::size_t detect_degeneracies_heuristic() std::size_t detect_degeneracies_heuristic()
{ {
std::size_t num_fixed = 0; std::size_t num_fixed = 0;
double elength_fixed = m_min_edge_length; double elength_fixed = m_max_edge_length;
BOOST_FOREACH(vertex_descriptor v, vertices(m_tmesh)) BOOST_FOREACH(vertex_descriptor v, vertices(m_tmesh))
{ {

View File

@ -46,13 +46,13 @@ namespace internal {
* @param hg the mesh containing the given vertex * @param hg the mesh containing the given vertex
* @param root the given vertex * @param root the given vertex
* @param min_edge_length the diameter of the geodesic disk * @param max_edge_length the diameter of the geodesic disk
*/ */
template<class TriangleMesh, class TriangleMeshPointPMap> template<class TriangleMesh, class TriangleMeshPointPMap>
bool is_vertex_degenerate(TriangleMesh& hg, bool is_vertex_degenerate(TriangleMesh& hg,
TriangleMeshPointPMap& hg_point_pmap, TriangleMeshPointPMap& hg_point_pmap,
typename boost::graph_traits<TriangleMesh>::vertex_descriptor root, typename boost::graph_traits<TriangleMesh>::vertex_descriptor root,
double min_edge_length) double max_edge_length)
{ {
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor;
@ -64,7 +64,7 @@ bool is_vertex_degenerate(TriangleMesh& hg,
std::set<face_descriptor> faces_in_disk; std::set<face_descriptor> faces_in_disk;
vertices_in_disk.clear(); vertices_in_disk.clear();
search_vertices_in_disk(hg, hg_point_pmap, root, vertices_in_disk, min_edge_length); search_vertices_in_disk(hg, hg_point_pmap, root, vertices_in_disk, max_edge_length);
BOOST_FOREACH(vertex_descriptor vd, vertices_in_disk) BOOST_FOREACH(vertex_descriptor vd, vertices_in_disk)
{ {
@ -114,14 +114,14 @@ bool is_vertex_degenerate(TriangleMesh& hg,
* @param hg the mesh containing the vertices * @param hg the mesh containing the vertices
* @param root the center of the geodesic disk * @param root the center of the geodesic disk
* @param vertices_in_disk containing the found vertices within the disk * @param vertices_in_disk containing the found vertices within the disk
* @param min_edge_length the diameter of the geodesic disk * @param max_edge_length the diameter of the geodesic disk
*/ */
template<class TriangleMesh, class TriangleMeshPointPMap> template<class TriangleMesh, class TriangleMeshPointPMap>
void search_vertices_in_disk(TriangleMesh& hg, void search_vertices_in_disk(TriangleMesh& hg,
TriangleMeshPointPMap& hg_point_pmap, TriangleMeshPointPMap& hg_point_pmap,
typename boost::graph_traits<TriangleMesh>::vertex_descriptor root, typename boost::graph_traits<TriangleMesh>::vertex_descriptor root,
std::set<typename boost::graph_traits<TriangleMesh>::vertex_descriptor>& vertices_in_disk, std::set<typename boost::graph_traits<TriangleMesh>::vertex_descriptor>& vertices_in_disk,
double min_edge_length) double max_edge_length)
{ {
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor;
@ -134,7 +134,7 @@ void search_vertices_in_disk(TriangleMesh& hg,
vertices_in_disk.insert(root); vertices_in_disk.insert(root);
vertex_visited[root] = true; vertex_visited[root] = true;
double dist_TH = min_edge_length; double dist_TH = max_edge_length;
while (!Q.empty()) while (!Q.empty())
{ {
vertex_descriptor v = Q.front(); vertex_descriptor v = Q.front();

View File

@ -100,10 +100,10 @@ int main()
return EXIT_FAILURE; return EXIT_FAILURE;
} }
double min_edge_length = 0.002; double max_edge_length = 0.002;
mcs->set_min_edge_length(min_edge_length); mcs->set_max_edge_length(max_edge_length);
value = mcs->min_edge_length(); value = mcs->max_edge_length();
if (!check_value_equal(min_edge_length, value)) if (!check_value_equal(max_edge_length, value))
{ {
return EXIT_FAILURE; return EXIT_FAILURE;
} }

View File

@ -66,14 +66,14 @@
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_4"> <layout class="QHBoxLayout" name="horizontalLayout_4">
<item> <item>
<widget class="QLabel" name="label_min_edge_length"> <widget class="QLabel" name="label_max_edge_length">
<property name="text"> <property name="text">
<string>min_edge_length</string> <string>max_edge_length</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QDoubleSpinBox" name="min_edge_length"/> <widget class="QDoubleSpinBox" name="max_edge_length"/>
</item> </item>
</layout> </layout>
</item> </item>
@ -162,9 +162,9 @@
</layout> </layout>
</widget> </widget>
<zorder>omega_H</zorder> <zorder>omega_H</zorder>
<zorder>min_edge_length</zorder> <zorder>max_edge_length</zorder>
<zorder>label_omega_H</zorder> <zorder>label_omega_H</zorder>
<zorder>label_min_edge_length</zorder> <zorder>label_max_edge_length</zorder>
<zorder>pushButton_contract</zorder> <zorder>pushButton_contract</zorder>
<zorder>pushButton_collapse</zorder> <zorder>pushButton_collapse</zorder>
<zorder>pushButton_split</zorder> <zorder>pushButton_split</zorder>

View File

@ -139,9 +139,9 @@ public:
ui->omega_P->setValue(0.2); ui->omega_P->setValue(0.2);
ui->omega_P->setSingleStep(0.1); ui->omega_P->setSingleStep(0.1);
ui->omega_P->setDecimals(3); ui->omega_P->setDecimals(3);
ui->min_edge_length->setDecimals(7); ui->max_edge_length->setDecimals(7);
ui->min_edge_length->setValue(0.002 * diag); ui->max_edge_length->setValue(0.002 * diag);
ui->min_edge_length->setSingleStep(0.0000001); ui->max_edge_length->setSingleStep(0.0000001);
ui->delta_area->setDecimals(7); ui->delta_area->setDecimals(7);
ui->delta_area->setValue(1e-4); ui->delta_area->setValue(1e-4);
ui->delta_area->setSingleStep(1e-5); ui->delta_area->setSingleStep(1e-5);
@ -210,7 +210,7 @@ public:
bool check_mesh(Scene_polyhedron_item* item) { bool check_mesh(Scene_polyhedron_item* item) {
double omega_H = ui->omega_H->value(); double omega_H = ui->omega_H->value();
double omega_P = ui->omega_P->value(); double omega_P = ui->omega_P->value();
double min_edge_length = ui->min_edge_length->value(); double max_edge_length = ui->max_edge_length->value();
double delta_area = ui->delta_area->value(); double delta_area = ui->delta_area->value();
bool is_medially_centered = ui->is_medially_centered->isChecked(); bool is_medially_centered = ui->is_medially_centered->isChecked();
@ -229,7 +229,7 @@ public:
//set algorithm parameters //set algorithm parameters
mcs->set_quality_speed_tradeoff(omega_H); mcs->set_quality_speed_tradeoff(omega_H);
mcs->set_medially_centered_speed_tradeoff(omega_P); mcs->set_medially_centered_speed_tradeoff(omega_P);
mcs->set_min_edge_length(min_edge_length); mcs->set_max_edge_length(max_edge_length);
mcs->set_is_medially_centered(is_medially_centered); mcs->set_is_medially_centered(is_medially_centered);
mcs->set_area_variation_factor(delta_area); mcs->set_area_variation_factor(delta_area);
@ -263,7 +263,7 @@ public:
//set algorithm parameters //set algorithm parameters
mcs->set_quality_speed_tradeoff(omega_H); mcs->set_quality_speed_tradeoff(omega_H);
mcs->set_medially_centered_speed_tradeoff(omega_P); mcs->set_medially_centered_speed_tradeoff(omega_P);
mcs->set_min_edge_length(min_edge_length); mcs->set_max_edge_length(max_edge_length);
mcs->set_is_medially_centered(is_medially_centered); mcs->set_is_medially_centered(is_medially_centered);
mcs->set_area_variation_factor(delta_area); mcs->set_area_variation_factor(delta_area);
@ -284,7 +284,7 @@ public:
{ {
mcs->set_quality_speed_tradeoff(omega_H); mcs->set_quality_speed_tradeoff(omega_H);
mcs->set_medially_centered_speed_tradeoff(omega_P); mcs->set_medially_centered_speed_tradeoff(omega_P);
mcs->set_min_edge_length(min_edge_length); mcs->set_max_edge_length(max_edge_length);
mcs->set_area_variation_factor(delta_area); mcs->set_area_variation_factor(delta_area);
mcs->set_is_medially_centered(is_medially_centered); mcs->set_is_medially_centered(is_medially_centered);
} }
@ -303,13 +303,13 @@ public:
{ {
double omega_H = ui->omega_H->value(); double omega_H = ui->omega_H->value();
double omega_P = ui->omega_P->value(); double omega_P = ui->omega_P->value();
double min_edge_length = ui->min_edge_length->value(); double max_edge_length = ui->max_edge_length->value();
double delta_area = ui->delta_area->value(); double delta_area = ui->delta_area->value();
bool is_medially_centered = ui->is_medially_centered->isChecked(); bool is_medially_centered = ui->is_medially_centered->isChecked();
mcs->set_quality_speed_tradeoff(omega_H); mcs->set_quality_speed_tradeoff(omega_H);
mcs->set_medially_centered_speed_tradeoff(omega_P); mcs->set_medially_centered_speed_tradeoff(omega_P);
mcs->set_min_edge_length(min_edge_length); mcs->set_max_edge_length(max_edge_length);
mcs->set_area_variation_factor(delta_area); mcs->set_area_variation_factor(delta_area);
mcs->set_is_medially_centered(is_medially_centered); mcs->set_is_medially_centered(is_medially_centered);
} }
@ -402,7 +402,7 @@ void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionMCFSkeleton_t
void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionUpdateBBox() void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionUpdateBBox()
{ {
double diag = scene->len_diagonal(); double diag = scene->len_diagonal();
ui->min_edge_length->setValue(0.002 * diag); ui->max_edge_length->setValue(0.002 * diag);
} }
void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionSegment() void Polyhedron_demo_mean_curvature_flow_skeleton_plugin::on_actionSegment()