首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测两个圆圈之间的碰撞点,然后创建一个向量来更新圆圈的位置?

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

Stack Overflow用户
提问于 2014-02-05 20:37:24
回答 1查看 876关注 0票数 0

我正在用CodeSkulptor (python 2)编写一个简单的空气曲棍球风格的游戏。3圈,基本上是两个桨和一个球。我知道如何检测圆圈之间的碰撞,但我发现很难准确地模拟这个圆圈如何从用户控制的圆圈中反弹。用户控制的圆圈(桨)倾向于消耗球和球被卡住。我认为我的代码弹出墙的球和我写的关于桨碰撞的代码是一样的。

我阅读了一些其他帖子,我发现我需要得到碰撞点,然后以某种方式将其转化为一个向量,以更新球的位置。有人能帮我吗?另外,桨是由用户控制的这一事实是否使事情复杂化了?我猜对球的影响也要考虑到桨的矢量吗?

谢谢你的回答,请尽量保持数学的简单。

克里斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-05 21:32:11

解决方案1

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

  1. 移动圆圈
  2. 测试它是否重叠
  3. 如果重叠:将其移回
  4. 让它改变方向。

这样,如果另一部分没有在同一时间内移动,你就不应该被卡住。因为通过向后移动,你不会在事后重叠,不会触发反弹和改变方向两次。

解决方案2

使用向量和只使用圆圈:

代码语言:javascript
复制
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

变换方向

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

代码语言:javascript
复制
 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 点积 new_direction) * new_direction

点积给你投射到某个向量上的方向有一个读。

而且,一旦你得到了这个,你就可以创建弹性碰撞,考虑到圆圈有多重:http://en.wikipedia.org/wiki/Collision

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21587973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档