python画正方形旋转_在Tkinter画布上旋转正方形

你的第一个问题是你使用的公式围绕原点旋转。我想你想把正方形绕着它的中心旋转。为此,只需平移正方形,使其中心位于原点,旋转它,然后将其平移回来。

第二个问题是,执行list(points)会创建一个新的外部列表,但它不会为points中的列表创建新的列表。有很多方法可以制作一个深层副本,为那些内部列表创建新列表,但在这里不需要这样做。只需从旋转的顶点构建一个新的列表。

我的代码版本用蓝色绘制原始正方形,这样我们就可以看到旋转的正方形最终位于正确的位置。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, center):

angle = math.radians(angle)

cos_val = math.cos(angle)

sin_val = math.sin(angle)

cx, cy = center

new_points = []

for x_old, y_old in points:

x_old -= cx

y_old -= cy

x_new = x_old * cos_val - y_old * sin_val

y_new = x_old * sin_val + y_old * cos_val

new_points.append([x_new + cx, y_new + cy])

return new_points

def draw_square(points, color="red"):

canvas.create_polygon(points, fill=color)

def test():

old_vertices = [[150, 150], [250, 150], [250, 250], [150, 250]]

print "vertices: ", vertices, "should be: ", old_vertices

print vertices == old_vertices

draw_square(vertices, "blue")

center = (CANVAS_MID_X, CANVAS_MID_Y)

new_square = rotate(vertices, 30, center)

test()

draw_square(new_square)

mainloop()

我还对你的代码做了一些其他的小改动。

顺便说一句,你应该from __future__ import division

在你的其他进口之前。这告诉Python使用真正的除法。没有它,SIDE / 2做整数除法。这在这里可以工作,但是如果SIDE是一个奇数,就不正确了。

你应该试着改掉这样做的习惯from Tkinter import *

相反,做import Tkinter as tk

然后调用Tkinter函数,如下所示:canvas = tk.Canvas(root, bg="black", height=HEIGHT, width=WIDTH)

这稍微多了一点类型,但是它使代码更易于阅读和维护,并且防止了当代码意外使用Tkinter定义的名称时可能出现的错误。FWIW,执行from Tkinter import *将170多个名称导入到您的命名空间中。你不需要那些杂物!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值