Algorithm 检查圆是否适合通过非量化二维空间中的迷宫

Algorithm 检查圆是否适合通过非量化二维空间中的迷宫,algorithm,search,2d,maze,Algorithm,Search,2d,Maze,我是一名高中生,最近参加了一次编码比赛,遇到了一个我不知道如何解决的问题: 给定一个封闭在100x100区域内的迷宫,根据所有墙壁的位置确定一个给定半径的圆是否可以穿过迷宫。墙将被定义为连接空间内两个点的线,并且将为圆提供起点和终点。圆必须以其中心在起点处开始,并接触到终点,才能成功穿过迷宫。最多有20堵墙。圆的半径和墙的位置可以任意精确。在这种情况下,任意表示在远限内——比如说,小数点后最多10位 这里有一个例子。如果这是输入: Radius = 2.8 Start = (5,5), Dest

我是一名高中生,最近参加了一次编码比赛,遇到了一个我不知道如何解决的问题:

给定一个封闭在100x100区域内的迷宫,根据所有墙壁的位置确定一个给定半径的圆是否可以穿过迷宫。墙将被定义为连接空间内两个点的线,并且将为圆提供起点和终点。圆必须以其中心在起点处开始,并接触到终点,才能成功穿过迷宫。最多有20堵墙。圆的半径和墙的位置可以任意精确。在这种情况下,任意表示在远限内——比如说,小数点后最多10位

这里有一个例子。如果这是输入:

Radius = 2.8
Start = (5,5), Destination = (95,95)
Walls (a wall connects each pair of points):
(20,0) to (27.5,22.6)
(27.5,22.6) to (55.1,35.5)
(55.1,35.5) to (80.3,80,4)
(80.3,80,4) to (95,63.9)
(1.7,25.8) to (17.5,53.2)
(17.5,53.2) to (56.4,69)
(56.4,69) to (67.9,90.6)
(85.6,98.94512) to (87.3,92.5)
这是在desmos上制作的迷宫的样子蓝色圆圈只是为了显示圆圈有多大:

如果在量化网格中,我知道如何解决这个问题,但是墙的确切位置和圆的半径可以任意精确。我考虑过使用右手法则来寻找路径,但我不知道如何在非量化空间中实现,也不太熟悉这种方法


我该如何着手解决这个问题?有人能告诉我一个算法,一个链接,一些伪代码,或者只是一个直觉,可以帮助我理解如何解决这个问题吗?感谢您的帮助。谢谢

这是一项相当艰巨的任务,也不容易编写代码,但这里有一种可行的方法:

设r为圆的半径。这意味着圆心不能到达任何障碍物的r范围内

将迷宫区域的墙壁每侧移动r

用半径为r的圆替换每个墙端点

用宽度为2r的矩形替换每面墙

现在,您不需要担心圆,只需要担心它的中心点,它必须保持在新边界内,并且位于您从墙中创建的任何圆或矩形之外

现在,如果它们位于同一封闭区域中,则有一条从起点到终点的路径。为了找到答案

在每个交叉点和垂直最大或最小点水平剪切场景以创建条带,每条条带通过一条直线或一条圆弧划分为多个区域。区域不会将方向连接到其左右两侧的区域,但可以连接到其上方和下方条带中的零个或多个区域。区域之间的连接形成一个图形


从包含起点的区域开始,在该图上运行BFS或DFS,查看是否可以到达包含终点的区域。

在每侧加厚/移动r墙,就像在另一个答案中一样+1 btw听起来很简单,但编码并不简单。有关更多信息,请参阅

二维法线的方向很容易,如果dx,dy是线方向,那么-dy,dx和dy,-dx是它的法线

然而,我鼓励通过计算迷宫的每个顶点到墙的最近距离和比2r更近的闭合路径,来做更慢但安全和更容易的方法

大概是这样的:

因此:

对于每个顶点 检查不属于顶点路径的所有线 计算到直线及其顶点的垂直距离和最小距离d 使用可轻松计算的最小距离d查看:

只需查看任意点p到AB的垂直距离,因此:

如果d
d = min
      (
      perpendicular_distance(line,vertex), 
      |line_vertex1-vertex|, 
      |line_vertex2-vertex| 
      )