如何正确分配Boost几何派生点类型?

问题描述 投票:0回答:2

在我的应用程序中,我想使用派生的增强几何点 键入以携带附加数据但未能这样做:

#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)

但这也失败了。

Coliru 上的示例代码

c++ boost boost-geometry
2个回答
0
投票

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

0
投票

事实上,调整你的观点的正确方法是忽略它从已知几何类型派生的,而只调整公共接口:

#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 的回答,了解如何使用自定义策略的提示(这对我来说太先进了)

© www.soinside.com 2019 - 2024. All rights reserved.