2017-09-07 1 views
2

저는 토목 공학 박사 과정 학생이며 최근에 C++로 코딩 작업을 시작했습니다. 기본적으로 두 개의 다각형의 중첩 영역 또는 교차 영역을 얻는 데 관심이 있습니다. 두 개의 토양 입자의 투영.Boost :: geometry :: C++과의 교차

나는 많은 검색을했고, 그 부스트 지오메트리가 나를위한 최상의 해결책이라는 것을 알았습니다. 내가 겪고있는 특정 문제에 대한 많은 검색을 수행했지만 문제를 해결할 수 없었습니다.

여기 제가 사용하고있는 소프트웨어는 PFC3D (입자 흐름 코드)라고하는 문제입니다. 이 소프트웨어와 상호 작용하고 DLL 파일을 컴파일하여 PFC에서 실행하려면 Microsoft Visual Studio 2010을 사용해야합니다.

내 코드가 겹치는 부분없이 잘 작동합니다. 다음은 코드입니다.

// Includes for overlapping 
#include <boost/geometry.hpp> 
#include <boost/geometry/core/point_type.hpp> 
#include <boost/geometry/geometries/point.hpp> 
#include <boost/geometry/geometries/register/point.hpp>enter code here 
#include <boost/geometry/geometries/point_xy.hpp> 
#include <boost/geometry/geometries/polygon.hpp> 
typedef boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > polygon; 
polygon poly1, poly2; 
poly1 {{0.0, 0.0}, {0.0, 1.0}, {1.0, 1.0}, {1.0, 0.0}, {0.05, 0.0}}; 
poly2 {{0.5, -0.5}, {0.5, 0.5}, {1.5, 0.5}, {1.5, -0.5}, {0.5, -0.5}}; 
std::deque<polygon> output; 
boost::geometry::intersection(poly1, poly2, output); 
double area = boost::geometry::area(output); 

오류는 poly1 및 poly2 좌표를 지정하는 중입니다. 희망 하시겠습니까? 감사!

+0

사용하는 부스트의 버전은 무엇? – mascoj

+0

답변 해 주셔서 감사합니다. boost_1_65_0을 사용하고 있습니다. –

답변

2

음. identifier { }identifier이 typename 인 경우에만 작동합니다. 당신이 균일 초기화를 원하는 경우

, 당신은 생성자의 매개 변수 목록을 시작하고, { }의 추가 세트에 각 매개 변수 반지를 포장 { }를 사용

polygon poly1 { { { 0.0, 0.0 }, { 0.0, 1.0 }, { 1.0, 1.0 }, { 1.0, 0.0 }, { 0.05, 0.0 } } }; 
polygon poly2 { { { 0.5, -0.5 }, { 0.5, 0.5 }, { 1.5, 0.5 }, { 1.5, -0.5 }, { 0.5, -0.5 } } }; 

다음, area는 다중 다각형을 기대하지 않습니다

:

double area = 0; 
for (auto& p : output) 
    area += boost::geometry::area(p); 

내가 입력 dsv 분석보고 해 주시면 감사 : 그래서 루프를 작성 691,363,210

polygon poly1, poly2; 
bg::read<bg::format_wkt>(poly1, "POLYGON((0 0,0 1,1 1,1 0,0.05 0,0 0))"); 
bg::read<bg::format_wkt>(poly2, "POLYGON((0.5 -0.5,0.5 0.5,1.5 0.5,1.5 -0.5,0.5 -0.5))"); 

라이브 데모 : Live On Coliru

#include <iostream> 
#include <boost/geometry.hpp> 
#include <boost/geometry/io/io.hpp> 
#include <boost/geometry/algorithms/area.hpp> 
#include <boost/geometry/geometries/point.hpp> 
#include <boost/geometry/geometries/point_xy.hpp> 
#include <boost/geometry/geometries/polygon.hpp> 

namespace bg = boost::geometry; 
namespace bgm = bg::model; 
typedef bgm::polygon<bgm::d2::point_xy<double> > polygon; 

int main() { 
    polygon poly1, poly2; 
    bg::read<bg::format_wkt>(poly1, "POLYGON((0 0,0 1,1 1,1 0,0.05 0,0 0))"); 
    bg::read<bg::format_wkt>(poly2, "POLYGON((0.5 -0.5,0.5 0.5,1.5 0.5,1.5 -0.5,0.5 -0.5))"); 

    std::cout << bg::wkt(poly1) << "\n"; 
    std::cout << bg::wkt(poly2) << "\n"; 
    std::deque<polygon> output; 
    bg::intersection(poly1, poly2, output); 


    double area = 0; 
    for (auto& p : output) 
     area += bg::area(p); 
} 
+0

Sehe ...이 멋진 정보를 가져 주셔서 감사합니다. bg :: read (poly1, "POLYGON ((0 0,0 1,1 1,1 0,0.05 0,0 0))")와 같이 다각형의 점을 정의 할 때. .... 다각형 꼭지점의 입력은 우리가 그들을 업데이트 할 수 없다는 것을 의미하는 문자열입니다. 내 코드에서는 매 사이클마다 각 다각형 정점을 업데이트해야합니다. 내가 수정할 수있는 점으로 다각형을 초기화해야한다는 뜻입니다. 첫 번째 방법 인 폴리곤 폴리 1 {{{0.0, 0.0}, {0.0, 1.0}, {1.0, 1.0}, {1.0, 0.0}, {0.05, 0.0}}}을 사용해 보았습니다. 그것은 또한 작동하지 않았다 –

+0

물론 [첫 번째 접근 방식] (https://wandbox.org/permlink/qLHtMwmzN0SaUfwT). C++ 11 컴파일러를 사용하고 있습니까? 그건 그렇고, "포인트 업데이트"에 대한 필요성은 정확히 *** 어딘가에서 그들을 읽는 것이 좋습니다. 내 말은, 코드에서 "포인트 업데이트"를 위해 다시 컴파일해야한다는 것입니다. – sehe

+0

안녕하세요, Coliru가 너무 느려서 컴파일이 중단되었습니다. [동일] (http://coliru.stacked-crooked.com/a/1aec905ca7afef16) – sehe