2014-04-16 2 views
1

d 차원의 점을 정의하고 채우는 데 어려움을 겪고 있습니다. 정확히 말하자면, Boost.Geometry가 사용자에 의해 임의의 차원을 처리하도록하는 것이 불가능하다는 것 (즉, 문서와 메일 링리스트에서 본 것)입니다. 따라서 100D 또는 10000D 차원 점을 정의하려고합니다.Boost.Geometry에서 치수 점 정의

#include <boost/geometry.hpp> 
#include <boost/geometry/geometries/point.hpp> 
#include <boost/geometry/index/rtree.hpp> 

namespace bg = boost::geometry; 
namespace bgi = boost::geometry::index; 

template <int CompileTimeDimension> 
void do_something() 
{ 
    typedef bg::model::point<float, CompileTimeDimension, bg::cs::cartesian> point; 
    bgi::rtree<point, bgi::linear<8> > rt; 
} 

template <std::size_t D, std::size_t N> 
struct fill 
{ 
    template <typename Point> 
    static void apply(Point& p, typename bg::coordinate_type<Point>::type const& v) 
    { 
     bg::set<D>(p, v); 
     fill<D + 1, N>::apply(p, v); 
    } 
}; 
template <std::size_t N> 
struct fill<N, N> 
{ 
    template <typename Point> 
    static void apply(Point&, typename bg::coordinate_type<Point>::type const&) {} 
}; 


int main() 
{ 
    int M; 
    M = 100; 
    if (M == 100) 
     do_something<100>(); 
     else if (M == 10000) 
     do_something<10000>(); 
     else 
     std::cerr << "invalid dimension!"; 
    point p;  
    if (M == 100) 
     fill<0, 100>::apply(p, 5); 
     else if (M == 10000) 
     fill<0, 10000>::apply(p, 5); 
     else 
     std::cerr << "invalid dimension!"; 
    return 0; 
} 

오류는 컴파일러는 "포인트"의 형식 정의를 볼 수 있다는 것입니다 : 여기

내 시도와 자신의 목록에서 도움이 개발 한 코드이다. 반면에 typedef의 차원을 런타임 변수로 만들 수는 없습니다 (부스트는 나를 허용하지 않습니다 (!)). 내가 무엇을 할 수 있을지? 다른 라이브러리를 사용하는 것을 제외하고는, 이것은 더 높은 차원의 구조에서 본 최악의 인터페이스이기 때문에. 은 ++가 ../는 -std C를 0X가, 부스트 형상 깊이-170001 -ftemplate 내 겸손 opionion에서 -o 즐

답변

1
  • 하지 ++ = bla.cpp -I C :로/

    컴파일 높은 임의의 차원 점 (즉, 차원> 4)에 적합합니다. 그럼에도 불구하고 높은 임의의 차원을 지닌 점은 일반적인 성격 때문에 지원됩니다.

  • 컴파일러는 어디에도 정의하지 않았기 때문에 point을 모르는 것에 대해 불평합니다.

해결 방법 : 사용 template aliases 임의의 차원 부스트 포인트로 point을 정의하기 :

template <std::size_t D = 100> 
using point = bg::model::point<double, D, bg::cs::cartesian>; 

예제 코드 : 그 의견에 동의

#include <iostream> 
#include <boost/geometry.hpp> 

namespace bg = boost::geometry; 

template <std::size_t D = 100> 
using point = bg::model::point<double, D, bg::cs::cartesian>; 

int main() 
{ 
    int const M = 2; 
    point<M> p; 
    p.set<0>(1.0); 
    p.set<1>(2.0); 
    double x = p.get<0>(); 
    double y = p.get<1>(); 
    std::cout << x << ", " << y << std::endl; 
    return 0; 
} 
+0

. 그러나, 나는 그 요점을 채워야 만한다. 나는 10000 차원에서 포인트를 가질 것이다. 이것은 위의 fill() 메서드를 사용해야한다는 것을 의미합니다. 템플릿을 사용할 때 ... .. 점, fill() 및 main을 사용하는 경우이 오류가 발생합니다. '사용'이전에 unqualified-id가 필요합니다. – gsamaras

+0

fill()가 동일한 값으로 채울 것입니다 . Boost를 제 목적으로 사용하기에는 너무 많은 노력을 기울였습니다. 알고리즘이 확장되지 않았다고 생각합니다. 따라서 다른 라이브러리를 사용하게 될 것입니다. – gsamaras