【问题标题】:Boost Graph Library astar and navigation meshBoost Graph Library astar 和导航网格
【发布时间】:2013-10-31 22:51:51
【问题描述】:

我正在做一个 SFML/C++ 项目,我需要生成一个图形来连接它们之间的障碍物以方便寻路,所以我对生成一个导航网格很感兴趣,我将应用 boost A* 算法。 有点像这样:

但是我在使用 Boost Graph Library 实现这一点时遇到了很多问题(如果您有一个更合适的库,我感兴趣的话)。首先,我创建一个具有适当结构的 adjacency_list:

struct WayPoint{
    sf::Vector2f pos;
};

struct WayPointConnection{
    float dist;
};

typedef boost::adjacency_list<
    boost::listS,
    boost::vecS,
    boost::undirectedS,
    WayPoint,
    WayPointConnection
    > WayPointGraph;

typedef WayPointGraph::vertex_descriptor WayPointID;
typedef WayPointGraph::edge_descriptor   WayPointConnectionID;

然后我创建我的图表,并在其中添加障碍物的顶点(目前是简单的矩形):

while (i != rectangle.getPointCount()) {
    sf::Vector2f pt1 (sf::Vector2f(rectangle.getPoint(i).x + mouseEvent.x, rectangle.getPoint(i).y + mouseEvent.y));
    WayPointID wpID = boost::add_vertex(graph); 
    graph[wpID].pos = pt1; 
    i++;
}

现在它变得复杂了,我必须浏览所有顶点并创建这些顶点的邻居的弧,知道弧不应该进入障碍物......我不明白我怎么能使用 Boost 进行编码,我开始编码:

boost::graph_traits<WayPointGraph>::vertex_iterator vi, vi_end, next;
boost::tie(vi, vi_end) = vertices(graph);
for (next = vi; vi != vi_end; vi = next) {
    //I need to create the good arcs ...
    ++next;
}

提前谢谢你。

【问题讨论】:

    标签: c++ boost graph sfml a-star


    【解决方案1】:

    我认为使用Constrained Delaunay triangulation 可以解决您的问题。这只不过是一个Delaunay triangulation,条件是其中存在一些预定义的边缘。

    使用边界多边形的边缘和障碍物的多边形作为固定边缘集,可以获得三角剖分,使其具有完全在障碍物内部或外部的三角形。为了使它成为 Boost 的正确输入,只需完全删除障碍物内的边/三角形,这很简单,因为它的 2/3 顶点是障碍物之一的顶点。另一种方法是为这些边缘赋予无限权重,这样就没有最短路径查找算法会选择它。

    我认为 Boost up to 1.54 不包含 Delaunay 三角剖分的实现,但是您可以获得一个作为 Voronoi 图的对偶。这仍然不够,因为没有办法设置固定边缘,但我认为如果你在障碍物的边界上添加额外的点(彼此足够接近),它可能会导致三角测量就足够了。

    还有另一个小而漂亮的库poly2tri 能够准确地解决这个问题:对带孔的多边形进行三角剖分。其输出可用作 Boost A* 算法的输入。但是请注意,它可能不会给出 预期 最短路径,因为它会从一个边界跳到另一个边界,因为输入集中没有其他点。这在视觉上和距离上都很糟糕(考虑到真正的最短路径)。您可以通过迭代地细化太大的三角形来解决这个问题(例如,将它们除以边缘的中点成 4 个三角形,直到达到足够小的尺寸(面积、边缘长度))。

    最终您可以使用功能非常丰富的CGAL 库,可以直接解决您的问题。请参阅this page 了解如何使用它。查看第 29.2.1 节中的数字,看看这是否是您要查找的内容。

    即使我没有亲自使用过 poly2tri,我还是建议将上述方法作为最简单的解决方案。

    【讨论】:

    • 谢谢你的回答,我试试poly2tri解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 2016-03-11
    • 2011-12-08
    相关资源
    最近更新 更多