gpt4 book ai didi

c++ - 从 Boost Geometry 多边形获取点的坐标

转载 作者:可可西里 更新时间:2023-11-01 16:37:50 31 4
gpt4 key购买 nike

我有一个简单的 DLL,使用 Boost Geometry 多边形进行一些计算。 (主要是交叉点和差异点。)由于 DLL 最有可能从 C# 代码和 Delphi 以及谁知道从其他地方调用,我应该将结果转换为任何东西都可以处理的数组。

更新:我已经简化并稍微纠正了我的代码。新代码看起来完全不同,使用了完全不同的方法 (for_each_point),并且不知何故仍然无法编译。

我的新代码:

#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;
}
}
}

目前的编译错误是:

  1. 错误 C2039:“type”:不是“boost::mpl::eval_if_c”iterator.hpp 63 的成员
  2. 错误 C3203:“类型”:非专用类模板不能用作模板参数“迭代器”的模板参数,需要一个真实类型 difference_type.hpp 25
  3. 错误 C2955:“boost::type”:类模板的使用需要模板参数列表 difference_type.hpp 25
  4. 错误 C2955:“boost::iterator_difference”:类模板的使用需要模板参数列表 difference_type.hpp 26

哪些看起来与这部分代码没有任何关系(我的文件名是 geometry.cpp),但是使用 Boost Geometry 的其他所有内容都被注释掉了,我仍然会遇到这些错误,所以......

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

(我是 C++ 和 Boost 的新手,所以在将来自 Internet 的代码放在一起时我可能错过了一些基本概念。)我假设我不能轻易地遍历多边形并且我错过了重要的部分,或者多边形不能用作环,或者迭代不是我想的那样,或者我没有知道还有什么问题。我做错了什么?

最佳答案

好的,我想我已经找到您要找的东西了。我仍然不太明白为什么你要寻找我假设大于或等于 2 的点的这个范围,但我想出了至少在使用 boost::size() 时如何让它编译。

首先,实现函数的第一个参数

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

是一个包含 model::polygon 类型实例的 std::vector。

这意味着当你取消引用你的迭代器时......定义为

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(即 model::polygon)仅限于调用那些函数。

看起来你想要做的是捕获 vector 中每个多边形的外环或内环之一(不确定是哪个,内部还是外部),然后查看该环中任何内容的范围是大于或等于 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

为了完成这个并让它“工作”,我决定假设您想要范围限制条件的“外”环。

对我来说,这是在带有 boost 1.48 的 gcc 4.1.1 上编译代码。我把逻辑是否正确留给其他人。

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;
}
}
}

关于c++ - 从 Boost Geometry 多边形获取点的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7722087/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com