Answers:
我认为您的绘制有点误导,因为您选择从与运动方向相切的圆上的点绘制笔触。我可以看到,当圆的TOP和LEFT点接触边缘时,会发生与网格边缘的碰撞。
令C为中心,r为半径,因此P' = C +(r,0)和P“ = C +(0,r)。
如果D是您的方向向量(方向向量),则有两行:
R'= D · t + P',
R“ = D · t + P”
您只需找到这些线与方程式的线的交点即可:
y = i和y = i 就是网格的边缘!
该解决方案很简单,因为您只需要考虑R'和R“的x或y分量即可。您将找到每个插入部分的t s值,以及t ts的点,只需将这些点按t排序即可,完成。
我相信,如果您知道交叉点,就可以轻松说出要击中哪个单元格。
如果r <1(像元宽度和高度),则此方法有效。
它也适用于其他情况,只需考虑P'和P“。由于方向而选择TOP和LEFT,应将BOTTOM和RIGHT视为相反的方向,您明白为什么。
现在看这张图片:
圆大于单个单元格,我们认为它的方向与您的绘图相同。P1是要触摸的第一个点,P2是第二个点,P3无用,因为在下半部分。您需要做的是像我们之前看到的那样投射P1和P2的光线,并对垂直线进行相同的处理。
通常,从顶部开始拍摄时,您将拥有其他起点和左边,而您的圆圈越大,投射的光线就越多。
老实说,您可以避免出于某些几何考虑而拍摄所有光线,但这会使事情变得更难以理解。
如果要使用射线碰撞算法,则可以在每个圆上选择八个点(以45度为增量,与正方形网格对齐),并在相应点之间使用射线碰撞(例如,从一个点的顶部开始)圈到另一个的顶部)。所有这些射线碰撞的并集是相交的整个单元集。
您可能会对此有所改进-例如,使用从一个圆的中心到另一个圆的中心的线段,但在任一侧均以圆的半径延伸,以及在圈子的两端。
我并不是说这是一个完美的类比,但您可能会想到布雷森汉姆的直线算法。对该算法或其扩展之一进行修改可能会有所帮助,特别是如果您将其与其他一些帖子和评论相结合。通常,此算法与排序无关,但是我认为您可以相当轻松地添加它。