2013-10-22 1 views
1

저는 CGAL에서 최신 버전이고, .locate() 함수를 사용하여 삼각형 모양의 점을 찾으려면 몇 가지 문제가 있습니다.locate 기능의 버그?

p0(0.8, 0.1) ---- locate in the triangle; 
p1(0.95, 0) ---- locate on the edge (-1,0) ---- (1,0); 
p2(0.8, 0.2) ---- locate on the edge (1,0) ---- (0,1); 
p3(0.6, 0.4) ---- locate on the edge (1,0) ---- (0,1); 
p4(0.7,0.3) ---- locate on the edge (1,0) ---- (0,1); 
: 먼저 나는 3 점 (-1,0) (1,0) (0,1), 가 그럼 난 점은, 삼각형과 몇 가지 포인트 '상대 위치를 확인하여 삼각형을 구축

하지만 케이트 결과는 :

p0 ---- FACE, right! 
p1 ---- EDGE, right! 
p2 ---- OUTSIDE_CONVEX_HULL, wrong! 
p3 ---- EDGE, right! 
p4 ---- FACE, wrong! 

, 점 P2는 P3가 P4가 같은 에지 (1,0) 위치에있는 동안 ---- (0,1)

문제의 원인은 무엇입니까?

코드 : 부동 소수점 숫자가 하나가 쓸 수있는 모든 진수를 나타낼 수 없습니다

typedef CGAL::Exact_predicates_inexact_constructions_kernel K; 
typedef CGAL::Delaunay_triangulation_2<K> Delaunay_triangulation; 

void main() 
{ 
    //generate the triangles 
    std::vector<Point2> pts; 
    pts.push_back(Point2(1,0)); 
    pts.push_back(Point2(-1,0)); 
    pts.push_back(Point2(0,1)); 
    Delaunay_triangulation dt; 
    dt.insert(pts.begin(), pts.end()); 

    //locate point in the triangle 
    Point2 pt0 = Point2(0.8, 0.1);//the point located in the triangle.(on the FACE ?) 
    Point2 pt1 = Point2(0.95, 0);//the point located on the segment ((1,0) ---- (-1,0)) (on the EDGE ?) 
    Point2 pt2 = Point2(0.8, 0.2);//the point locate on the segment ((1,0) ---- (0,1)) (on the EDGE ?) 
    Point2 pt3 = Point2(0.6, 0.4);//the point locate on the segment ((1,0) ---- (0,1)) (on the EDGE ?) 
    Point2 pt4 = Point2(0.7,0.3);//the point locate on the segment ((1,0) --- (0,1)) (on the EDGE ?) 
    Face_handle fh0, fh1, fh2, fh3, fh4; 
    Delaunay_triangulation::Locate_type lt0, lt1, lt2, lt3, lt4; 
    int li; 
    fh0 = dt.locate(pt0, lt0, li);//for pt0, lt0 is equal to FACE, right! 
    fh1 = dt.locate(pt1, lt1, li);//for pt1, lt1 is equal to EDGE, right! 
    fh2 = dt.locate(pt2, lt2, li);//for pt2, lt2 is equal to OUTSIDE_CONVEX_HULL, I think it's wrong! 
    fh3 = dt.locate(pt3, lt3, li);//for pt3, lt3 is equal to EDGE, right! 
    fh4 = dt.locate(pt4, lt4, li);//for pt4, lt3 is equal to FACE, I thing it's wrong! 
} 

답변

2

. 반올림 오류가 있습니다. 그 이유 때문에, 포인트의 좌표는 당신이 생각하는 것이 아닙니다. 다음 프로그램을 실행하십시오 :

#include <iostream> 
#include <CGAL/Point_2.h> 
#include <CGAL/Simple_cartesian.h> 

typedef CGAL::Simple_cartesian<double> Kernel; 
typedef Kernel::Point_2 Point; 

int main() 
{ 
    std::cout.precision(17); 
    Point p0(0.8, 0.1); 
    Point p1(0.95, 0); 
    Point p2(0.8, 0.2); 
    Point p3(0.6, 0.4); 
    Point p4(0.7,0.3); 
    std::cout << p0 << std::endl; 
    std::cout << p1 << std::endl; 
    std::cout << p2 << std::endl; 
    std::cout << p3 << std::endl; 
    std::cout << p4 << std::endl; 
    return 0; 
} 

높은 정밀도로 점의 좌표를 표시합니다.

0.80000000000000004 0.10000000000000001 
0.94999999999999996 0 
0.80000000000000004 0.20000000000000001 
0.59999999999999998 0.40000000000000002 
0.69999999999999996 0.29999999999999999 

그 좌표가 locate()에 의해 반환되는 모든 위치를 설명 : 출력은 다음과 같다.

+0

도움 주셔서 감사합니다. – ffmm3