Python 如何在graphics.py中检查两个框之间的冲突?

Python 如何在graphics.py中检查两个框之间的冲突?,python,graphics,zelle-graphics,Python,Graphics,Zelle Graphics,如何使用John Zelle的graphics.py模块检查两个框之间的冲突 编辑: 我已经找到了一种方法来找到任意两个类之间的碰撞,它们有x,y,width,height。虽然有点凌乱,但它确实起到了作用: def碰撞(自身,碰撞器): 如果self.xcollider.x和\ self.ycollider.y: 返回真值 返回错误 如果有人有更好的方法,我们将不胜感激 这里有一个小演示程序,演示了一种相当简洁的方法,它包含一个名为intersect()的函数,用于检查图形模块的矩形类的两个

如何使用John Zelle的
graphics.py
模块检查两个框之间的冲突

编辑:

我已经找到了一种方法来找到任意两个类之间的碰撞,它们有x,y,width,height。虽然有点凌乱,但它确实起到了作用:

def碰撞(自身,碰撞器):
如果self.xcollider.x和\
self.ycollider.y:
返回真值
返回错误

如果有人有更好的方法,我们将不胜感激

这里有一个小演示程序,演示了一种相当简洁的方法,它包含一个名为
intersect()
的函数,用于检查
图形
模块的
矩形
类的两个实例是否相交

这样做有点棘手,因为用于定义矩形的两个
点不需要是它的右下角和左上角,
intersect()
函数中的逻辑需要这两个点。为了处理这个问题,使用名为
canonical_rect()
的帮助函数,使传递的每个参数都是这样

from graphics import *
from random import randint


WIDTH, HEIGHT = 640, 480

def rand_point():
    """ Create random Point within window's limits. """
    return Point(randint(0, WIDTH), randint(0, HEIGHT))

def rand_rect():
    """ Create random Rectangle within window's limits. """
    p1, p2 = rand_point(), rand_point()
    while p1 == p2:  # Make sure points are different.
        p2 = rand_point()
    return Rectangle(p1, p2)

def canonical_rect(rect):
    """ Return new Rectangle whose points are its lower-left and upper-right
        extrema - something Zelle graphics doesn't require.
    """
    p1, p2 = rect.p1, rect.p2

    minx = min(p1.x, p2.x)
    miny = min(p1.y, p2.y)

    maxx = max(p1.x, p2.x)
    maxy = max(p1.y, p2.y)

    return Rectangle(Point(minx, miny), Point(maxx, maxy))

def intersect(rect1, rect2):
    """ Determine whether the two arbitrary Rectangles intersect. """
    # Ensure pt 1 is lower-left and pt 2 is upper-right of each rect.
    r1, r2 = canonical_rect(rect1), canonical_rect(rect2)

    return (r1.p1.x <= r2.p2.x and r1.p2.x >= r2.p1.x and
            r1.p1.y <= r2.p2.y and r1.p2.y >= r2.p1.y)

def main():
    # Initialize.
    win = GraphWin('Box Collision', WIDTH, HEIGHT, autoflush=False)
    center_pt = Point(WIDTH // 2, HEIGHT // 2)
    box1 = Rectangle(Point(0, 0), Point(0, 0))
    box2 = Rectangle(Point(0, 0), Point(0, 0))
    msg = Text(center_pt, "")

    # Repeat until user closes window.
    while True:
        box1.undraw()
        box1 = rand_rect()
        box1.draw(win)

        box2.undraw()
        box2 = rand_rect()
        box2.draw(win)

        if intersect(box1, box2):
            text, color = "Collided", "red"
        else:
            text, color = "Missed", "green"
        msg.undraw()
        msg.setText(text)
        msg.setTextColor(color)
        msg.draw(win)

        win.update()

        try:
            win.getMouse()  # Pause to view result.
        except GraphicsError:
            break  # User closed window.

if __name__ == '__main__':

    main()
从图形导入*
从随机导入randint
宽度,高度=640480
定义随机点():
“”“在窗口限制内创建随机点。”“”
返回点(randint(0,宽度),randint(0,高度))
def rand_rect():
“”“在窗口限制内创建随机矩形。”“”
p1,p2=随机点(),随机点()
p1==p2:#确保点不同。
p2=随机点()
返回矩形(p1,p2)
定义规范(rect):
“”“返回点位于左下角和右上角的新矩形”
极值-Zelle graphics不需要的东西。
"""
p1,p2=rect.p1,rect.p2
minx=min(p1.x,p2.x)
miny=min(p1.y,p2.y)
maxx=max(p1.x,p2.x)
最大值=最大值(p1.y,p2.y)
返回矩形(点(minx,miny),点(maxx,maxy))
def intersect(rect1、rect2):
“”“确定两个任意矩形是否相交。”“”
#确保pt 1位于每个rect的左下方,pt 2位于右上方。
r1,r2=rect(rect1),rect(rect2)
返回(r1.p1.x=r2.p1.x和
r1.p1.y=r2.p1.y)
def main():
#初始化。
win=GraphWin('Box Collision',宽度,高度,自动刷新=False)
中心点=点(宽度//2,高度//2)
框1=矩形(点(0,0),点(0,0))
框2=矩形(点(0,0),点(0,0))
msg=文本(中间位置“”)
#重复此操作,直到用户关闭窗口。
尽管如此:
框1.undraw()
box1=随机校正()
框1.平局(赢)
框2.undraw()
box2=随机校正()
框2.平局(赢)
如果相交(框1,框2):
文本,color=“碰撞”,“红色”
其他:
文本,color=“缺失”,“绿色”
msg.undraw()
msg.setText(文本)
msg.setTextColor(颜色)
味精。抽签(赢)
win.update()
尝试:
win.getMouse()#暂停查看结果。
除图形错误外:
打破#用户关闭的窗口。
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()