bug-fix to handle some cases where the query point is located on a facet bounding the convex-hull

This commit is contained in:
Raphaëlle Chaine 2006-06-28 16:33:18 +00:00
parent 467e037ae2
commit 081cf4285d
1 changed files with 8 additions and 4 deletions

View File

@ -219,7 +219,7 @@ sibson_natural_neighbor_coordinates_3(const Dt& dt,
{//for each neighboring cell cc2 of cc1
Cell_handle cc2=cc1->neighbor(i);
if(std::find(cells.begin(),cells.end(),cc2)==cells.end())
{// cc2 outside the (convex) conflict cavity
{// cc2 outside the conflict cavity
Point C_1 = construct_circumcenter<Dt>(Facet(cc1,i),Q);
for(int j=1;j<4;j++)
{//for each vertex P of the boundary facet
@ -236,6 +236,8 @@ sibson_natural_neighbor_coordinates_3(const Dt& dt,
num_next=dt.next_around_edge(cc3->index(vR),cc3->index(vP));
next=cc3->neighbor(num_next);
}
if (dt.is_infinite(cc3))
return make_triple(nn_out,norm_coeff=Coord_type(1), false);//point outside the convex-hull
Point C3=dt.dual(cc3);
Point C_3=construct_circumcenter<Dt>(Facet(cc3,num_next),Q);
Point midPQ = midpoint(vP->point(),Q);
@ -247,10 +249,12 @@ sibson_natural_neighbor_coordinates_3(const Dt& dt,
coordinate[vP]=coor_add : coor_it->second+=coor_add;// Replace by a function call
}
}
else // cc2 in the (convex) cavity
else // cc2 in the conflict cavity
{
CGAL_triangulation_assertion(std::find(cells.begin(),cells.end(),cc2)!=cells.end());//TODO : Delete
Point C2=dt.dual(cc2);
if (dt.is_infinite(cc2))
return make_triple(nn_out,norm_coeff=Coord_type(1), false);//point outside the convex-hull
Point C2=dt.dual(cc2);
for(int j=1;j<4;j++)
{//for each vertex P of the internal facet
Vertex_handle vP=cc1->vertex((i+j)&3);
@ -355,7 +359,7 @@ construct_circumcenter(const typename DT::Facet &f,const typename DT::Geom_trait
f.first->vertex((f.second+2)&3)->point(),
f.first->vertex((f.second+3)&3)->point(),
Q));
// else the facet is not on the cavity associated to P
// else the facet is not on the enveloppe of the conflict cavity associated to P
return typename DT::Geom_traits().construct_circumcenter_3_object()
(f.first->vertex((f.second+1)&3)->point(),
f.first->vertex((f.second+2)&3)->point(),