在Tkinter Python中使用复数旋转三角形

-3 投票
2 回答
2618 浏览
提问于 2025-04-16 20:17

第一个方法是我自己写的,另外两个方法来自这里:http://effbot.org/zone/tkinter-complex-canvas.htm

我调用了一个旋转的方法,这个方法又调用了第二个,第二个再调用第一个。第一个方法根据传入的角度获取xy坐标,然后利用这些坐标来移动三角形。

self.x和self.y是三角形在画布上的坐标,具体来说是三角形底边中间的点。

我想还有其他更简单的方法可以做到这一点。

顺便说一下,我找到了这个,但对我帮助不大。

如何在Python的Tkinter画布上旋转一个多边形?

2 个回答

0

要旋转任何东西,最好的方法是把每个点 (x,y) 表示成一个复数,也就是 x + iy。然后通过把这个点乘以一个复数来进行旋转,这个复数的形式是 cos(角度) + i sin(角度)。

2

你的帖子提到你在理解如何用复数来旋转三角形时遇到了困难。
在看到你对我回答的评论后,我修改了我的代码示例,展示了一种从键盘输入获取角度的方法。
我对Tkinter没有经验,所以也许有人可以提供更先进的方法。
这些信息来自于Tkinter: 事件和绑定以及Tkinter输入控件

当你进入按键事件处理程序时,输入控件的文本通过text.get()获取时,并不包括最新按下的字符。

输入的角度是以度为单位的,并且可以是负数。

from Tkinter import *
import tkSimpleDialog as tks

import cmath,math

root = Tk()

c = Canvas(root,width=200, height=200)
c.pack()

# keypress event
def key(event):
    text.focus_force()
    ch=event.char

    # handle backspace
    if ch=='\x08':
        if len(text.get())>1 :
            entry_text=text.get()[:-1]
            if entry_text=='-': entry_text='0'
        else:
            entry_text='0'
    else:
        entry_text=text.get()+ch 

    # we want an integer
    try:
        angle_degrees=int(entry_text)
        cangle = cmath.exp(angle_degrees*1j*math.pi/180)


        offset = complex(center[0], center[1])
        newxy = []
        for x, y in triangle:
            v = cangle * (complex(x, y) - offset) + offset
            newxy.append(v.real)
            newxy.append(v.imag)
        c.coords(polygon_item, *newxy)
    except ValueError:
        print "not integer"

text = Entry(root)
text.bind("<Key>", key)

text.pack()
text.focus_force()

# a triangle
triangle = [(50, 50), (150, 50), (150, 150)]

polygon_item = c.create_polygon(triangle)
center = 100, 100


mainloop()

撰写回答