0

这是一个使用 Python 的计算机科学作业,有人知道我会从哪里开始创建一个算法来创建一个在屏幕上滚动的正方形或盒子吗?我确实是指滚动,而不是滑动。它不一定必须使用python,我只需要一个关于坐标如何工作的一般想法和一般算法。

4

3 回答 3

2

如果一个单位正方形开始时一侧位于 x 轴上,右下角位于 (xs, 0) 处,则顺时针旋转四分之一圈后,它的一侧将再次位于 x 轴上,而下方现在在 (xs+1, 0) 的右角。在它转动之前,将左下角标记为a;左上角,b;和右上角,c。当正方形转动时,角 a 和 c 沿单位圆的弧移动。角 b 以半径 d = sqrt(2) 移动。

这导致以下方法:步距角 t 从 0 到 pi/2(即 90°),令
• xa = xs - cos t
• ya = sin t
• xb = xs - d*cos(t+pi/4)
• yb = d*sin(t+pi/4)
• xc = xs + sin t
• yc = cos t

在每个时间步,通过绘制背景色线擦除旧正方形,从方程计算新的 (xa,ya,xb,yb,xc,yc),用从 (xs,0) 到 (xa,yb) 的线绘制新正方形) 到 (xc,yc) 到 (xd,yd) 到 (xs,0),然后延迟适当的量。每次 t 达到 pi/2 时,将 t 设置回 0 并将 xs 加 1。请注意,与其擦除整个正方形然后绘制新的,不如尝试擦除一条旧线并为四个边依次绘制一条新线。

于 2012-11-30T05:13:45.570 回答
0

我会首先考虑盒子在一个角落从一侧旋转到另一侧,然后按顺序组合这些步骤来解决这个问题。也就是说,如果你有一个像

A ---- B
|      |
C ---- D

向右滚动,然后首先整个东西围绕 D 旋转,直到你有

       C - A
       |   |
       |   |
       |   |
       |   |
       D - B

该步骤是将原点 D 周围的所有点直接顺时针旋转 0 到 90 度之间的角度 theta。我将把这个问题留给提问者和/或维基百科;)。

一旦你弄清楚了那一步,旋转的下一部分是相同的,除了现在你围绕 B 而不是 D 旋转。这会让你

           D ---- C
           |      |
           B ---- A

因此,在较高的层次上,我将通过首先计算出最近的“平面”配置来计算角点在时间 t 的位置,然后确定哪个角在前面,然后根据如何围绕前角旋转点自从广场处于那种平坦状态以来,已经过去了很长时间。

作为奖励提示, divmod 是 python 中的一个很好的函数,用于将时间戳分成一对(我在哪一步,我离那一步有多远)。

于 2012-11-30T05:27:21.040 回答
0

您也可以完全打破作业的精神,使用 pybox2d、pymunk 或其他物理引擎为您完成所有计算。然后你可以有很多盒子滚动并相互弹跳:D

于 2012-11-30T05:47:45.043 回答