Python实现图形的几何变换

news2024/11/24 12:43:48

一、能够提供对话框窗口,输入三角形的顶点坐标;或者,采用鼠标左键单击方式输入三角形的顶点坐标。

二、对输入的三角形顶点坐标进行五种基本几何变换:

  1. 对于平移变换,能够提供对话框窗口,输入平移向量;
  2. 对于旋转变换,能够提供对话框窗口,输入旋转角度,以逆时针为正;
  3. 对于缩放变换,能够提供对话框窗口,输入缩放因子;
  4. 对于错切变换,能够提供对话框窗口,输入错切系数;
  5. 对于反射变换,要求实现关于X轴、Y轴、原点的反射变换。

实现效果:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Openlayers 加载 Geoserver 图层以及切换图层样式

Openlayers 加载 Geoserver 图层以及切换图层样式 图层样式核心代码完整代码:在线示例 Openlayers 加载 Geoserver 图层,切换样式也是在项目中遇到的需求,现在介绍一下比较简单但是实用性一般的方法。 后期出一篇自由设置属性字段样式的博客…

Qt 自定义类时,手动添加 Q_OBJECT 出现错误

如图所示: 原因:没有自动生成 moc_ 文件。 可以去看一看自己项目文件里,我看了确实没有。 起因:创建类时 没有选择父类 或者 手动创建的 .h 和 .cpp 文件 解决办法: 1.最直接的:重新创建类,…

scrapy post请求——百度翻译(十四)

scrapy处理 post 请求 爬取百度翻译界面 目录 1.创建项目及爬虫文件 2.发送post请求 1.创建项目及爬虫文件 scrapy startproject scrapy_104 scrapy genspider translate fanyi.baidu.com 2.发送请求 post请求需要传递参数,所以就不能用start_urls和parse函数了&…

NSSCTF第16页(1)

[湖湘杯 2021 final]vote 是有附件,下载下来解压 在/vote-1637654763\www\routes下找到了源码 这道题的考点是 AST配合Pug模板引擎实现注入 有现成的payload p6.is 主要代码,需要满足if语句,从而可以执行compile语句 { "__proto__.hero":…

re:Invent 产品体验与感受分享:Amazon ElastiCache Serverless 缓存的即时扩展

授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在亚马逊云科技开发者社区、 知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道)。 文章目录 前言产品介绍产品使用步骤1.创建缓存服务2.安全组开放访问权限…

壹[1],函数:ReadImage

C形式 LIntExport void ReadImage( HObject* Image, const HTuple& FileName); //参数1:读取的Image //参数2:图片地址//备注说明: //头文件:halconcpp/HOperatorSet.h //命名空间:namespace HalconCpp C#形式 …

用Python画圣诞树!(附代码)

本文我们将用 Python 来画一棵圣诞树,效果如下图所示,先睹为快。 下面展开来看一下主要代码实现。 1.turtle库 turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点&#x…

如何使用Docker进行容器的备份和恢复

一 简介: 在使用Docker进行应用程序的容器化部署时,我们经常需要对容器进行备份和恢复操作。备份容器可以保证数据的安全性,而恢复操作可以帮助我们快速恢复出现问题的容器。本文将介绍如何使用Docker进行容器的备份和恢复,同时提…

C#科学绘图之scottPlot绘制多个图像

文章目录 示例移除图像图例信号图 scott系列:绘图初步 示例 从名字就能看出,ScottPlot的绘图函数AddScatter的作用是为图窗添加数据点,换言之,每调用一次AddScatter,就可以在图窗中添加一组图像。下面添加两个按钮&a…

动手学深度学习-自然语言处理-预训练

词嵌入模型 将单词映射到实向量的技术称为词嵌入。 为什么独热向量不能表达词之间的相似性? 自监督的word2vec。 word2vec将每个词映射到一个固定长度的向量,这些向量能更好的表达不同词之间的相似性和类比关系。 word2vec分为两类,两类…

UE4 UMG 颜色字体和PS对应关系

与PS中对应的是Hex sRGB色号 但是PS中采用的16进制色号为6位 UE4中的为8位 UMG制作时默认dpi为96像素/英寸,psd默认dpi是72像素/英寸。 在GUI设计时将dpi设为96,或者将72dpi下字体的字号乘以0.75,都能还原效果图中的效果。

【NTN 卫星通信】Starlink,卫星互联网的技术革命(一)

1. 什么是Starlink Starlink是由Elon Musk创立的私人太空探索公司SpaceX提供的卫星互联网服务。它旨在为世界上传统互联网服务速度慢或不可用的偏远地区提供价格合理的高速互联网。 为什么Starlink很重要?   Starlink之所以重要,是因为它有可能为数百万…

typescript 实现Optional

我们先看下面的这段代码,一个学生接口,里面有成员id,name,age,gender等等成员, 有一个方法graduate,里面要接受一个Student类型的实参 interface Student {id: numbername: stringage: numbergender: string}function graduate(Student: Student) {//...}现在有一个问题,就是学…

多地新能源公交换回燃油车,彻底撕下了新能源车低成本的遮羞布

随着近期多个城市的公交车从新能源客车换回燃油车,新能源汽车是否省钱的问题再次受到关注,而这些企业披露的数据显示出新能源客车并非如预期版那么低成本,并且在使用中遇到了许多麻烦的问题。 一、新能源公交确实有优势 首先是成本方面。确实…

探秘AI赋能的未来世界:CyberAI深度学习技术助力变革

CyberAI平台概述 随着AI技术的极速发展,AI能力正在助力产业加速场景化落地。CyberAI是数新网络面向开发者和企业的一站式AI数据科学平台,提供交互式和可视化建模服务,算法模型全生命周期管理。平台可帮助开发者快速开发AI应用,解…

GO的sql注入盲注脚本

之间学习了go的语法 这里就开始go的爬虫 与其说是爬虫 其实就是网站的访问如何实现 因为之前想通过go写sql注入盲注脚本 发现不是那么简单 这里开始研究一下 首先是请求网站 这里貌似很简单 package mainimport ("fmt""net/http" )func main() {res, …

C++类和对象(3)

目录 再谈构造函数 构造函数体赋值 初始化列表 【注意】 explicit关键字 Static成员 概念 特性 友元 友元函数 友元类 内部类 概念 特性: 匿名对象 拷贝对象时的一些编译器优化 再谈构造函数 构造函数体赋值 在创建对象时,编译…

Python新手必备:掌握os.path模块的8个神奇函数

在Python编程中,os.path模块是一个非常重要的模块,它提供了用于处理文件路径和目录的函数。这些函数可帮助你执行各种文件和目录操作,例如文件检查、路径拼接、目录创建等。 本文将介绍os.path模块中最常用的8个内置函数,并附带丰…

GitHub帐户管理更改电子邮件

登录到您的 GitHub 帐户: 前往 GitHub 网站并使用您的凭据登录。 访问个人设置: 单击右上角的您的头像,然后选择“Settings”(设置)。 选择电子邮件选项卡: 在左侧边栏中选择“Emails”(电子邮…

忘记了路由器的用户名和密码,怎么办?

注意:登录窗口会显示路由器型号,请务必确认是您自己路由器的界面。 解决方法 尝试输入登录密码 如果您的确忘了设置好的密码,就只能把路由器恢复出厂设置,没有超级密码。 恢复出厂前,不妨尝试输入可能的管理密码。一…