如何检测两个圆之间的碰撞点,然后创建一个向量来更新圆的位置?

时间:2014-02-05 20:37:25

标签: python

我正在CodeSkulptor(python 2)中编写一个简单的空气曲棍球风格游戏。 3圈,基本上是两个桨和一个球。我理解如何检测圆圈之间的碰撞,但我发现很难准确地模拟该圆圈如何从用户控制的圆圈反弹。用户控制的圆圈(桨)倾向于消耗球并且球被卡住。我认为我的球从墙上跳下来的代码与我为桨碰撞写的代码几乎相同。

我读了一些其他帖子,我发现我需要得到碰撞点,然后以某种方式把它变成一个向量来更新球的位置。任何人都可以帮助我吗?另外,桨用户控制的事实是否复杂?我猜测对球的影响也必须考虑到球拍的矢量?

感谢您的回复,请尽可能简化数学。

克里斯

1 个答案:

答案 0 :(得分:1)

解决方案1 ​​

适用于我和任意形状的算法是

  1. 移动圈子
  2. 测试是否重叠
  3. 如果重叠:将其移回
  4. 改变方向。
  5. 这样一来,如果其他部分没有同时移动,你不应该被卡住。因为通过向后移动你不会在之后重叠,并且mot会触发反弹和改变方向两次。

    解决方案2

    使用向量而仅使用圆圈:

    circle1x, circle1y, circle1radius, circle2x, circle2y, circle2radius
    
    if (circle1x - circle2x) ** 2 + (circle1y - circle2y) ** 2 < (circle1radius + circle2radius) ** 2: 
        # they overlap using http://en.wikipedia.org/wiki/Pythagorean_theorem
        # compute new direction
    

    改变方向

    计算新方向可以忽略两个圆圈的速度,但这看起来并不自然。

     old_direction1 = (v1x, v1y)
     velocity1 = (v1x ** 2 + v1y ** 2 ) ** 0.5
     old_direction2 = (v2x, v2y)
    
     distance = ((circle1x - circle2x) ** 2 + (circle1y - circle2y) ** 2) ** 0.5
     new_direction1 = ((circle1x - circle2x) / distance * velocity1, 
                       (circle1y - circle2y) / distance * velocity1)
     new_direction2 = ((circle2x - circle1x), ...)
    

    但你可以使用这个新方向和旧方向来创建一个看起来更自然的新方向。我没有测试过,但看起来应该是这样的:

    combined_direction = old_direction + 2 *(old_direction dot-product new_direction)* new_direction

    点积为您提供投射到某个矢量上的方向读数。

    一旦你得到这个,你可以考虑圆圈的重量来创建弹性碰撞:http://en.wikipedia.org/wiki/Collision