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

news2024/11/17 9:52:38

二维平面扭曲的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 math

def triangle_struct(layer=8, length=1):
    fig = plt.figure()
    x = list()
    y = list()
    height = length * (3 ** 0.5) / 2
    top_height = height * (layer + 1) // 2

    x.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 -= height
        y.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 * distance
    new_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.coloradmin.cn/o/1047431.html

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

相关文章

基于STM32+OneNet设计的GPS定位器(ESP8266)

一、 设计说明 随着移动互联网和物联网技术的快速发展,越来越多的智能设备被广泛应用于各个领域。其中,GPS定位器是一种常见的智能设备,可以用于车辆、家庭、宠物等物品的实时定位。在实际使用中,GPS定位器需要具有实时上传位置数据、低功耗、精度高等特点。 当前提出了一…

Ctfshow web入门 代码审计篇 web301-web310 详细题解 全

CTFshow 代码审计 web301 下载的附件的目录结构如下: 开题后界面,看见输入框,感觉是sql。 大概浏览一遍源码,我们可以发现在checklogin.php文件中有无过滤的SQL语句,SQL注入没得跑了。 这题SQL注入有三种做法。 方法一…

java进阶-Netty

Netty 在此非常感谢尚硅谷学院以及韩顺平老师在B站公开课 Netty视频教程 Netty demo代码文件 I/O 说NIO之前先说一下BIO(Blocking IO),如何理解这个Blocking呢?客户端监听(Listen)时,Accept是阻塞的&…

游戏模板:MFPS 2.0: Multiplayer FPS

MFPS 2.0: Multiplayer FPS Most complete multiplayer first-person shooter kit. 可编程渲染管线(SRP)兼容性 Unity可编程渲染管线(SRP)是让您能够通过C#脚本控制渲染的一个功能。SRP是支撑通用渲染管线(URP&#…

紫光同创FPGA图像视频采集系统,基于OV7725实现,提供工程源码和技术支持

目录 1、前言免责声明 2、设计思路框架视频源选择OV7725摄像头配置及采集动态彩条HDMA图像缓存输入输出视频HDMA缓冲FIFOHDMA控制模块HDMI输出 3、PDS工程详解4、上板调试验证并演示准备工作静态演示动态演示 5、福利:工程源码获取 紫光同创FPGA图像视频采集系统&am…

全球性区块链服务网络(BSN)机制体系、关键技术和应用项目科技成果鉴定会在北京举行

原标题:《全球性区块链服务网络(BSN)机制体系、关键技术和应用项目科技成果鉴定会在北京举行》 2023年9月17日,“全球性区块链服务网络(BSN)机制体系、关键技术和应用”科技成果鉴定会在北京举行。鉴定委员…

[FineReport]安装与使用(连接Hive3.1.2)

一、安装(对应hive3.1.2) 注:服务器的和本地的要同时安装。本地是测试环境,服务器的是生产环境 1、服务器安装 1、下载 免费下载FineReport - FineReport报表官网 向下滑找到 2、解压 [rootck1 /home/data_warehouse/software]# tar -zxvf tomcat…

十四,间接漫反射用到球体中

间接光照分为间接漫反射和间接镜面反射。 辐照度图是用来适用于间接漫反射的。 直射光也有漫反射,对比下两者。 直接光kD * albedo / PI * radiance * NdotL;其中radiance * NdotL是光照, 间接光: kD * texture(irradianceMap, N).rgb* al…

Linux -- 进程间通信之匿名管道

博客中涉及代码已全部上传至Gitee,有需要请自行下载 目录 前言通信基础管道 匿名管道第一步:创建管道第二步:创建子进程第三步:开始通信第四步:结束通信 匿名管道通信代码实现四种特殊情景 基于匿名管道的多进程控制对…

【Linux】Linux进程控制

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【Linux】…

Latex写论文时图的设置

我们在写论文,使用官方Latex模板可能经常遇到这种情况: 图和文字间距太大,这是因为排版时图片插入到了一个段的中间导致的。 解决方法是(注意控制字符\vspace一定要放在引用图的代码块里面): \begin{figu…

浅谈电气防火保护器在地下商场的应用

摘 要:近年来,我国城市发展速度加速。很多城市大力建造地下建筑设施,比如地铁、地下停车场和地下商场等。地下商场属于人员密集型建筑,其防火设计一直令相关的专家头疼。由于人员密集,防火处理不好将酿成灾难性的后果。…

【数据结构与算法】 - 时间复杂度和空间复杂度、二分查找、线性查找

数据结构与算法 1. 数据结构的定义2. 二分查找2.1 二分查找的定义2.2 二分查找分析2.3 二分查找实现2.4 二分查找算法图解2.5 二分算法引发的问题2.6 二分算法改良版2.7 二分算法改良版解析2.8 二分算法改良版图解2.9 二分算法改良版注意事项 3. 时间复杂度3.1 时间复杂度的概念…

数据计算-第15届蓝桥杯第一次STEMA测评Scratch真题精选

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第154讲。 第15届蓝桥杯第1次STEMA测评已于2023年8月20日落下帷幕,编程题一共有6题,分别如下&a…

ThreeJS-3D教学二:基础形状展示

three中提供了22 个基础模型,此案例除了 EdgesGeometry、ExtrudeGeometry、TextGeometry、WireframeGeometry,涵盖 17 个形状。 Fog 雾化设置,这是scene场景效果EdgesGeometry , WireframeGeometry 更多地可能作为辅助功能去查看几何体的边和…

修炼k8s+flink+hdfs+dlink(一:安装flink)

一:standalone的ha环境部署。 创建目录,上传安装包。 mkdir /opt/app/flink 上传安装包到本目录。 tar -zxvf flink-1.13.6-bin-scala_2.12.tgz配置参数。 在flink-conf.yaml中添加zookeeper配置 jobmanager.rpc.address: node01 high-availability: …

论文浅尝 | INGRAM:通过关系图的归纳知识图谱嵌入

笔记整理:郭荣辉,天津大学硕士 链接:https://arxiv.org/abs/2305.19987 动机 归纳知识图谱补全是预测训练期间没有观察到的新实体之间缺失的三元组的任务。虽然大多数归纳知识图谱补全方法假定所有实体都是新的,但它们不允许在推理…

【c语言的malloc函数介绍】

malloc&#xff08;memory allocation的缩写&#xff09;是C语言中的一个函数&#xff0c;用于动态分配内存空间。这个函数允许你在程序运行时请求指定大小的内存块&#xff0c;以供后续使用。malloc函数属于标准库函数&#xff0c;需要包含头文件#include <stdlib.h> 才…

使用Vue、ElementUI实现登录注册,配置axios全局设置,解决CORS跨域问题

目录 引言 什么是ElementUI&#xff1f; 步骤1&#xff1a;创建Vue组件用于用户登录和注册 1. 基于SPA项目完成登录注册 在SPA项目中添加elementui依赖 在main.js中添加elementui模块 创建用户登录注册组件 配置路由 修改项目端口并启动项目 静态页面展示图 步骤2&#x…

搭建qml box2d开发环境

box2d是开源的优秀物理引擎 box2d官网 https://box2d.org/ qml box2d插件工程 https://gitee.com/gao_yao_yao/qml-box2d 1. qml box2d插件工程 下载&#xff0c;解压qml-box2d-master.zip&#xff0c;用qt打开box2d.pro&#xff0c;编译Debug|Release拷贝Box2D.dll|Box2Dd.…