2011-10-11 32 views
8

Tôi có một DLL đơn giản thực hiện một số phép tính với đa giác Tăng Hình học. Vì phần lớn DLL sẽ được gọi từ mã C#, và từ Delphi và những người biết từ nơi khác, tôi nên chuyển đổi kết quả thành các mảng mà mọi thứ có thể xử lý.Lấy tọa độ của các điểm từ đa giác Tăng Hình học

CẬP NHẬT: Tôi đã đơn giản hóa và sửa chữa phần nào mã của mình. Mã mới trông hoàn toàn khác, sử dụng một cách tiếp cận hoàn toàn khác (for_each_point), và bằng cách nào đó vẫn không biên dịch.

mã mới của tôi:

#include <vector> 
#include <boost/range.hpp> 
#include <boost/geometry.hpp> 
#include <boost/geometry/geometries/polygon.hpp> 

using namespace boost::geometry; 

typedef boost::geometry::model::point 
    < 
     double, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> 
    > spherical_point; 
class PointAggregator { 
private : 
    double *x, *y; 
    int count; 

public : 
    PointAggregator(int size) { 
     x = (double*) malloc(sizeof(double) * size); 
     y = (double*) malloc(sizeof(double) * size); 
     count = 0; 
    } 

    ~PointAggregator() { 
     free(x); 
     free(y); 
    } 

    inline void operator()(spherical_point& p) { 
     x[count] = get<0>(p); 
     y[count] = get<1>(p); 
     count++; 
    } 

    void GetResult(double *resultX, double *resultY) { 
     resultX = x; 
     resultY = y; 
    } 
}; 

void VectorToArray(std::vector<model::polygon<spherical_point>> resultVector, double x[], double y[], int *count) { 
    int i = 0;  
    for (std::vector<model::polygon<spherical_point>>::iterator it = resultVector.begin(); it != resultVector.end(); ++it) { 
     if (boost::size(*it) >= 2) { 
      *count = boost::size(*it); 
      PointAggregator* pa = new PointAggregator(*count); 
      boost::geometry::for_each_point(*it, *pa); 
      pa->GetResult(x, y); 
      delete(pa); 
      break; 
     }  
    } 
} 

Các lỗi biên dịch hiện tại là:

  1. lỗi C2039: 'loại': không phải là thành viên của 'mpl :: eval_if_c đẩy mạnh ::' iterator. hpp 63
  2. lỗi C3203: 'loại': mẫu lớp không chuyên biệt không thể được sử dụng làm đối số mẫu cho tham số mẫu 'Iterator', dự kiến ​​là một loại thực sự differ_type.hpp 25
  3. lỗi C2955: 'Boost :: gõ': sử dụng các lớp mẫu đòi hỏi mẫu danh sách đối số difference_type.hpp 25
  4. lỗi C2955: 'đẩy mạnh :: iterator_difference': sử dụng các lớp mẫu đòi hỏi mẫu danh sách đối số difference_type.hpp 26

Mà những người không giống như họ có bất cứ điều gì để làm với phần này của mã (tên tập tin của tôi là geometry.cpp), nhưng tất cả mọi thứ khác sử dụng Tăng Geometry là nhận xét ra và tôi vẫn nhận được các lỗi này, vì vậy ...

Here is my bad code that I had previously (edited by sehe)

