我已经接近了,但有两个问题。一个是旋转正方形的最终位置(不再位于中心)。第二个是我的原始顶点列表发生了变化,尽管我使用列表(…)复制了一个。
像往常一样,非常感谢你的帮助。
from Tkinter import *
import math
WIDTH = 400
HEIGHT = 400
CANVAS_MID_X = WIDTH/2
CANVAS_MID_Y = HEIGHT/2
SIDE = WIDTH/4
root = Tk()
canvas = Canvas(root, bg="black", height=HEIGHT, width=WIDTH)
canvas.pack()
vertices = [
[CANVAS_MID_X - SIDE/2, CANVAS_MID_Y - SIDE/2],
[CANVAS_MID_X + SIDE/2, CANVAS_MID_Y - SIDE/2],
[CANVAS_MID_X + SIDE/2, CANVAS_MID_Y + SIDE/2],
[CANVAS_MID_X - SIDE/2, CANVAS_MID_Y + SIDE/2]]
def rotate(points, angle):
new_points = list(points)
rad = angle * (math.pi/180)
cos_val = math.cos(rad)
sin_val = math.sin(rad)
for coords in new_points:
x_val = coords[0]
y_val = coords[1]
coords[0] = x_val * cos_val - y_val * sin_val
coords[1] = x_val * sin_val + y_val * cos_val
return new_points
def draw_square(points):
canvas.create_polygon(points, fill="red")
def test():
print "vertices: ", vertices, "should be: ", "[[150, 150], [250, 150], [250, 250], [150, 250]]"
new_square = rotate(vertices, 30)
draw_square(new_square)
test()
mainloop()
你的第一个问题是你使用的公式围绕原点旋转。我想你想把正方形绕着它的中心旋转。为此,只需平移正方形,使其中心位于原点,旋转它,然后将其平移回来。
第二个问题是,执行
list(points)
会创建一个新的外部列表,但它不会为points
中的列表创建新的列表。有很多方法可以制作一个深层副本,为那些内部列表创建新列表,但在这里不需要这样做。只需从旋转的顶点构建一个新的列表。我的代码版本用蓝色绘制原始正方形,这样我们就可以看到旋转的正方形最终位于正确的位置。
我还对你的代码做了一些其他的小改动。
顺便说一句,你应该
在你的其他进口之前。这告诉Python使用真正的除法。没有它,
SIDE / 2
做整数除法。这在这里可以工作,但是如果SIDE
是一个奇数,就不正确了。你应该试着改掉这样做的习惯
相反,做
然后调用Tkinter函数,如下所示:
这稍微多了一点类型,但是它使代码更易于阅读和维护,并且防止了当代码意外使用Tkinter定义的名称时可能出现的错误。FWIW,执行
from Tkinter import *
将170多个名称导入到您的命名空间中。你不需要那些杂物!相关问题 更多 >
编程相关推荐