我有两个多边形被定义为向量列表,我已经设法编写例程来转换和交叉这两个多边形(见第1帧)。使用行交叉我可以弄清楚这些是否发生碰撞,并编写了一个有效的Collide()函数。
这用于变步长定时游戏,因此(如下图所示)在第1帧中右边的多边形没有碰撞,在第2帧上,多边形在彼此内部完全正常,右侧多边形向左移动。
我的问题是,找出交叉时刻的最佳方法是什么?在这个例子中,让我们假设在第1帧中右边的多边形在X = 300,第2帧它移动了-100并且现在是200,这就是我在第2帧出现时所知道的,它是在300,现在它是在200.我想知道的是它什么时候实际碰撞,在什么X值,这可能是250左右。
我最好找一个解决这个问题的C#源代码解决方案。 也许有更好的方法来解决这个问题?
答案 0 :(得分:2)
我也不是数学家,但有一种可能的解决办法就是进行迷你模拟。
让我们称移动多边形 M 和静止多边形 S (尽管 S 实际上不需要静止,无论如何,方法应该是一样的。我们还会根据您的图表调用前面的两个帧 F1 和后面的 F2 。
如果您要以非常小的增量将多边形 M 转换回 F1 中的位置,直到它们不再相交,那么您将拥有一个位置对于 M ,它'恰好'相交,即它们在此模拟中停止相交之前的前一个位置。这个“正好”交叉位置的交叉点应该非常小 - 足够小,您可以将其视为一个点。让我们将这个交叉点称为 I 。
要将 I 视为一个点,您可以在 F1 中选择最接近 M 中心点的顶点:该顶点在碰撞时最有机会出在 S 之外。 (还有很多其他的可能性来解释 I 作为你可以试验的一点,可能会有更好的结果。)
显然这种方法有一些缺点:
就个人而言,如果没有必要的数学直觉,我会首先采用这种简单的方法,然后尝试将数学解作为优化。
答案 1 :(得分:2)
我会使用分离轴定理,如下所述:
如果需要,我会sweep test或使用multisampling。
GMan在StackOverflow上写了一个示例实现,在gpwiki.org。
对于您的用例,这可能都是过度的,但它处理任何订单的多边形。当然,对于简单的边界框,可以通过其他方式更有效地完成。
答案 2 :(得分:2)
如果您能够确定两个多边形是否重叠,一个想法可能是使用修改后的二进制搜索来检测两个多边形的位置。首先将时间间隔细分为两半,然后查看两个多边形是否在中点相交。如果是这样,递归搜索范围的前半部分;如果没有,搜索下半场。如果指定一个不再关心小距离的公差级别(例如,在像素级别),则此方法的运行时间为O(log D / K),其中D是多边形之间的距离K是截止阈值。如果您知道哪个点最终将进入第二个多边形,您应该能够以这种方式快速检测到碰撞。
希望这有帮助!
答案 3 :(得分:1)
对于一个相当通用的解决方案,并假设......
然后使用二元方法通过......
来推导交叉时间double tInterval = t;
double tCurrent = 0;
int direction = +1;
while (tInterval > MinInterval)
{
tInterval = tInterval/2;
tCurrent += (tInterval * direction);
MovePolygons(tCurrent);
if (PolygonsIntersect)
direction = +1;
else
direction = -1;
}
答案 4 :(得分:0)
嗯 - 你可能会发现它总是一个多边形的一个点撞到另一个的一侧(或另一个点 - 但毕竟几乎相同) - 一个可能的解决方案是计算距离移动方向上其他线的点。但我认为这会变得相当缓慢。
我想正常情况下,帧之间的距离太小,以至于它并不重要,并且确切地知道它首先击中的位置 - 一些小的交叉点将不可见,并且毕竟事情会反弹或爆炸 - 不是吗? :)