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