关于加快边缘选择的建议

时间:2011-05-18 09:46:15

标签: algorithm graph computational-geometry

我正在C#中构建一个图形编辑器,用户可以在其中放置节点,然后将它们与定向或无向边连接。完成后,A *寻路算法确定两个节点之间的最佳路径。

我所拥有的:具有x,y,已连接节点列表以及F,G和H分数的Node类。 具有“开始”,“完成”以及是否指向的Edge类。 Graph类,包含节点和边的列表以及A *算法

现在,当用户想要选择节点或边缘时,会记录鼠标位置,并迭代每个节点和边缘以确定是否应该选择它。这显然很慢。我想我可以为我的节点实现QuadTree来加速它,但是我该怎样做才能加快边缘选择?

3 个答案:

答案 0 :(得分:3)

由于用户正在“绘制”这些图形,我认为它们包含了人类可能生成的许多节点和边缘(比如1-5k max?)。只需将它们存储在同一个QuadTree中(假设您已经写了一个)。

您可以轻松地将经典QuadTree扩展为a PMR QuadTree,这会根据穿过它们的线段数添加拆分条件。我写了一个hybrid PR/PMR QuadTree,它支持对点和线进行分段,实际上它可以为10-50k的移动物体(重新平衡桶!)提供足够高的性能。

答案 1 :(得分:2)

所以你的问题是,这人已经得出一组节点和边缘的,你想使测试找出被点击快得多其优势。

边缘是线段。为了过滤到少量可能的候选边缘,将边缘延伸到线中没有任何害处。即使你有大量的边缘,只有一小部分会靠近给定的点,所以迭代这些边缘并不坏。

现在将边缘分为两组。垂直,而不是垂直。您可以将垂直边缘存储在已排序的数据结构中,并轻松测试哪些垂直线靠近任何给定点。

不垂直的那些更棘手。对他们来说,你可以画垂直边界到您的节点可以放置在区域的左侧和右侧,然后存储每行一对高度将线相交的线。您可以将这些对存储在QuadTree中。您可以添加到此QuadTree逻辑以获取一个点,并在QuadTree中搜索在该点的特定距离内传递的所有线。 (这个想法是,在四叉树的任何一点,你可以构建一个对边界线全部低于该点行的。如果你的意思是不是那些线之间,或接近他们,你可以跳过树的该部分。)

答案 2 :(得分:1)

我认为你已经拥有了所有的成分。 这是一个建议:

  1. 索引空间数据结构中的所有边(可以是QuadTreeR-Tree等)。应使用其边界框对每条边进行索引。
  2. 记录鼠标位置。
  3. 搜索包含鼠标位置的最具体矩形。
  4. 此矩形应具有一个或多个边/节点;根据需要的模式迭代它们。
  5. (棘手的部分):如果用户没有从最特定的矩形指示任何边缘,则应该上升一级并迭代此级别中包含的边缘。也许你可以不用这个。
  6. 这应该更快。