reproject barycenter to avoid boundary shrinking (#7633)

Fixes #7631
This commit is contained in:
Sebastien Loriot 2023-08-14 10:21:45 +02:00 committed by GitHub
commit c5902cbcd4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 14 additions and 2 deletions

View File

@ -218,6 +218,7 @@ void tangential_relaxation(const VertexRange& vertices,
typedef std::tuple<vertex_descriptor, Vector_3, Point_3> VNP; typedef std::tuple<vertex_descriptor, Vector_3, Point_3> VNP;
std::vector< VNP > barycenters; std::vector< VNP > barycenters;
auto gt_barycenter = gt.construct_barycenter_3_object(); auto gt_barycenter = gt.construct_barycenter_3_object();
auto gt_project = gt.construct_projected_point_3_object();
// at each vertex, compute vertex normal // at each vertex, compute vertex normal
std::unordered_map<vertex_descriptor, Vector_3> vnormals; std::unordered_map<vertex_descriptor, Vector_3> vnormals;
@ -269,8 +270,19 @@ void tangential_relaxation(const VertexRange& vertices,
//check squared cosine is < 0.25 (~120 degrees) //check squared cosine is < 0.25 (~120 degrees)
if (0.25 < dot*dot / ( squared_distance(get(vpm,ph0), get(vpm, v)) * if (0.25 < dot*dot / ( squared_distance(get(vpm,ph0), get(vpm, v)) *
squared_distance(get(vpm,ph1), get(vpm, v))) ) squared_distance(get(vpm,ph1), get(vpm, v))) )
barycenters.emplace_back(v, vn, {
gt_barycenter(get(vpm, ph0), 0.25, get(vpm, ph1), 0.25, get(vpm, v), 0.5)); typename GT::Point_3 bary = gt_barycenter(get(vpm, ph0), 0.25, get(vpm, ph1), 0.25, get(vpm, v), 0.5);
// to avoid shrinking of borders, we project back onto the incident segments
typename GT::Segment_3 s1(get(vpm, ph0), get(vpm,v)),
s2(get(vpm, ph1), get(vpm,v));
typename GT::Point_3 p1 = gt_project(s1, bary), p2 = gt_project(s2, bary);
bary = squared_distance(p1, bary)<squared_distance(p2,bary)? p1:p2;
barycenters.emplace_back(v, vn, bary);
}
} }
} }
} }