矩形碰撞
rectangle collision
这更像是一个编程问题而不是一个技术问题,但由于它涉及编程和数学,我希望得到一些有用的反馈。
我有两个矩形:rectangle1和rectangle2。都由四个float值定义:
float left;
float right;
float top;
float bottom;
对于这个例子,假设每个矩形是100 x 100,并且矩形1是:
float left = 100.0;
float right = 200.0;
float top = 500.0;
float bottom = 600.0;
和rectangle2是:
float left = 150.0;
float right = 250.0;
float top = 550.0;
float bottom = 650.0;
当碰撞发生时,我试图确定矩形1的哪一边撞击矩形2的哪一边使用八个浮动值。
如果我的问题得到了回答,我可能能够在碰撞发生时确定如下内容:
矩形1的右侧撞上矩形2的左侧
到目前为止,我已经尝试使用简单的数学来确定每种可能性之间的距离:
float distance1 = rectangle2.left - rectangle1.right;
float distance2 = rectangle2.top - rectangle1.bottom;
float distance3 = rectangle2.right - rectangle1.left;
float distance4 = rectangle2.bottom - rectangle1.top;
然后取这些值的最小值来确定每个矩形的哪一边涉及到碰撞。然而,事情似乎没有那么简单。这个尝试有两个基本问题:
1)当到达碰撞码时,矩形将已经重叠。
2)如果多个矩形堆叠在彼此的顶部,计算将产生奇怪的结果(即,即使矩形1在右上角方向移动并且应该击中两个矩形的左侧,它实际上可能击中一个矩形在底部而另一个矩形在左侧)
(这是因为当到达碰撞代码时矩形重叠,并且因为在这种情况下distance1和distance4将接近或相等)
有没有更好的方法用简单的数学来回答这个问题?如有任何帮助,不胜感激。
在提到它之前,这不是作业,而是我想解决的一个真正的问题
如果你能正确识别碰撞,然后画一条线连接两个矩形的中心,并检查与每个矩形的面相交。在任何给定的时间,这条线将与两个面相交,只要这两个矩形不重叠,或者更准确地说,只要一个矩形的中心不在另一个矩形的内部。
当它们重叠时,可以得到1或0交集。情况0:一个矩形完全在另一个矩形内,所以你可以决定你想要如何决定哪边被击中,可以选择最靠近每个中心的一个。
情形1:矩形完全或部分在另一个矩形内。在任何一种情况下,继续扩展连接中心的线,直到穿过外部(包含)矩形。如果您之前再次交叉包含的矩形,只需将命中的面更改为新交叉的面。
希望这不是太令人困惑:)
- 落砂模拟碰撞检测C++和SFML
- SFML 碰撞永远不会在我的系统中注册
- 在均匀网格中处理碰撞
- 平台游戏 - 下车时避免与平台碰撞
- AABB 碰撞使实际精灵的大小翻倍
- 具有随机值的多个对象及其碰撞的 SFML
- SFML 中的重力和碰撞检测
- 我的碰撞检测中的奇怪行为
- Box2D Contact Listener碰撞仅间歇性工作
- 如何为球形物体和三角形地形提供高效的碰撞检测和响应
- 同时与两个片段着色器发生碰撞
- 2D 障碍物碰撞
- 可破坏的网格块会导致奇怪的碰撞
- ptrdiff_t typedef 碰撞 - 谷歌测试和英特尔蟒蛇
- 玩家移动和碰撞之间的交互问题
- 圆形与方形碰撞检测以及需要响应C++ |OpenGL。我的问题就是这个"I need to keep the circle outside the square"
- 视觉 SIGSEGV 在C++碰撞预防
- 球的预测碰撞
- 矢量迭代器在碰撞时不可递增
- Cocos2d-x TiledMap,在调用 getLayer() 获取碰撞层时返回一个 nullptr?