Хорошо, я думаю, у меня есть то, что вы ищете здесь.Я до сих пор не совсем понимаю, почему вы ищете этот диапазон, который, как я предполагаю, равен точкам, большим или равным 2, но я выяснил, как заставить его скомпилироваться, по крайней мере, используя boost :: size ().
Прежде всего, поймите, что первый параметр функции
void VectorToArray(std::vector<model::polygon<spherical_point> > resultVector, double x[], double y[], int *count)
{
...
}
- это std :: vector, содержащий экземпляры типа model :: polygon.
Это означает, чтокогда вы разыменовываете свой итератор ... определяемый как
std::vector<model::polygon<spherical_point> >::iterator it
, значение является моделью :: многоугольника.
boost :: model :: polygon НЕ является само по себе Boost.Rangeсовместимы.boost :: model :: polygon - это тип, содержащий 5 функций-членов ....
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();
}
Это означает, что ваш * it (то есть, модель :: polygon) ограничен вызовом только этих функций.
Похоже, что вы хотите сделать, это захватить либо внешнее кольцо, либо одно из внутренних колец каждого многоугольника в векторе (не знаю, какой, внутренний или внешний), и посмотреть, находится ли диапазон чего-либо вэто кольцо больше или равно 2.
Чтобы сделать это, мы должны сделать еще несколько mpl и 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
Чтобы завершить это, просто включите его и работайтеЯ решил предположить, что вы хотели, чтобы «внешнее» кольцо для вашего ограничения диапазона было условным.
Вот, для меня, компиляция кода на gcc 4.1.1 с boost 1.48.Я оставляю правильной ли логику кому-то другому.
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;
}
}
}