开发者

trying to rotate a triangle with complex numbers in tkinter python

the first method is mine, the other two are from here http://effbot.org/zone/tkinter-complex-canvas.htm

so i call the rotate method that calls the second one that calls the first one. the first one gets the xy coordinates from the angle that is passed, and then work with them to translate the triangle.

self.x and self.y are the coordinates on the canvas of the triangle, the middle of the lower line of the triangle

i guess there's anoth开发者_如何学Goer way to do this, much simpler.

and i have found this btw, but it doesn't really help

How do I rotate a polygon in python on a Tkinter Canvas?


Your post implied difficulty with understanding how to rotate triangles using complex numbers. After reading your comment in reply to my answer I have edited my code sample to demonstrate a way to get the angle from keyboard input. I have no experience with Tkinter so perhaps someone can help with a more state of the art approach. Gleaned from Tkinter: Events and Bindings and The Tkinter Entry Widget

When you enter the keypress event handler, the Entry widget's text, retrieved with text.get(), doesn't include the latest keypress character.

The angle entered is in degrees and can be negative.

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()


roitation of anything is best done by expressing every point (x,y) as a complex number x + iy Then Rotate each point by multiplying by the comples number cos(angle) + i sin(angle)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