二维平面扭曲的python实现及思路

二维平面扭曲的python实现及思路

  • 缘起
  • 原理
  • 实现
  • 代码

缘起

工作需要,需要一个尝试改变设备布点的方法,在csdn闲逛时,偶然间发现这样的一篇文章 二维扭曲,参考这位博主的文章,我对其内容进行复现和进一步挖掘。若有侵权或被侵权,请及时联系我。
在这里插入图片描述

原理

基本原理见文章 二维扭曲,核心公式就是
X 1 ′ = X 0 + O D × cos ⁡ ( θ ′ ) Y 1 ′ = Y 0 + O D × sin ⁡ ( θ ′ ) X_1'= X_0+ OD×\cos(θ')\\ Y_1'= Y_0+ OD×\sin(θ') X1=X0+OD×cos(θ)Y1=Y0+OD×sin(θ)
其中,
O D = ( X 1 − X 0 ) 2 + ( Y 1 − Y 0 ) 2 ,也即该点到中心的距离 OD=\sqrt{(X_1-X_0)^2 +(Y_1-Y_0)^2},也即该点到中心的距离 OD=(X1X0)2+(Y1Y0)2 ,也即该点到中心的距离

θ ′ = f ( θ , O D ) , 也即是与原来的角度、距离有关的一个函数 \theta' = f(\theta, OD) ,也即是与原来的角度、距离有关的一个函数 θ=f(θ,OD),也即是与原来的角度、距离有关的一个函数
可以看到最令人迷惑的地方在于 f 究竟要怎么取?
这就是一个很有意思的地方了,像上面那幅图,可以观察到 点越远离旋转中心,它的扭曲程度就越大。这句话可以理解为 点越远离旋转中心, θ ′ \theta' θ θ \theta θ 的相异程度越大,远离可简单由OD作为评判标准,因此,我们可以构造一个随着 OD变大,、 θ ′ \theta' θ变化越大的这样一个f
θ ′ = f ( θ , O D ) = θ + k ∗ O D , ( k > 0 ) \theta' = f(\theta, OD) =\theta + k * OD,~~~~(k > 0) θ=f(θ,OD)=θ+kOD,    (k>0)

实现

我们使用的工具是 matplotlib 下 pyplot,先把原来的大三角形画出来

再通过for循环观察到:随着k增大,扭曲程度越来越大
在这里插入图片描述

代码

from matplotlib import pyplot as plt
from copy import deepcopy
import mathdef triangle_struct(layer=8, length=1):fig = plt.figure()x = list()y = list()height = length * (3 ** 0.5) / 2top_height = height * (layer + 1) // 2x.append([0])y.append(top_height)for i in range(1, layer):tmp = list()for j in x[-1]:tmp.append(j - length / 2)tmp.append(x[-1][-1] + length / 2)x.append(tmp)top_height -= heighty.append(top_height)# print(x_axis)# print(y_axis)return [x, y]def plot(x, y, row, col, num, fig):layer = len(y)axis = fig.add_subplot(row, col, num)for i in range(1, layer):for j in range(i):plt.plot([x[i - 1][j], x[i][j], x[i][j + 1], x[i - 1][j]],[y[i - 1], y[i], y[i], y[i - 1]])def plot3(x, y, row, col, num, fig):layer = len(y)axis = fig.add_subplot(row, col, num)for i in range(1, layer):for j in range(i):axis.plot([x[i - 1][j], x[i][j], x[i][j + 1], x[i - 1][j]],[y[i - 1][j], y[i][j], y[i][j + 1], y[i - 1][j]])def distort(x_list, y_list, k=1):g = lambda theta, distance, k: theta + 0.02 * k * distancenew_x = deepcopy(x_list)new_y = deepcopy(x_list)for index in range(len(x_list)):y = y_list[index]for j in range(index + 1):angle, distance = get_polar_para(x_list[index][j], y)new_x[index][j] = distance * math.cos(g(angle, distance, k))new_y[index][j] = distance * math.sin(g(angle, distance, k))return [new_x, new_y]x_axis, y_axis = triangle_struct(layer=10)
fig = plt.figure(num=1, figsize=(18, 10))
plot(x_axis, y_axis, 4, 4, 1, fig)
for i in range(2, 17):_x, _y = distort(x_axis, y_axis, k=i)plot3(_x, _y, 4, 4, i, fig)plt.show()

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

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

相关文章

四川玖璨电子商务有限公司抖音电商界的领跑者

在当今的电商市场中,四川玖璨电子商务有限公司以其卓越的表现和领先的地位,被广大消费者和业内人士所认可。作为抖音电商领跑者,该公司以其精湛的产品和服务,创新的营销策略,及客户至上的理念,成为这个充满…

爬取北京新发地当天货物信息并展示十五天价格变化(三)---获取物品十五天内的价格

。。。。。。。。。。。。。。。。。。。。。。 1.网页请求一下内容2.通过爬虫进行请求3.获取商品十五天详细数据并绘制折线图4.项目详细代码 1.网页请求一下内容 通过抓包我们发现一共七个参数 limit: 20 # 一页多少数据 current: …

JPA的注解@Field指定为Keyword失败,导致查询不到数据

