【问题标题】:Coordinates for Moving Ball Bounce Off Canvas移动球在画布上反弹的坐标
【发布时间】:2021-11-27 00:33:14
【问题描述】:

我正在寻找这个圆圈从屏幕边缘反弹并反弹回画布中。我知道你需要输入坐标只需要一个公式,这样我就可以理解我在看什么。

import tkinter  # Used to draw on canvas (2D plot)

class MyCircle:
    def __init__(self, x, y, dx, dy, cnum):  # "self" always 1st parameter in python methods
        self.x = x
        self.y = y
        self.dx = dx  # "delta-x" or "change in x" or "x velocity"
        self.dy = dy
        self.cnum = cnum   # Add circle number as parameter for log

    # delete the log files to retry
    # https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files
    def logData(self):
        # Filename uses circle number.
        with open('logfile_' + str(self.cnum) + '.txt', 'a') as f:
            f.write("x=" + str(self.x) +
                    " y=" + str(self.y) +
                    " dx=" + str(self.dx) +
                    " dy=" + str(self.dy) + '\n')

    def MoveIt(self, coordinates=tkinter.Canvas):
        self.x = self.x + self.dx
        self.y = self.y + self.dy

    def DrawIt(self, w):
        w.create_arc(self.x, self.y, self.x + 20, self.y + 20, start=0, extent=359,
                     fill='red')

【问题讨论】:

  • 除了球的初始位置之外,您还需要一个方向矢量和速度(可以组合),以及墙壁的位置。请参阅deflection 上的维基百科文章
  • 代码已经有了位置 x 和 y 以及速度 dx 和 dy。 dx 和 dy 将包含方向信息。我错了吗?
  • 感谢您的帮助。我刚刚进入编码的第一年,有很多信息需要处理和理解。不过,令人着迷的东西。

标签: python tkinter canvas


【解决方案1】:

TL;DR

添加一个名为bounce的方法,每帧调用一次(可以在MoveIt方法中调用):

def bounce(self):
    if not 0 <= self.x <= WIDTH:
        self.dx *= -1

    if not 0 <= self.y <= HEIGHT:
        self.dy *= -1

我们需要在这里假设一些事情:

  1. 边缘(墙壁)具有无限的质量。意味着在碰撞时能量不会从球传递到墙壁。
  2. 碰撞是弹性的。意味着能量不会转移到其他东西上。

在这些假设下,碰撞恰好是球的速度矢量方向的变化。

如果碰撞发生在左墙或右墙上,则必须更改 dx 的符号 (*-1),如果发生在顶部或底部墙壁上,则必须更改 dy 的符号。

【讨论】:

  • 这看起来就像当它的 x 或 y 在范围内时它会反弹球。它也没有考虑球的大小。
  • 非常好。我在 if 语句中添加了 not。对于半径,你又是对的。还必须考虑球的大小。但我会把它留给@Student 来修复它......
  • 已经修复了。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2023-03-08
  • 1970-01-01
  • 2019-08-09
  • 2019-06-26
  • 2015-04-18
  • 1970-01-01
相关资源
最近更新 更多