查找与其他画布对象重叠的对象 - Python tkinter

3

我想检测Canvas对象中哪个对象与block重叠。我们有block,circle和triangle这几种Canvas对象。

我知道有一个if block in canvas.find_overlapping(x1,y1,x2,y2):方法,但它不会显示block与哪个对象重叠。它只会显示block是否与任何其他Canvas对象接触。

overlapping_object=canvas.find_overlapping(block)overlapping_object可以是一个列表,显示block接触的对象的标签。

如何使overlapping_object=canvas.find_overlapping(block)正确无误。我在这里打的只是样例。

非常感谢您的帮助!

我正在使用tkinter制作2D版minecraft,这个功能可以真正加快我的工作进程。


我会考虑在tkinter之外寻找解决方案。可以参考这里发布的答案。https://stackoverflow.com/questions/52636047/python-shapely-find-if-parts-of-two-multi-polygons-overlap - Ash
抱歉,我也遇到了这个问题。你还可以查看这个关于圆的特定问题的链接:https://stackoverflow.com/questions/28422734/how-to-check-if-a-circle-is-overlapping-or-inside-a-second-circle-and-if-a-point。虽然你也可以使用几何库来完成它。 - Ash
1
@Ash 这对我也没有帮助。我只是用tkinter做这个,没有别的。 - GamerTronky
我想要补充的是,有多个用 Python 构建的游戏引擎。Tkinter 是最糟糕的 GUI 程序之一(在我看来),不适合进行游戏开发,也没有针对游戏进行优化。Pygame 2.0 或其他引擎比 tkinter 更适合游戏开发。Tkinter 更适用于构建文本编辑器等应用程序。我甚至使用 tkinter 在 Windows 中制作了一个脚手架管理器。但我建议重新评估为什么要使用 tkinter 进行工作。我是说,你可以用餐勺挖沟,但铲子效果更好,你知道我的意思吗? - Ash
2
@Ash是的,我知道你的意思,谢谢。我开始注意到tkinter很难创建游戏 - 这些.place(relx = 0.5,rely = 0.5)非常困难。谢谢。 - GamerTronky
不太清楚你的问题。你可以获取 block 的坐标,然后使用这些坐标调用 find_overlapping 函数,它会返回所有重叠的对象列表。 - Bryan Oakley
1个回答

3
如果您不想使用其他库,只使用tkinter,我认为在tkinter中没有内置函数可以实现此功能。我也不确定为什么所有东西都必须在tkinter中完成,因为程序使用多个库并不罕见。就我个人而言,考虑到tikinter的局限性,我会使用pygame来跟踪多边形及其相交,但从不画出它们。除了使用第三方库(tikinter,python默认和其他库)之外,还有一种方法,那就是应用老式的数学方法。这里有一些关于如何实现这一点的文档。祝你好运。
编辑:我在学习其他内容时无意中使用数学找到了您问题的答案。仍然没有在tkinter中实现的方法,但是以下是数学解释。
circle with center (x,y) and radius r
Polygon with z number of sides with x*2-1 number of points(x,y)

如果您迭代多边形的线条并将它们通过以下数学公式进行处理:
Line J (x1,y1)(x2,y2)
m of Line J = (y1-y2)/(x1-x2)

create line P from circle center to P1 of LineJ
create line O from circle center to P2 of LineJ

现在我们有一个三角形

take the inverse cosine and length of P and O to get angle of the triangle you just made.

Make a right triangle by bisecting the triangle with line K starting at circle center and going out at the angle you just calculated.

现在您有线P以及线P相对于线K的1/2角度

现在要找到该中间角线的截距点

Tan(1/2 angle) = slope or m of the new line
using the x,y of the circle center calculate the slope intercept formula y=mx+b and get b

现在用J线的斜率截距公式,将其设置为新线的斜率截距。
line J (mx + b) = y = line P (mx + b)
Solve for y

然后在截距式中用y代入其中一个,解出x。

完成后,您将拥有4个点。三个点位于三角形内,第四个点是从J线到圆心的垂线上的点。

如果这些点中任意3个到圆心的距离小于r,则它们重叠。如果它们全部都大于r,则它们不重叠。


3
我认为 tkinter 中没有内置的函数可以实现这一点。 - 实际上是有的。 - Bryan Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接