一、背景 使用 jpa 对es操作,查询条件不生效,需求是批量查询课程编号。说白了,就是一个In集合的查询。在es里,如果是精准匹配是termQuery,比如: queryBuilder.filter(QueryBuilders.termQuery(“schoolId…

C++ placement new使用

placement new重载来原来的operator new,且placement new不能被即需重载 placement new是在原有的一块地址上继续创建一个对象,注意对象类型要一致,这样的操作的优势有两个: 1、不用花时间在找合适的空间存放新对象,…

华为云云耀云服务器L实例评测|使用华为云耀云服务器L实例的CentOS部署Docker并运行Tomcat应用

目录 前言 步骤1:登录到华为云耀云服务器L实例 步骤2:安装Docker 并验证Docker安装 步骤3:拉取Tomcat镜像并运行Tomcat容器 步骤4:放行8080端口 步骤5:访问tomcat 步骤6:管理Tomcat容器 小结 前言 …

【QT+CUDA】QT中使用cuda,QT+VS+cuda下载安装配置

文章目录 相关网址汇总: 一、软件安装:VS、CUDA、QT1 安装VS1.1 下载1.2 vs2017安装1.3 vs2015安装 2 安装CUDA2.1 下载2.2 安装2.3 测试2.4 卸载 3 安装QT3.1 下载3.2 安装 二、QT使用cuda1 .pro文件 三、常用操作1 NVIDIA控制面板:显卡、驱…

数据分析技能点-正态分布和其他变量分布

在数据驱动的世界里,了解和解释数据分布是至关重要的。不同类型的数据分布,如正态分布、二项分布和泊松分布,具有不同的特性和应用场景。这些分布不仅在统计学和数据科学中有广泛应用,而且在日常生活和商业决策中也起着关键作用。 文章目录 正态分布正态分布和偏差其他常见…

如何快速搭建一个react项目?如何使用react脚手架快速搭建项目?

如何使用react脚手架快速搭建项目? 一、前提 电脑已经安装了node和npm环境。 react文档中要求Node > 8.10 和 npm > 5.6,查看版本:node -v;npm -v; 二、步骤 1、在合适的文件夹中打开命令行窗口cmd 2、全局安…

【设计模式】六、建造者模式

文章目录 需求介绍角色应用实例建造者模式在 JDK 的应用和源码分析java.lang.StringBuilder 中的建造者模式 建造者模式的注意事项和细节 需求 需要建房子:这一过程为打桩、砌墙、封顶房子有各种各样的,比如普通房,高楼,别墅&…

C语言进阶---动态内存管理

动态内存管理 前言:一、为什么存在动态内存分配?二、动态内存函数的介绍1.数据在不同区域的储存:2、malloc和free3、calloc4、realloc 三、常见的动态内存错误1、对NULL指针的解引用操作2、对动态开辟空间的越界访问3、对非动态内存开辟的空间…

C# 集合

C# 集合 集合集合接口和类型列表队列栈链表有序表字典LoopupHashSet位数组 集合 数组的大小是固定的。如果元素个数是动态的,就应使用集合类。List 和 ArrayList 是与数组相当的集合类。还有其他类型的集合:队列、栈、链表和字典。 集合接口和类型 集…

无线振弦采集仪在岩土工程安全监测中优化成本支出

无线振弦采集仪在岩土工程安全监测中优化成本支出 随着城市的快速发展以及建筑业的不断壮大,岩土工程的安全监测变得越来越重要。在岩土工程中,振弦是一种重要的监测手段,可以有效地评估土体的力学性质和变形情况。因此,无线振弦…

一文了解VR全景在城市园区和电子楼书的应用

引言: 虚拟现实(VR)技术在日常生活中越发普及,已经成为众多行业的宣传工具,房地产行业近些年来热度较低,VR全景为房地产展示带来了新方式,为购房者提供更真实、更直观的体验。 一.…

康耐视visionpro脚本CogRectangleAffine ,CogPolygon图形限定框,边界显示(划痕缺陷案例分享)

目录 1.划痕缺陷整体方案设计:2.测试一效果图:3.测试一脚本编写​:4.测试二效果图:5.测试二脚本编写:6.测试三效果图:7.​测试三脚本编写:测试版本:康耐视visionpro9.0 1.划痕缺陷整体方案设计: 2.测试一效果图: 3.测试一脚本编写​: CogRectangleAffine Rectangle…

Spring Boot 如何使用Liquibase 进行数据库迁移

在现代的应用程序开发中,数据库迁移是一个不可或缺的环节。它使开发人员能够有效地管理数据库模式的变化,确保应用程序与数据库之间的一致性。Liquibase 是一个流行的开源工具,用于管理数据库的版本控制和迁移。本文将介绍如何在Spring Boot应…

网络安全攻防:软件逆向之反汇编

网络安全是当今社会中一个非常重要的问题,而软件逆向工程是网络安全攻防中常用的一种技术手段。在软件逆向工程中,反汇编是一种基础而重要的技术。通过反汇编,我们可以将二进制程序转换为汇编语言,从而更好地理解程序的执行流程和…

go语言 rune 类型

ASCII 码只需要 7 bit 就能完整地表示,但只能表示英文字母在内的 128 个字符,为了表示世界上大部分的文字系统,发明了 Unicode ,它是 ASCII 的超集,包含世界上书写系统中存在的所有字符,并且为每个代码分配…

mysql事务测试

mysql的事务处理主要有两种方法1、用begin,rollback,commit来实现 begin; -- 开始一个事务 rollback; -- 事务回滚 commit; -- 事务提交 2、直接用set来改变mysql的自动提交模式 mysql默认是自动提交的,也就是你提交一个sql,它就直接执行!我…

react import爆红

如上所示,会标红, 解决办法:在vscode内部SHiftCtrlP 输入Reload window, 如上的第一个,选中后回车,标红就没了,非常好用。

为您的视频编辑应用添加动力,美摄视频剪辑SDK

在当今的数字化时代,视频已经成为了最受欢迎的媒体形式之一。无论是社交媒体平台,还是在线教学站点,甚至是商业广告,都离不开视频的支持。而在这个领域,美摄视频剪辑SDK无疑是您的最佳选择。它不仅功能强大&#xff0c…