在我的应用程序中,我想使用派生的增强几何点 键入以携带附加数据但未能这样做:
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
namespace bg = boost::geometry;
using point_t = bg::model::d2::point_xy<double>;
struct taggedPoint_t : point_t
{
taggedPoint_t(void* data) : mData(data) {}
void* mData;
};
int main()
{
point_t p1;
bg::assign_values(p1, 1.0, 2.0); // OK
taggedPoint_t p2(nullptr);
bg::assign_values(p2, 2.0, 3.0); // Fails
}
有人可以阐明如何正确执行此操作吗? 我还尝试注册点类型:
BOOST_GEOMETRY_REGISTER_POINT_2D(taggedPoint_t, double, cs::cartesian, x, y)
但这也失败了。
BOOST_GEOMETRY_REGISTER_POINT_2D
使用专门针对 bg::model::d2::point_xy
的特征。你的班级没有这些。针对您的类型专门化这些特征,您可以在这里找到它们:
https://www.boost.org/doc/libs/1_61_0/boost/geometry/geometries/point_xy.hpp
这不是一个好主意,因为您将在
namespace bg
中编写代码。但会起作用。
使用组合而不是继承来创建tagged_point_xy
。像这样
struct taggedPoint_t
{
bg::point_t point;
void* data;
};
事实上,调整你的观点的正确方法是忽略它从已知几何类型派生的,而只调整公共接口:
#include <boost/geometry/geometries/register/point.hpp>
BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(taggedPoint_t, double, bg::cs::cartesian, x, y, x, y)
这有效:Live On Coliru
当然,您也可以提供所有必需的特征并进行概括:
template <typename Base> struct taggedPoint : Base {
using base_type = Base;
taggedPoint(void* data) : mData(data) {}
void* mData;
};
你可以让他们明确地“继承”所有特征:
namespace boost::geometry::traits {
template <typename B> struct tag<taggedPoint<B>> : tag<B> {};
template <typename B> struct dimension<taggedPoint<B>> : dimension<B> {};
template <typename B> struct coordinate_type<taggedPoint<B>> : coordinate_type<B> {};
template <typename B> struct coordinate_system<taggedPoint<B>> : coordinate_system<B> {};
template <typename B> struct access<taggedPoint<B>, 0> : access<B, 0> {};
template <typename B> struct access<taggedPoint<B>, 1> : access<B, 1> {};
template <typename B> struct access<taggedPoint<B>, 2> : access<B, 2> {};
} // namespace boost::geometry::traits
现在您无需进一步注册即可使用它:Live On Coliru
https://stackoverflow.com/a/29065421/85371 - 当与标准 Boost Geometry 算法一起使用时,您的“丰富点”数据通常会丢失。请参阅Adam 的回答,了解如何使用自定义策略的提示(这对我来说太先进了)