假设我在公园里实施Dijkstra算法。有点和这些点之间的连接; 这些指定用户可以行走的有效路径(例如人行道)。
现在想象一下,用户在草地上(即不在路径上),并希望导航到另一个位置。问题不在于Dijkstra算法(它正常工作),而是确定从哪个顶点开始。
以下是问题的图片:(暂时忽略虚线)
黑线显示Dijkstra算法中的边缘;同样,紫色圆圈显示顶点。 人行道为灰色。 草是绿色的。 用户位于红星处,并希望到达橙色X。
如果我天真地寻找最近的顶点并将其用作起点,则用户通常会被引导到次优路径,该路径在开始时需要更远地步行到达目的地(即红色实线路径)。
蓝色实线路径是我的算法理想情况下提出的最佳路径。
注意事项:
假设没有路径跨越其他路径。
当导航到起始点时,用户不应越过路径(例如人行道)。
在上面的图像中,从星星出来的第一条线段是动态创建的,仅用于帮助用户。 星号不是图中的顶点(因为用户可以在草地区域内的任何地方),从星号到顶点的线段仅用于显示,以便用户知道如何到达图中的第一个有效顶点。
我如何高效正确地实现这一点?
想法#1:找到包围多边形
如果我找到了围绕起始点的最小多边形,则现在可以为Dijkstra算法创建新路径,从起始点(暂时添加为新顶点)到组成多边形的每个顶点。 在上面的示例中,多边形有6个面,因此这意味着创建6条连接到其每个顶点的新路径(即蓝色虚线)。 然后,我将能够运行Dijkstra算法,并且它将轻松确定蓝色实线是最佳路径。
该方法的问题在于确定哪些顶点组成了围绕我的点的最小多边形。 我不能为图中的每个顶点创建新路径,否则我也会得到红色虚线,这完全违背了使用Dijkstra算法的目的(我不应该允许越过人行道)。 因此,我必须注意仅将路径创建到封闭多边形的顶点。 是否有此算法?
这个解决方案还有一个复杂的问题:假设用户现在从紫色闪电开始。它没有封闭的多边形,但算法仍应通过连接它到右上角的3个点来工作。一旦连接到这些点,运行Dijkstra算法就很容易了。
更新:我们希望连接到这3个点中的一个,而不是绕着一切走到达橙色X,因为我们想要最小化在未铺设道路上的步行路程。(注意:只有当你从多边形外部开始时,这才是一个约束条件。如果在多边形内部行走,我们不关心你在草地上走多久)。
如果这是正确的解决方案,请将其算法作为答案发布。
否则,请发布更好的解决方案。
现在想象一下,用户在草地上(即不在路径上),并希望导航到另一个位置。问题不在于Dijkstra算法(它正常工作),而是确定从哪个顶点开始。
以下是问题的图片:(暂时忽略虚线)
黑线显示Dijkstra算法中的边缘;同样,紫色圆圈显示顶点。 人行道为灰色。 草是绿色的。 用户位于红星处,并希望到达橙色X。
如果我天真地寻找最近的顶点并将其用作起点,则用户通常会被引导到次优路径,该路径在开始时需要更远地步行到达目的地(即红色实线路径)。
蓝色实线路径是我的算法理想情况下提出的最佳路径。
注意事项:
假设没有路径跨越其他路径。
当导航到起始点时,用户不应越过路径(例如人行道)。
在上面的图像中,从星星出来的第一条线段是动态创建的,仅用于帮助用户。 星号不是图中的顶点(因为用户可以在草地区域内的任何地方),从星号到顶点的线段仅用于显示,以便用户知道如何到达图中的第一个有效顶点。
我如何高效正确地实现这一点?
想法#1:找到包围多边形
如果我找到了围绕起始点的最小多边形,则现在可以为Dijkstra算法创建新路径,从起始点(暂时添加为新顶点)到组成多边形的每个顶点。 在上面的示例中,多边形有6个面,因此这意味着创建6条连接到其每个顶点的新路径(即蓝色虚线)。 然后,我将能够运行Dijkstra算法,并且它将轻松确定蓝色实线是最佳路径。
该方法的问题在于确定哪些顶点组成了围绕我的点的最小多边形。 我不能为图中的每个顶点创建新路径,否则我也会得到红色虚线,这完全违背了使用Dijkstra算法的目的(我不应该允许越过人行道)。 因此,我必须注意仅将路径创建到封闭多边形的顶点。 是否有此算法?
这个解决方案还有一个复杂的问题:假设用户现在从紫色闪电开始。它没有封闭的多边形,但算法仍应通过连接它到右上角的3个点来工作。一旦连接到这些点,运行Dijkstra算法就很容易了。
更新:我们希望连接到这3个点中的一个,而不是绕着一切走到达橙色X,因为我们想要最小化在未铺设道路上的步行路程。(注意:只有当你从多边形外部开始时,这才是一个约束条件。如果在多边形内部行走,我们不关心你在草地上走多久)。
如果这是正确的解决方案,请将其算法作为答案发布。
否则,请发布更好的解决方案。