【问题标题】:How to make rect from the intersection of two?如何从两者的交点制作矩形?
【发布时间】:2013-12-27 09:46:52
【问题描述】:

我正在研究一个突破克隆,我一直在试图弄清楚如何获得两个碰撞矩形的相交矩形,这样我就可以测量球在 x 和 y 轴上进入块的深度并决定哪个我将反转的速度分量。

我想我可以像这样计算每个案例的深度:

但是,如果我的交叉点是 rect ,那么我就不必担心球是否从 left/righttop/bottom 击中了挡板(因为我只会分别反转 x 和 y 轴),从而节省了我很多打字时间。

我看过Pygame's docs,但似乎它没有相应的功能。我该如何解决这个问题?

【问题讨论】:

  • 这个问题有 很多 个重复项(例如 Rectangle intersection)。请在发布新问题之前使用搜索工具...
  • 我对 Pygame 一无所知,但我想它提供了一些获取矩形坐标/大小的方法?在这种情况下,将existing questions) 中提出的任何解决方案转换为使用 Pygame 应该相对简单...

标签: python pygame rect breakout


【解决方案1】:

假设你有矩形r1r2,边有.left, .right, .top, and .bottom,那么

left = max(r1.left, r2.left);
right = min(r1.right, r2.right);
top = max(r1.top, r2.top);
bottom = min(r1.bottom, r2.bottom);

(通常的约定是坐标从上到下从左到右递增)。最后,检查left<righttop<bottom,并计算面积:

Area = (right - left) * (top - bottom);

或者,您可以使用clip() 函数。从您在问题中链接的文档中:

clip(Rect) -> Rect 返回一个被裁剪的新矩形 完全在参数 Rect 内。如果两个矩形不 开始重叠,返回一个大小为 0 的 Rect。

【讨论】:

  • 不客气。有点讽刺的是,我在您链接的文档中找到了clip() 答案……有时您需要另一双眼睛。有点奇怪的名字 - 但当我看到他们有 union() 时,我认为它必须在那里,所以我更仔细地阅读。
  • 是的!你知道,在进行谷歌搜索并首先查看文档之前,我从不提问。当我自己无法解决此类问题时,我会感到困扰。我可能认为clip 就像set_clip 具有完全不同的行为。也许我应该删除这个问题,你认为?
  • 这取决于你。如果其他人搜索“矩形交叉点 pygame”,他们会发现布尔测试有很多命中——“重叠区域”很少。也许这个问题最终会出现在列表中……您很难找到答案 - 其他人也可能如此。
  • 嗯。我不认为这段代码是正确的。 top = max(r1.top, r2.top); 应该是 min 然后我们需要检查 (right - left)(top - bottom) 是否为负数(没有交集。)另外,用分号结束行是 pygame 的事情吗?
  • @BenB - 实际上坐标从上到下增加,它应该是bottom = min(r1.top, r2.top);。我添加了检查 - 好点。至于分号:这是主要编写 Matlab 和 C 的结果......
猜你喜欢
  • 2020-04-12
  • 2012-11-20
  • 2021-12-31
  • 1970-01-01
  • 2013-05-15
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多