x_o
我有一条线从一个位置和y_o
方向伸出theta
。世界不是无限的,也有边界。
我想找到被线和交点击中的第一个矩形。
这是一个典型的 2D 游戏编程问题,但是我可以阅读任何简短的论文/教程吗?我在搜索字词方面遇到问题。
编辑:我知道光线投射。有什么非常简单的实现我可以看看吗?还有任何分析方法可以有效地解决这个问题。最后,有没有我可以在不诉诸矩形的情况下做出任何概括(如旋转的矩形......、圆形等)
Edit2:也可以使用良好、高效的数据结构来存储地图和障碍物
x_o
我有一条线从一个位置和y_o
方向伸出theta
。世界不是无限的,也有边界。
我想找到被线和交点击中的第一个矩形。
这是一个典型的 2D 游戏编程问题,但是我可以阅读任何简短的论文/教程吗?我在搜索字词方面遇到问题。
编辑:我知道光线投射。有什么非常简单的实现我可以看看吗?还有任何分析方法可以有效地解决这个问题。最后,有没有我可以在不诉诸矩形的情况下做出任何概括(如旋转的矩形......、圆形等)
Edit2:也可以使用良好、高效的数据结构来存储地图和障碍物
你把你的世界划分成一个网格怎么样。在每个单元格中,存储完全或部分位于该单元格中的障碍物。这将是您的搜索结构。
然后,从 (xo, yo) 向 theta 方向发射射线 R,首先要定位包含 (xo, yo) 的单元。接下来,计算 R 和单元格之间的交点(即 R 离开单元格的位置),并根据 R 离开单元格的哪一侧,使该相邻单元格成为新的当前单元格。对于这个单元格,计算 R 离开它的位置等。
在您到达的每个单元格中,检查 R 是否与存储在该单元格中的任何障碍物发生碰撞,如果是,则您的射线已与障碍物发生碰撞,您可以停止遍历单元格。
显然,这要求您使网格中的单元足够小,以使它们每个都只包含少量障碍物。如果障碍物的大小变化很大,您可以考虑使用四叉树而不是常规网格。但是,这将使遍历单元格更加复杂。
通过将障碍矩形定义为节点和边,您可能会获得一些牵引力。每个角是一个点(一个节点),每个边是一个边。给定您的节点集合,您可以为边缘生成线性方程。
然后,使用已知的射线方程,确定射线和每个边缘之间是否存在联立解。如果存在,则该边缘是解决方案点碰撞的候选者。
现在,这些边缘方程是整条线……矩形的边只是那条线的一部分,而不是整条线。所以...
最后,您可以确定解点是否包含在边缘段上(是否位于两个节点内)。如果是,则候选边是实际的碰撞边。如果找到多个碰撞边缘,则只取其解点最接近射线原点的碰撞边缘。