(Tôi mới dùng C++ và Boost nên có thể tôi đã bỏ lỡ Tôi giả sử rằng tôi không thể lặp lại thông qua một đa giác dễ dàng và tôi đã bỏ lỡ phần không tầm thường, hoặc một đa giác không thể được sử dụng như là một vòng, hoặc lặp đi lặp lại là không phải cách tôi nghĩ, hoặc tôi không biết cái gì khác có thể sai. Tôi đã làm gì sai?

+0

Bạn có gặp phải lỗi biên dịch hoặc bạn đang tìm kiếm lỗi logic không? Chính xác thì điều gì không hiệu quả với bạn? – sbrett

+0

Tôi đã cập nhật mã của mình. Vì tôi không thể biên dịch được, tôi không biết liệu tôi có làm mọi thứ đúng ngữ nghĩa hay không, vì vậy tôi đang tìm kiếm bất kỳ loại lỗi nào mà tôi đã tạo ra. – ytg

+1

Phiên bản tăng cường mà tôi có trên hệ thống của mình là 1,35, vì vậy tôi đã cập nhật bất cứ thứ gì họ có trên SVN (sớm là 1,48). Tôi có thể vượt qua các vấn đề liên quan đến việc không tăng cường :: hình học và xem chính xác loại lỗi bạn đang nhận được, và nó lộn xộn, nhưng không có nhiều. Từ những gì tôi có thể nói chỉ bằng cách nhìn vào nó, phương thức boost :: size được định nghĩa như một phần của cái mà tôi tin là boost_range, dường như không biết cách xử lý mô hình của bạn :: polygon . Sau khi xem xét tham chiếu phạm vi tăng, tôi nhận thấy rằng nó đã đề cập đến các hàm bắt buộc như range_begin. – sbrett

Trả lời

4

Tôi tìm thấy một vài điều mà cần phải được cố định:

  1. Một vấn đề tôi thấy là trong các mẫu của bạn. Hãy chắc chắn để đặt không gian!
  2. phạm vi tăng hoạt động trên các vùng chứa hoặc phạm vi bắt đầu, các cặp kết thúc
  3. Các bộ lặp biểu diễn cái gì đó giống như con trỏ đến một đối tượng. Lấy kích thước của trình lặp sẽ không làm những gì bạn muốn. Bạn cần sử dụng boost :: size của toàn bộ vùng chứa, hoặc std :: distance (begin_iterator, end_iterator).

Dưới đây là một phiên bản biên dịch:

#include <vector> 
#include <boost/range.hpp> 
#include <boost/geometry.hpp> 
#include <boost/geometry/geometries/polygon.hpp> 

using namespace boost::geometry; 

typedef boost::geometry::model::point 
    < 
     double, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> 
    > spherical_point; 
class PointAggregator { 
private : 
    double *x, *y; 
    int count; 

public : 
    PointAggregator(int size) { 
     x = (double*) malloc(sizeof(double) * size); 
     y = (double*) malloc(sizeof(double) * size); 
     count = 0; 
    } 

    ~PointAggregator() { 
     free(x); 
     free(y); 
    } 

    inline void operator()(spherical_point& p) { 
     x[count] = get<0>(p); 
     y[count] = get<1>(p); 
     count++; 
    } 

    void GetResult(double *resultX, double *resultY) { 
     resultX = x; 
     resultY = y; 
    } 
}; 

// added spaces to the close brackets >> becomes > > 
void VectorToArray(std::vector<model::polygon<spherical_point> > resultVector, double x[], double y[], int *count) { 
    for (std::vector<model::polygon<spherical_point> >::iterator it = resultVector.begin(); it != resultVector.end(); ++it) { 
     if (boost::size(resultVector) >= 2) { 
      // getting the size of the whole container 
      *count = boost::size(resultVector); 
      PointAggregator* pa = new PointAggregator(*count); 
      boost::geometry::for_each_point(*it, *pa); 
      pa->GetResult(x, y); 
      delete(pa); 
      break; 
     }  
    } 
} 
+1

Chết tiệt, không nhìn thấy câu trả lời của bạn trước khi tôi đăng bài của tôi. Xin lỗi. – sbrett

4

Ok, tôi nghĩ rằng tôi đã nhận được những gì bạn đang tìm kiếm ở đây. Tôi vẫn không hiểu tại sao bạn đang tìm kiếm phạm vi của những gì tôi cho là lớn hơn hoặc bằng 2, nhưng tôi đã tìm ra cách để biên dịch khi sử dụng boost :: size() ít nhất .

Trước hết, nhận ra rằng các tham số đầu tiên của hàm

void VectorToArray(std::vector<model::polygon<spherical_point> > resultVector, double x[], double y[], int *count) 
{ 
... 
} 

là một std :: vector bao gồm các trường hợp của loại mô hình :: đa giác.

Điều này có nghĩa rằng khi bạn dereference iterator của bạn ... định nghĩa là

std::vector<model::polygon<spherical_point> >::iterator it 

các rvalue là một mô hình :: đa giác.

boost :: model :: polygon KHÔNG ở trong và của chính nó Boost.Range tương thích. boost :: mô hình :: đa giác là một loại có chứa chức năng 5 thành viên ....

inline ring_type const& outer() const { return m_outer; } 
inline inner_container_type const& inners() const { return m_inners; } 
inline ring_type& outer() { return m_outer; } 
inline inner_container_type & inners() { return m_inners; } 
inline void clear() 
{ 
    m_outer.clear(); 
    m_inners.clear(); 
} 

Điều này có nghĩa rằng bạn * nó (ví dụ, một mô hình :: đa giác) được giới hạn chỉ gọi những chức năng.

Những gì bạn muốn làm là lấy vòng ngoài hoặc một trong các vòng trong của mỗi đa giác trong vectơ (không chắc chắn, bên trong hoặc bên ngoài) và xem phạm vi của bất kỳ thứ gì trong vòng đó lớn hơn hoặc bằng 2.

Để làm điều này, chúng ta phải thực hiện thêm một số mpl và typedef.

typedef boost::geometry::model::point<double, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > spherical_point; // your definition of a spherical_point 
typedef boost::geometry::model::polygon<spherical_point> polygon; //consolidation of template args for a polygon 
typedef boost::geometry::ring_type<polygon>::type ring_type; // define a ring_type that can handle your spherical_point by way of the polygon typedef. 
typedef boost::geometry::interior_type<polygon>::type int_type; //define a interior_type that can handle your spherical_point 

Để hoàn thành này và chỉ lên và làm cho nó "làm việc" Tôi đã quyết định rằng bạn muốn "bên ngoài" chiếc nhẫn cho giới hạn phạm vi của bạn có điều kiện.

Đây là, đối với tôi, biên dịch mã, trên gcc 4.1.1 với tăng 1.48. Tôi để lại liệu logic có đúng với người khác không.

using namespace boost::geometry; 
typedef boost::geometry::model::point<double, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > spherical_point; 
typedef boost::geometry::model::polygon<spherical_point> polygon; 
typedef boost::geometry::ring_type<polygon>::type ring_type; 
typedef boost::geometry::interior_type<polygon>::type int_type; 

class PointAggregator 
{ 
private : 
    double *x, *y; 
    int count; 

public : 
    PointAggregator(int size) 
    { 
     x = (double*) malloc(sizeof(double) * size); 
     y = (double*) malloc(sizeof(double) * size); 
     count = 0; 
    } 

    ~PointAggregator() 
    { 
     free(x); 
     free(y); 
    } 

    inline void operator()(spherical_point& p) 
    { 
     x[count] = get<0>(p); 
     y[count] = get<1>(p); 
     count++; 
    } 

    void GetResult(double *resultX, double *resultY) 
    { 
     resultX = x; 
     resultY = y; 
    } 
}; 

void VectorToArray(std::vector<model::polygon<spherical_point> > resultVector, double x[], double y[], int *count) 
{ 
    for (std::vector<model::polygon<spherical_point> >::iterator it = resultVector.begin(); it != resultVector.end(); ++it) 
    { 
     model::polygon<spherical_point> tmpPoly; 
     tmpPoly = (*it); 

     boost::geometry::ring_type<polygon>::type somering = tmpPoly.outer(); //typed it all out again instead of using ring_type since the complier was complaining and i didn't wanna get into it. 
     int ringsize = boost::size(somering); 
     if(ringsize >= 2) 
     { 

      *count = ringsize; 
      PointAggregator* pa = new PointAggregator(*count); 
      boost::geometry::for_each_point(*it, *pa); 
      pa->GetResult(x, y); 
      delete(pa); 
      break; 
     } 
    } 
} 
+0

Công việc ấn tượng với việc đọc được suy nghĩ của tôi và tìm ra khía cạnh vòng ngoài. – ytg

Các vấn đề liên quan