Boost Geometry: использование 2D полярной системы координат - PullRequest
2 голосов
/ 22 июля 2011

Я играю с новой библиотекой геометрии, доступной в бусте 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:« тип »: не является членом« boost :: geometry :: traits :: cs_tag »» при попытке скомпилировать функцию расстояния выше.

Это определение полярной системы, извлеченное из файлов заголовков надстройки (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;
};

Но я думаю, что это определение неполное, поскольку «полярный» нигде больше не упоминается. Должен ли я сам определять стратегию расстояния и другие необходимые черты для простой 2D-полярной системы?

Ответы [ 2 ]

3 голосов
/ 25 июля 2011

Что ж, отвечая на мой собственный вопрос (надеюсь, что это нормально) после нескольких дополнительных исследований: кажется, что я неправильно понял системы координат в смысле геометрической библиотеки.Кажется, что разные системы координат задают внутреннюю геометрию, такую ​​как поверхность сферы, где, например, расстояние между двумя точками не вычисляется декартовым способом.То, чего я хотел достичь (использовать полярную систему), можно сделать, определив новый класс точек, который берет полярные координаты и преобразует их в координаты X и Y.После регистрации нового класса точек с помощью макроса BOOST_GEOMETRY_REGISTER_POINT_2D (как в увеличенных выборках) и использования нормальной декартовой системы все геометрические алгоритмы работают должным образом.

1 голос
/ 22 июля 2011

Проблема с характеристиками типов заключается в том, что вы должны написать собственную специализацию для каждого типа клиента.

(Это не относится к стандартной библиотеке <traits> в C ++ 0x.)

...