一、能够提供对话框窗口,输入三角形的顶点坐标;或者,采用鼠标左键单击方式输入三角形的顶点坐标。
二、对输入的三角形顶点坐标进行五种基本几何变换:
实现效果:
from tkinter import *
import tkinter as tk
import tkinter.simpledialog
import math
import matplotlib.pyplot as plt
import tkinter.messagebox
class CanvasDemo:
def __init__(self):
window=tk.Tk()
window.title("3")
window.geometry("500x250+500+300")
frame=Frame(window)
frame.pack()
menubar=Menu(window)
window.config(menu=menubar)
operationMenu=Menu(menubar,tearoff=0)
menubar.add_cascade(label="Operation",menu=operationMenu)
self.entry_x1 = Entry(frame)
self.entry_y1 = Entry(frame)
self.entry_x2 = Entry(frame)
self.entry_y2 = Entry(frame)
self.entry_x3 = Entry(frame)
self.entry_y3 = Entry(frame)
Label(frame, text="请输入第一个点的横坐标").grid(row=1, column=0)
Label(frame, text="请输入第一个点的纵坐标").grid(row=2, column=0)
Label(frame, text="请输入第二个点的横坐标").grid(row=3, column=0)
Label(frame, text="请输入第二个点的纵坐标").grid(row=4, column=0)
Label(frame, text="请输入第三个点的横坐标").grid(row=5, column=0)
Label(frame, text="请输入第三个点的横坐标").grid(row=6, column=0)
self.entry_x1.grid(row=1, column=1)
self.entry_y1.grid(row=2, column=1)
self.entry_x2.grid(row=3, column=1)
self.entry_y2.grid(row=4, column=1)
self.entry_x3.grid(row=5, column=1)
self.entry_y3.grid(row=6, column=1)
btSan=Button(frame,text="直接生成三角形",command=self.displaySan).grid(row=1,column=3,sticky=W)
btDrawSan=Button(frame,text="输入坐标生成",command=self.DrawSan).grid(row=2, column=3,sticky=W)
translate_button = Button(frame, text="平移", command=self.translate).grid(row=3,column=3,sticky=W)
rotate_button = Button(frame, text="旋转", command=self.rotate).grid(row=3,column=4,sticky=W)
scale_button = Button(frame, text="缩放", command=self.scale).grid(row=3, column=5,sticky=W)
shear_button = Button(frame, text="错切", command=self.shear).grid(row=3, column=6,sticky=W)
reflectx_button = Button(frame, text="关于x轴反射", command=self.reflectx).grid(row=4, column=3, sticky=W)
reflecty_button = Button(frame, text="关于y轴反射", command=self.reflecty).grid(row=5, column=3, sticky=W)
reflectxy_button = Button(frame, text="关于原点反射", command=self.reflectxy).grid(row=6, column=3, sticky=W)
operationMenu.add_command(label="关于x轴反射",command=self.reflectx)
operationMenu.add_command(label="关于y轴反射", command=self.reflecty)
operationMenu.add_command(label="关于原点反射", command=self.reflectxy)
window.mainloop()
def displaySan(self):
x = [5,8,5,5]
y = [5,5,9,5]
plt.plot(x, y)
plt.xlim(-20, 20)
plt.ylim(-20, 20)
plt.show()
def DrawSan(self):
try:
x1 = int(self.entry_x1.get())
y1 = int(self.entry_y1.get())
x2 = int(self.entry_x2.get())
y2 = int(self.entry_y2.get())
x3 = int(self.entry_x3.get())
y3 = int(self.entry_y3.get())
x=[x1,x2,x3,x1]
y=[y1,y2,y3,y1]
plt.plot(x,y)
plt.xlim(-20, 20)
plt.ylim(-20,20)
plt.show()
except ValueError:
tkinter.messagebox.showerror("错误","请输入有效数字")
def translate(self):
x = tk.simpledialog.askinteger("平移","请输入x方向的平移向量")
y = tk.simpledialog.askinteger("平移","请输入y方向的平移向量")
x1 = int(self.entry_x1.get())
y1 = int(self.entry_y1.get())
x2 = int(self.entry_x2.get())
y2 = int(self.entry_y2.get())
x3 = int(self.entry_x3.get())
y3 = int(self.entry_y3.get())
xc = [x1, x2, x3, x1]
yd = [y1, y2, y3, y1]
cx1=x1+x
cx2=x2+x
cx3=x3+x
cy1=y1+y
cy2=y2+y
cy3=y3+y
x_=[cx1,cx2,cx3,cx1]
y_=[cy1,cy2,cy3,cy1]
plt.plot(xc, yd)
plt.plot(x_,y_)
plt.xlim(-20, 20)
plt.ylim(-20, 20)
plt.show()
def rotate(self):
angle = tk.simpledialog.askinteger("旋转", "请输入旋转角度")
x1 = int(self.entry_x1.get())
y1 = int(self.entry_y1.get())
x2 = int(self.entry_x2.get())
y2 = int(self.entry_y2.get())
x3 = int(self.entry_x3.get())
y3 = int(self.entry_y3.get())
angle_rad = math.radians(angle)
cos_val = math.cos(angle_rad)
sin_val = math.sin(angle_rad)
new_x1 = x1 * cos_val - y1 * sin_val
new_y1 = x1 * sin_val + y1 * cos_val
new_x2 = x2 * cos_val - y2 * sin_val
new_y2 = x2 * sin_val + y2 * cos_val
new_x3 = x3 * cos_val - y3 * sin_val
new_y3 = x3 * sin_val + y3 * cos_val
x=[x1,x2,x3,x1]
y=[y1,y2,y3,y1]
xc=[new_x1,new_x2,new_x3,new_x1]
yd=[new_y1,new_y2,new_y3,new_y1]
plt.plot(xc, yd)
plt.plot(x,y)
plt.xlim(-20, 20)
plt.ylim(-20, 20)
plt.show()
def scale(self):
x_scale = tk.simpledialog.askfloat("缩放", "请输入x方向的缩放因子")
y_scale = tk.simpledialog.askfloat("缩放", "请输入y方向的缩放因子")
x1 = int(self.entry_x1.get())
y1 = int(self.entry_y1.get())
x2 = int(self.entry_x2.get())
y2 = int(self.entry_y2.get())
x3 = int(self.entry_x3.get())
y3 = int(self.entry_y3.get())
new_x1 = x1 * x_scale
new_y1 = y1 * y_scale
new_x2 = x2 * x_scale
new_y2 = y2 * y_scale
new_x3 = x3 * x_scale
new_y3 = y3 * y_scale
x = [x1, x2, x3, x1]
y = [y1, y2, y3, y1]
xc = [new_x1, new_x2, new_x3, new_x1]
yd = [new_y1, new_y2, new_y3, new_y1]
plt.plot(xc, yd)
plt.plot(x, y)
plt.xlim(-20, 20)
plt.ylim(-20, 20)
plt.show()
def shear(self):
shear_b = tk.simpledialog.askfloat("错切", "请输入x方向错切系数b")
shear_d = tk.simpledialog.askfloat("错切", "请输入y方向错切系数d")
x1 = int(self.entry_x1.get())
y1 = int(self.entry_y1.get())
x2 = int(self.entry_x2.get())
y2 = int(self.entry_y2.get())
x3 = int(self.entry_x3.get())
y3 = int(self.entry_y3.get())
new_x1 = x1 +shear_b*y1
new_y1 = y1 +shear_d*x1
new_x2 = x2 +shear_b*y2
new_y2 = y2 +shear_d*x2
new_x3 = x3 +shear_b*y3
new_y3 = y3 +shear_d*x3
x = [x1, x2, x3, x1]
y = [y1, y2, y3, y1]
xc = [new_x1, new_x2, new_x3, new_x1]
yd = [new_y1, new_y2, new_y3, new_y1]
plt.plot(xc, yd)
plt.plot(x, y)
plt.xlim(-20, 20)
plt.ylim(-20, 20)
plt.show()
def reflectx(self):
x1 = int(self.entry_x1.get())
y1 = int(self.entry_y1.get())
x2 = int(self.entry_x2.get())
y2 = int(self.entry_y2.get())
x3 = int(self.entry_x3.get())
y3 = int(self.entry_y3.get())
y1_reflect =-y1
y2_reflect =-y2
y3_reflect =-y3
x = [x1, x2, x3, x1]
y = [y1, y2, y3, y1]
xc = [x1, x2, x3, x1]
yd = [y1_reflect,y2_reflect,y3_reflect,y1_reflect]
plt.plot(xc, yd)
plt.plot(x, y)
plt.xlim(-20, 20)
plt.ylim(-20, 20)
plt.show()
def reflecty(self):
x1 = int(self.entry_x1.get())
y1 = int(self.entry_y1.get())
x2 = int(self.entry_x2.get())
y2 = int(self.entry_y2.get())
x3 = int(self.entry_x3.get())
y3 = int(self.entry_y3.get())
x1_reflect = -x1
x2_reflect = -x2
x3_reflect = -x3
x = [x1, x2, x3, x1]
y = [y1, y2, y3, y1]
xc = [x1_reflect,x2_reflect,x3_reflect,x1_reflect]
yd = [y1, y2, y3, y1]
plt.plot(xc, yd)
plt.plot(x, y)
plt.xlim(-20, 20)
plt.ylim(-20, 20)
plt.show()
def reflectxy(self):
x1 = int(self.entry_x1.get())
y1 = int(self.entry_y1.get())
x2 = int(self.entry_x2.get())
y2 = int(self.entry_y2.get())
x3 = int(self.entry_x3.get())
y3 = int(self.entry_y3.get())
x1_reflect = -x1
x2_reflect = -x2
x3_reflect = -x3
y1_reflect = -y1
y2_reflect = -y2
y3_reflect = -y3
x = [x1, x2, x3, x1]
y = [y1, y2, y3, y1]
xc = [x1_reflect,x2_reflect,x3_reflect,x1_reflect]
yd = [y1_reflect,y2_reflect,y3_reflect,y1_reflect]
plt.plot(xc, yd)
plt.plot(x, y)
plt.xlim(-20, 20)
plt.ylim(-20, 20)
plt.show()
CanvasDemo()