2011-11-28 3 views
2

나는 부스트 :: 지오메트리와 몇 개의 직사각형을 교차시키는 작은 테스트 어플리케이션을 가지고 있습니다.Boost :: 지오메트리 교차가 예상대로 작동하지 않습니다.

typedef boost::geometry::model::point 
< 
double, 2, boost::geometry::cs::cartesian 
> point; 

typedef boost::geometry::model::polygon<point > polygon; 

polygon Intersect(polygon p1, polygon p2) { 
    std::vector <polygon> result; 
    boost::geometry::intersection(p1, p2, result); 
    return result.front(); 
} 

polygon IntersectionTest() { 
    polygon one, two, three, four; 

    boost::geometry::read_wkt("POLYGON((35 25, 35 35, 15 35, 15 25, 35 25))", one); 
    boost::geometry::read_wkt("POLYGON((45 30, 45 50, 25 50, 25 30, 45 30))", two); 
    boost::geometry::read_wkt("POLYGON((50 0, 50 40, 10 40, 10 0, 50 0))", three); 
    boost::geometry::read_wkt("POLYGON((40 20, 40 60, 0 60, 0 20, 40 20))", four); 

    return Intersect(Intersect(Intersect(one, two), three), four); 
} 
나는 결과는 아직 내가 할을 (35 30, 35 40, 25 40, 25 30, 35 30) 같은 될 것으로 기대 때문에 내가 뭔가 잘못을 수행해야합니다

병렬 사각형의 교차는 항상 4 + 1 점 50 0으로 사각형을해야합니다 동안 50 0 같은 점을 포함 10 점 긴 다각형 그것은 교차점에 있어서는 안된다. SVG에 넣으면 직사각형이 예상 한 것처럼 보입니다.

무엇이 잘못 될 수 있습니까? boost::geometry의 버그 인 경우 어떻게 확인할 수 있습니까? (현재 1.48을 사용하고 있습니다.) 버그 일 경우 문제를 피할 수있는 방법이 있습니까? true로 두 번째 템플릿 매개 변수의 기본값을 참조로

template 
< 
    typename Point, 
    bool ClockWise = true, 
    bool Closed = true, 
    template<typename, typename> class PointList = std::vector, 
    template<typename, typename> class RingList = std::vector, 
    template<typename> class PointAlloc = std::allocator, 
    template<typename> class RingAlloc = std::allocator 
> 
class polygon {...} 

:

답변

2

다각형 클래스는 다음과 같은 템플릿 매개 변수가 있습니다. 즉, 다각형을 정의하는 점은 시계 방향으로 간주되어야합니다.

이것은 실제로 문제입니다.

지오메트리의 WKT 형식을 보면 시계 반대 방향으로 점을 작성했습니다.

typedef boost::geometry::model::polygon<point,false> polygon;

또는 시계 방향으로 순서대로 WKT 문자열의 포인트를 쓰기 :

그래서 당신도해야한다. 예 :

boost::geometry::read_wkt("POLYGON((35 25, 15 25, 15 35, 35 35, 35 25))", one); 
boost::geometry::read_wkt("POLYGON((45 30, 25 30, 25 50, 45 50, 45 30))", two); 

이렇게하면 결과가 예상대로 유지됩니다. 아마 수 read_wkt 독서의 올바른 방향을 시행한다면 멋진 일이 될 것입니다 개인적인 의견으로

...

2

나는 ds27680의 대답에 동의합니다.

세 번째 옵션은 read_wkt 뒤에 boost :: geometry :: correct (기하학)를 호출하는 것입니다. 방향에 대해 확실하지 않은 경우 사용자는이 작업을 수행하는 것이 좋습니다.

read_wkt 실제로 올바른 방향을 적용하지 않습니다. 그 이유는 정확한 함수는 면적 계산을 필요로하기 때 문에 사용자가 폴리곤이 올바른 순서 (일반적으로 으로 알려져 있음)를 알면 저장 될 수 있기 때문입니다.

+0

우후! 올바른 (기하학) 내 문제를 해결! 고맙습니다! –

관련 문제