我正在使用boost 1.47中提供的新几何库,并想知道是否可以定义2D极坐标系。 在头文件和文档中,我找到了极性系统的定义,但是当试图将它与下面的示例代码一起使用时,我遇到了编译错误:
using namespace boost;
typedef geometry::cs::polar<geometry::radian> geometry_type;
typedef geometry::model::point<double, 2, geometry_type> point_type;
const double PI = math::constants::pi<double>();
point_type p1(0, 0);
point_type p2(1, PI/2);
double dist = geometry::distance(p1, p2); // COMPILATION FAILS HERE
在VC2010中我得到:“错误C2039:'type':在尝试编译上面的距离函数时不是'boost :: geometry :: traits :: cs_tag'的成员。
这是从boost头文件中提取的极坐标系统的定义(boost / geometry / core / cs.hpp):
/*!
\brief Polar coordinate system
\details Defines the polar coordinate system "in which each point
on a plane is determined by an angle and a distance"
\see http://en.wikipedia.org/wiki/Polar_coordinates
\ingroup cs
*/
template<typename DegreeOrRadian>
struct polar
{
typedef DegreeOrRadian units;
};
但我认为这个定义是不完整的,因为在其他任何地方都没有提到“极地”。我是否应该为一个简单的二极管系统自己定义一个距离策略和其他所需的特征?
答案 0 :(得分:3)
嗯,经过一些研究后回答我自己的问题(希望这没问题):似乎我对几何图书馆中的坐标系有错误的想法。不同的坐标系似乎指定了内部几何体,如球体表面,例如,两个点之间的距离不是以笛卡尔方式计算的。 我想要完成的任务(使用极地系统)可以通过定义一个新的点类来完成,该点类采用极坐标并将它们转换为X和Y坐标。在使用BOOST_GEOMETRY_REGISTER_POINT_2D宏(如增强样本中)注册新的点类并使用普通的笛卡尔系统后,所有几何算法都按预期工作。
答案 1 :(得分:1)
类型特征的问题是您必须为每种客户端类型编写自己的专门化。
(对于C ++ 0x中的标准<traits>
库,情况并非如此。)