2013-10-21 3 views
0

나는 boost :: geometry 라이브러리를 사용하여 이전에 정의 된 다각형의 지름을 제공하는 함수를 코딩하고 있습니다.부스트 :: 기하학 폴리곤 내부의 점 좌표를 얻는 방법?

이 지름은 두 점 사이의 최대 거리로 정의됩니다. 따라서, 나는 모든 포인트 쌍의 모든 거리를 계산하는 이중 루프를 코딩하고 있지만 폴리곤 내부의 점 좌표, 또는 점 개체에 액세스하는 방법을 알지 못하고 두 점 사이의 거리 함수를 사용합니다. 라이브러리에 의해 (어느 쪽이 더 빨라야 하는가?). 나는 단지의 중복을 억제

for(auto it1 = boost::begin(boost::geometry::exterior_ring(poly)); 
    it1 != boost::end(boost::geometry::exterior_ring(poly)); 
    ++it1) 
{ 
    for(auto it2 = it1+1; 
     it2 != boost::end(boost::geometry::exterior_ring(poly)); 
     ++it2) 
    { 
     double distance = boost::geometry::distance(*it1, *it2); 
     if(my_diameter < distance){my_diameter = distance;} 
    } 
} 

:

Boost docs on polygon보고 후 나는

이 말에 내 솔루션은 Barend의 제안의 수정 된 버전을 사용하는 것이 었습니다 ... 성공하지 my_polygon.PointList 시도 동일한 거리를 두 번 계산;

답변

3

다각형은 링으로 구성됩니다. 외부 링 (외부 링)을 갖고 싶습니다. 그것은 outer_ring (aPolygon)을 사용하여 액세스 가능합니다.

그래서 당신은 (그렇지 않으면 반복자 선언, 나는 자동차를 사용하여 간단하게하기 위해) 다각형의 점을 반복하기 위해이 같은 코드를 사용할 수 있습니다 : 내부 링을 통해 루프가 종종 루프 (

for(auto it1 = boost::begin(boost::geometry::exterior_ring(poly)); 
    it1 != boost::end(boost::geometry::exterior_ring(poly)); 
    ++it1) 
{ 
    for(auto it2 = boost::begin(boost::geometry::exterior_ring(poly)); 
     it2 != boost::end(boost::geometry::exterior_ring(poly)); 
     ++it2) 
    { 
     // You might skip cases where it1==it2, distance is zero anyway 
     double distance = boost::geometry::distance(*it1, *it2); 
     // Compare with a max distance, if larger, assign, etc. 
    } 
} 

을하지만, 다각형이 잘 정의 된 경우 필요하지 않은 지름).

덧붙여 말하자면, PointList는 템플릿 매개 변수의 이름입니다 (doc 참조). 멤버 함수는 외부 링의 경우 outer()입니다. 위의 코드는 자유 함수 "outer_ring"을 사용하여 다각형 개념을 사용합니다.이 개념은 Boost.Geometry 내의 모든 다각형 유형에서 작동합니다.

+0

예를 들어 주셔서 감사합니다. 나는이 개념을 이해하지 못하고 있지만, 아직 좀 더 최적화 된 것을 찾고 있습니다. N 포인트 폴리곤의 경우 루프 거리를 계산하기 위해 N (N-1)/2 만 필요로 할 때 N^2 연산을 제공합니다 (it1 = it2와 관련이없고 두 번 계산합니다.) 포인트에 액세스하기 위해 outer() 함수를 사용하여 수행 할 수 있습니까? – Liam

0

최대 거리는 두 개의 "모서리"사이에 있으므로 "모서리"거리 만 서로 확인할 수 있습니다.

한 점 "A"와 하나의 세그먼트만으로 생각해보십시오. 세그먼트를 어떻게 배치했는지에 관계없이 A와의 최대 거리를 가진 세그먼트의 점은 두 끝 중 하나가됩니다.

그런데, 모든 점? 어떤 세분성으로? 거기에는 무한히 많은 것들이 있습니다!

+0

다각형을 구성하는 점들의 한정 집합을보고 있습니다. 그것 안에있는 무한한 양의 점들이 아닙니다. – Liam

+0

모서리 만 확인하고 있다는 뜻입니까? 다른 점을 실제로 확인할 필요가 없기 때문입니다. –

+1

그러면 double 루프는 j (i> j (...)의 경우)와 같습니다. n + 1 모서리의 arround (n^2 + n)/2 거리 계산. –