Python实现图形的几何变换

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

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

  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+xcx2=x2+xcx3=x3+xcy1=y1+ycy2=y2+ycy3=y3+yx_=[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_valnew_y1 = x1 * sin_val + y1 * cos_valnew_x2 = x2 * cos_val - y2 * sin_valnew_y2 = x2 * sin_val + y2 * cos_valnew_x3 = x3 * cos_val - y3 * sin_valnew_y3 = x3 * sin_val + y3 * cos_valx=[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_scalenew_y1 = y1 * y_scalenew_x2 = x2 * x_scalenew_y2 = y2 * y_scalenew_x3 = x3 * x_scalenew_y3 = y3 * y_scalex = [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*y1new_y1 = y1 +shear_d*x1new_x2 = x2 +shear_b*y2new_y2 = y2 +shear_d*x2new_x3 = x3 +shear_b*y3new_y3 = y3 +shear_d*x3x = [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 =-y1y2_reflect =-y2y3_reflect =-y3x = [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 = -x1x2_reflect = -x2x3_reflect = -x3x = [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 = -x1x2_reflect = -x2x3_reflect = -x3y1_reflect = -y1y2_reflect = -y2y3_reflect = -y3x = [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.mzph.cn/news/223342.shtml

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

相关文章

HashMap:理解Hash、底层实现与扩容机制

一、简单叙述 HashMap是Java中常用的一种数据结构,它以键值对的形式存储数据,具有高效的查找、插入和删除操作。本文将详细介绍HashMap的底层实现原理,包括哈希技术、底层数据结构和扩容机制,帮助读者深入理解HashMap的工作原理。…

Java IO 模型之 BIO、NIO、AIO 详解

目录 一. 前言 二. IO 模型 2.1. IO 模型分类 2.2. BIO、NIO、AIO 使用场景分析 2.3. NIO 和 BIO 的比较 三. BIO(同步阻塞) 3.1. BIO 编程流程 3.2. BIO 应用实例 3.3. 问题分析 四. NIO(同步非阻塞) 4.1. 基本介绍 …

Dubbo 3.x源码(13)—Dubbo服务发布导出源码(2)

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo 3.x源码(12)—Dubbo服务发布导出源码(1),也就是Dubbo服务发布导出的入口源码,现在我们继续学习,服务导出的核心方法doExportUrls的源码。 Dubbo 3.x…

一文读懂Java中的设计模式——单例模式!默认情况下,Spring的Bean就是单例的

单例模式概念 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例模式只应在有真正的“单一实例”的需求时才可使用。总结起来单例模式有三个优点: 全局访问共享资源:当需要在应用程序的多个地方共享和使用相…

跑代码中遇到的错误合集(持续更新)

1.TypeError: dropout(): argument ‘input‘ (position 1) must be Tensor, not str 原因:dropout函数接收到的参数是一个字典类型(需手动设置其不要返回字典类型) 解决步骤: 1.根据代码定位到dropout函数 2.定位到函数中的参数 3.对给dropout函数参数赋值的函数的…

[渗透测试学习] Sau - HackTheBox

首先是信息搜集,nmap扫一下 nmap -sV -sC -p- -v 10.10.11.224 发现存在两个端口,55555端口有http服务,访问一下 获得线索request-baskets版本为1.2.1,搜索发现存在漏洞 那么我们试试构造ssrf,create的时候bp抓包 构…

定时器TIM HAL库+cubeMX(上)

定时器时钟源APB1 36MHz 一.基本定时器 1.基本框图 2.溢出时间计算 3.配置定时器步骤 TIM_HandleTypeDef g_timx_handle;/* 定时器中断初始化函数 */ void btim_timx_int_init(uint16_t arr, uint16_t psc) {g_timx_handle.Instance TIM6;g_timx_handle.Init.Prescaler p…

【数据安全】金融行业数据安全保障措施汇总

数字化的今天,数据的价值不可估量,尤其是金融行业,数据不仅代表着企业的核心资产,还涉及到客户的隐私和信任。因此对于金融行业而言,保障数据安全至关重要。下面我们就来一起讨论为什么金融行业要保障数据安全&#xf…

Idea执行bat使用maven打包springboot项目成docker镜像并push到Harbor

如果执行以下命令失败,先把mvn的-q参数去掉,让错误输出到控制台。 《idea配置优化、Maven配置镜像、并行构建加速打包、解决maven打包时偶尔几个文件没权限的问题》下面的使用company-repo私有仓库和阿里云镜像仓库同时使用的配置参考。 bat echo off …

要实现长页面滑动到指定位置触发动画效果(亲测有效)

1.添加触发动画的元素&#xff1a;在你的 HTML 文件中&#xff0c;将需要触发动画的元素添加相应的类名<div class"animation"> <p>安全工矿 智能工矿 安全工矿 智能工矿</p> </div> 给一个 <div> 元素添加 .animation…

JVM 详解(JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路)

目录 JVM 详解&#xff08;JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路&#xff09;1、概念&#xff1a;什么是 JVM ?JVM 的作用&#xff1f; 2、JVM 的主要组成部分&#xff1f;类加载器&#xff08;Class Loader&#xff09;&#xff1a;简单…

02基于matlab的卡尔曼滤波

基于matlab的卡尔曼滤波&#xff0c;可更改状态转移方程&#xff0c;控制输入&#xff0c;观测方程&#xff0c;设置生成的信号的噪声标准差&#xff0c;设置状态转移方差Q和观测方差R等参数&#xff0c;程序已调通&#xff0c;需要直接拍下。

Vue学习计划-Vue2--VueCLi(五)全局事件总线、消息订阅与发布(pubsub)

抛出问题:我们多级组件&#xff0c;或者任意不想关的子组件如何传递数据呢&#xff1f; 1. 全局事件总线&#xff08;$bus&#xff09; 一种组件间通信的方式&#xff0c;适用于任意组件间通信 全局事件总线示意图&#xff1a; 安装全局事件总线&#xff1a; new Vue({..…

数据结构和算法-图的基本概念及邻接矩阵法和邻接表法和十字链表法和链表链表法

文章目录 图的概念总览图的定义图逻辑结构的应用无向图和有向图简单图和多重图顶点的度&#xff0c;入读&#xff0c;出度顶点-顶点的关系描述连通图&#xff0c;强连通图研究图的局部-子图无向图有向图 连通分量强连通分量生成树生成森林边的权&#xff0c;带权图/网几种特殊形…

虚幻学习笔记15—C++和UI(一)

一、前言 在C可以直接创建按钮、滚轮等UI&#xff0c;并且可以直接绑定并处理响应事件。在创建C代码后还是需要通过蓝图来显示到应用中&#xff0c;总体来说还是不如直接用蓝图来的方便。 本文使用的虚幻引擎为5.2.1。 二、实现 2.1、创建UUserWidgetl类型的C类 声明两个按钮…

uniCloud(一) 新建项目、初始化服务空间、云对象访问测试

一、新建一个带有unicloud 二、创建一个服务空间 1. 右键uniCloud&#xff0c;关联云服务空间 我当前没有服务空间&#xff0c;需要新建一个服务空间&#xff0c;之后将其关联。初始化服务空间需要的时间有点长 服务空间初始化成功后&#xff0c;刷新HBuilder&#xff0c;勾选…

Linux系统下CPU性能问题分析案例

&#xff08;上&#xff09; 本文涉及案例来自于学习极客时间专栏《Linux性能优化实战》精心整理而来&#xff0c;案例总结不到位的请各位多多指正。 某个应用的CPU使用率居然达到100%&#xff0c;我该怎么办&#xff1f; 分析过程 使用观察系统CPU使用情况&#xff08;并按下…

03. 医院设置_后端

1、Swagger2 测试工具 编写和维护接口文档是每个程序员的职责&#xff0c;根据Swagger2可以快速帮助我们编写最新的API接口文档&#xff0c;再也不用担心开会前仍忙于整理各种资料了&#xff0c;间接提升了团队开发的沟通效率。 swagger通过注解表明该接口会生成文档&#xf…

vuepress-----25、右侧目录

# 25、vuepress 右侧目录 https://github.com/xuek9900/vuepress-plugin-right-anchor vuepress-plugin-right-anchor English &#xff5c;中文 在用 Vuepress 2.x 编写的文档页面右侧添加 锚点导航栏 # 版本 2.x.x -> Vuepress 2.x -> npm next -> master 分支0…

PS扣印章

1 印章区域图片 2 3 吸取印章上的颜色&#xff0c;调节容差&#xff0c;尽量小一点&#xff0c;过大会将背景也进来 4 CtrlJ 把选区复制出来&#xff0c;这个印章图层比较淡&#xff0c;可以通过多复制几个叠加或通过叠加模式来调节。 5 对几个图层选中后CtrlE合并图层 6 选…