mirror of https://github.com/CGAL/cgal
clean up
This commit is contained in:
parent
afbfa1e3d7
commit
9baff6f6d2
|
|
@ -725,7 +725,7 @@ std::size_t split_edges(EdgesToSplitContainer& edges_to_split,
|
||||||
std::cout << "Actually split? " << do_split << std::endl;
|
std::cout << "Actually split? " << do_split << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// check the new faces after split are not degenerated
|
// check the new faces after split will not be degenerated
|
||||||
Point p0 = new_position;
|
Point p0 = new_position;
|
||||||
Point_ref p1 = get(vpm_T, source(h_to_split, tm_T));
|
Point_ref p1 = get(vpm_T, source(h_to_split, tm_T));
|
||||||
Point_ref p2 = get(vpm_T, target(next(opposite(h_to_split, tm_T), tm_T), tm_T));
|
Point_ref p2 = get(vpm_T, target(next(opposite(h_to_split, tm_T), tm_T), tm_T));
|
||||||
|
|
@ -742,8 +742,9 @@ std::size_t split_edges(EdgesToSplitContainer& edges_to_split,
|
||||||
*/
|
*/
|
||||||
auto p1p3 = CGAL::cross_product(p2-p1,p3-p2) * CGAL::cross_product(p0-p3,p1-p0);
|
auto p1p3 = CGAL::cross_product(p2-p1,p3-p2) * CGAL::cross_product(p0-p3,p1-p0);
|
||||||
auto p0p2 = CGAL::cross_product(p1-p0,p1-p2) * CGAL::cross_product(p3-p2,p3-p0);
|
auto p0p2 = CGAL::cross_product(p1-p0,p1-p2) * CGAL::cross_product(p3-p2,p3-p0);
|
||||||
|
bool first_split_face = (p0p2>p1p3);
|
||||||
|
|
||||||
bool is_deg = (p0p2>p1p3)
|
bool is_deg = first_split_face
|
||||||
? collinear(p0,p1,p2) && collinear(p0,p3,p2)
|
? collinear(p0,p1,p2) && collinear(p0,p3,p2)
|
||||||
: collinear(p0,p1,p3) && collinear(p1,p2,p3);
|
: collinear(p0,p1,p3) && collinear(p1,p2,p3);
|
||||||
|
|
||||||
|
|
@ -787,90 +788,27 @@ std::size_t split_edges(EdgesToSplitContainer& edges_to_split,
|
||||||
if(!do_split)
|
if(!do_split)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
#if 1
|
|
||||||
halfedge_descriptor v0, v1, v2, v3;
|
halfedge_descriptor v0, v1, v2, v3;
|
||||||
v0 = opposite(h_to_split, tm_T);
|
v0 = opposite(h_to_split, tm_T);
|
||||||
Point_ref p0 = get(vpm_T, target(v0, tm_T));
|
|
||||||
v1 = next(v0, tm_T);
|
v1 = next(v0, tm_T);
|
||||||
Point_ref p1 = get(vpm_T, target(v1, tm_T));
|
|
||||||
v2 = next(v1, tm_T);
|
v2 = next(v1, tm_T);
|
||||||
Point_ref p2 = get(vpm_T, target(v2, tm_T));
|
|
||||||
v3 = next(v2, tm_T);
|
v3 = next(v2, tm_T);
|
||||||
Point_ref p3 = get(vpm_T, target(v3, tm_T));
|
|
||||||
|
|
||||||
/* Chooses the diagonal that will split the quad in two triangles that maximize
|
|
||||||
* the scalar product of of the un-normalized normals of the two triangles.
|
|
||||||
* The lengths of the un-normalized normals (computed using cross-products of two vectors)
|
|
||||||
* are proportional to the area of the triangles.
|
|
||||||
* Maximize the scalar product of the two normals will avoid skinny triangles,
|
|
||||||
* and will also taken into account the cosine of the angle between the two normals.
|
|
||||||
* In particular, if the two triangles are oriented in different directions,
|
|
||||||
* the scalar product will be negative.
|
|
||||||
*/
|
|
||||||
auto p1p3 = CGAL::cross_product(p2-p1,p3-p2) * CGAL::cross_product(p0-p3,p1-p0);
|
|
||||||
auto p0p2 = CGAL::cross_product(p1-p0,p1-p2) * CGAL::cross_product(p3-p2,p3-p0);
|
|
||||||
|
|
||||||
halfedge_descriptor res = (p0p2>p1p3)
|
|
||||||
? CGAL::Euler::split_face(v0, v2, tm_T)
|
|
||||||
: CGAL::Euler::split_face(v1, v3, tm_T);
|
|
||||||
#else
|
|
||||||
/* new_p
|
|
||||||
* / \
|
|
||||||
* res / \ h_to_split
|
|
||||||
* / \
|
|
||||||
* / \
|
|
||||||
* left right
|
|
||||||
* | /
|
|
||||||
* | /
|
|
||||||
* | /
|
|
||||||
* | /
|
|
||||||
* | /
|
|
||||||
* | /
|
|
||||||
* opp
|
|
||||||
*/
|
|
||||||
|
|
||||||
const halfedge_descriptor res = prev(h_to_split, tm_T);
|
|
||||||
const Point_ref left_pt = get(vpm_T, source(res, tm_T));
|
|
||||||
const Point_ref right_pt = get(vpm_T, target(h_to_split, tm_T));
|
|
||||||
const Point_ref opp = get(vpm_T, target(next(opposite(res, tm_T), tm_T), tm_T));
|
|
||||||
|
|
||||||
// Check if 'p' is "visible" from 'opp' (i.e. its projection on the plane 'Pl(left, opp, right)'
|
|
||||||
// falls in the cone with apex 'opp' and sides given by 'left' and 'right')
|
|
||||||
const Vector n = gt.construct_orthogonal_vector_3_object()(right_pt, left_pt, opp);
|
|
||||||
const Point trans_left_pt = gt.construct_translated_point_3_object()(left_pt, n);
|
|
||||||
const Point trans_right_pt = gt.construct_translated_point_3_object()(right_pt, n);
|
|
||||||
|
|
||||||
const Point_ref new_p = get(vpm_T, new_v);
|
|
||||||
const bool left_of_left = (gt.orientation_3_object()(trans_left_pt, left_pt, opp, new_p) == CGAL::POSITIVE);
|
|
||||||
const bool right_of_right = (gt.orientation_3_object()(right_pt, trans_right_pt, opp, new_p) == CGAL::POSITIVE);
|
|
||||||
|
|
||||||
const bool is_visible = (!left_of_left && !right_of_right);
|
|
||||||
|
|
||||||
#ifdef CGAL_PMP_SNAP_DEBUG_PP
|
|
||||||
std::cout << "Left/Right: " << left_of_left << " " << right_of_right << std::endl;
|
|
||||||
std::cout << "visible from " << opp << " ? " << is_visible << std::endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// h_to_split is equal to 'next(res)' after splitting
|
|
||||||
const halfedge_descriptor h_to_split_opp = opposite(h_to_split, tm_T);
|
const halfedge_descriptor h_to_split_opp = opposite(h_to_split, tm_T);
|
||||||
|
halfedge_descriptor h2 = prev(prev(h_to_split_opp, tm_T), tm_T);
|
||||||
if(is_visible)
|
const halfedge_descriptor res = prev(h_to_split, tm_T);
|
||||||
|
halfedge_descriptor new_hd = first_split_face
|
||||||
|
? CGAL::Euler::split_face(v0, v2, tm_T)
|
||||||
|
: CGAL::Euler::split_face(v1, v3, tm_T);
|
||||||
|
if (first_split_face)
|
||||||
{
|
{
|
||||||
halfedge_descriptor h2 = prev(prev(h_to_split_opp, tm_T), tm_T);
|
|
||||||
halfedge_descriptor new_hd = CGAL::Euler::split_face(h_to_split_opp,
|
|
||||||
h2, tm_T);
|
|
||||||
h_to_split = opposite(prev(new_hd, tm_T), tm_T);
|
h_to_split = opposite(prev(new_hd, tm_T), tm_T);
|
||||||
visitor.after_split_face(h_to_split_opp, h2, tm_T);
|
visitor.after_split_face(h_to_split_opp, h2, tm_T);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
halfedge_descriptor h2 = prev(h_to_split_opp, tm_T);
|
|
||||||
halfedge_descriptor new_hd = CGAL::Euler::split_face(opposite(res, tm_T),
|
|
||||||
h2, tm_T);
|
|
||||||
h_to_split = opposite(next(new_hd, tm_T), tm_T);
|
h_to_split = opposite(next(new_hd, tm_T), tm_T);
|
||||||
visitor.after_split_face(opposite(res, tm_T), h2, tm_T);
|
visitor.after_split_face(opposite(res, tm_T), h2, tm_T);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue