handling the case where the query point lies on the boundary

This commit is contained in:
Naceur Meskini 2006-09-27 14:08:45 +00:00
parent 63d596bf6a
commit 59be326061
1 changed files with 24 additions and 7 deletions

View File

@ -23,6 +23,7 @@
#include <utility> #include <utility>
#include <CGAL/Iterator_project.h> #include <CGAL/Iterator_project.h>
#include <CGAL/Polygon_2.h> #include <CGAL/Polygon_2.h>
#include <CGAL/number_utils_classes.h>
CGAL_BEGIN_NAMESPACE CGAL_BEGIN_NAMESPACE
@ -106,16 +107,30 @@ natural_neighbor_coordinates_vertex_2(const Dt& dt,
int li; int li;
Face_handle fh = dt.locate(p, lt, li, start); Face_handle fh = dt.locate(p, lt, li, start);
//the point must lie inside the convex hull:
// otherwise return false
if (lt == Dt::OUTSIDE_AFFINE_HULL if (lt == Dt::OUTSIDE_AFFINE_HULL
|| lt == Dt::OUTSIDE_CONVEX_HULL || lt == Dt::OUTSIDE_CONVEX_HULL)
|| (lt == Dt::EDGE && {
(dt.is_infinite(fh) ||
dt.is_infinite(fh->neighbor(li))))){
return make_triple(out, Coord_type(1), false); return make_triple(out, Coord_type(1), false);
} }
if ((lt == Dt::EDGE &&
(dt.is_infinite(fh) ||
dt.is_infinite(fh->neighbor(li)))))
{
Vertex_handle v1 = fh->vertex(dt.cw(li));
Vertex_handle v2 = fh->vertex(dt.ccw(li));
typename Traits::Compute_squared_distance_2 squared_distance;
Point_2 p1(v1->point()),p2(v2->point());
Coord_type coef1 = sqrt(squared_distance(p,p2)); // TODO we can do better if we use the barycentric coordinates.
Coord_type coef2 = sqrt(squared_distance(p,p1));
*out++= std::make_pair(v1,coef1);
*out++= std::make_pair(v2,coef2);
return make_triple(out, coef1+coef2, true);
}
if (lt == Dt::VERTEX) if (lt == Dt::VERTEX)
{ {
@ -190,9 +205,11 @@ natural_neighbor_coordinates_vertex_2(const Dt& dt,
area += polygon_area_2(vor.begin(), vor.end(), dt.geom_traits()); area += polygon_area_2(vor.begin(), vor.end(), dt.geom_traits());
*out++= std::make_pair(current,area); *out++= std::make_pair(current,area);
area_sum += area; area_sum += area;
//update prev and hit: //update prev and hit:
prev= current; prev= current;
++hit; ++hit;