python之二维几何学习笔记

ops/2025/1/17 12:06:43/

一、概要

资料来源《机械工程师Python编程:入门、实战与进阶》安琪儿·索拉·奥尔巴塞塔 2024年6月

  • 点和向量:向量的缩放、范数、点乘、叉乘、旋转、平行、垂直、夹角
  • 直线和线段:线段中点、离线段最近的点、线段的交点、直线交点、线段的垂直平分线
  • 多边形:一般多边形、圆、矩形
  • 仿射变换

书中强调了单元测试的重要性。

二、点和向量

数字比较

python">import mathdef are_close_enough(a,b,tolerance=1e-10):return math.fabs(a-b)<tolerancedef is_close_to_zero(a,tolerance=1e-10):return are_close_enough(a,0.0,tolerance)def is_close_to_one(a,tolerance=1e-10):return are_close_enough(a,1.0,tolerance)

python">import mathfrom geom2d import nums
from geom2d.vector import Vectorclass Point:def __init__(self, x, y):self.x = xself.y = y# 计算两点间的距离def distance_to(self, other):delta_x = other.x - self.xdelta_y = other.y - self.yreturn math.sqrt(delta_x ** 2 + delta_y ** 2)# 对点进行加操作def __add__(self, other):return Point(self.x + other.x,self.y + other.y)# 对点进行减操作def __sub__(self, other):return Vector(self.x - other.x,self.y - other.y)# 用向量移动点def displaced(self, vector: Vector, times=1):scaled_vec = vector.scaled_by(times)return Point(self.x + scaled_vec.u,self.y + scaled_vec.v)# 比较点是否相等def __eq__(self, other):if self is other:return Trueif not isinstance(other, Point):return Falsereturn nums.are_close_enough(self.x, other.x) and \nums.are_close_enough(self.y, other.y)def __str__(self):return f'({self.x},{self.y})'

向量

python">import mathfrom geom2d import numsclass Vector:def __init__(self, u, v):self.u = uself.v = v# 向量的加法def __add__(self, other):return Vector(self.u+other.u,self.v+other.v)# 向量的减法def __sub__(self, other):return Vector(self.u-other.u,self.v-other.v)# 向量的缩放def scaled_by(self,factor):return Vector(factor*self.u,factor*self.v)# 计算向量的范数@propertydef norm(self):return math.sqrt(self.u**2+self.v**2)# 验证向量是否为单位向量@propertydef is_normal(self):return nums.is_close_to_one(self.norm)# 计算单位长度的向量def normalized(self):return self.scaled_by(1.0/self.norm)# 计算指定长度的向量def with_length(self,length):return self.normalized().scaled_by(length)# 向量点乘def dot(self,other):return (self.u*other.u)+(self.v*other.v)# 向量叉乘def cross(self,other):return (self.u*other.v)-(self.v*other.u)# 检验两向量是否平行,即叉乘是否为0def is_parallel_to(self,other):return nums.is_close_to_zero(self.cross(other))# 检验两向量是否垂直,即点乘是否为0def is_perpendicular_to(self,other):return nums.is_close_to_zero(self.dot(other))# 向量的夹角(角度值)def angle_value_to(self,other):dot_product=self.dot(other)  # 计算点乘值norm_product=self.norm*other.norm # 范数的乘积return math.acos(dot_product/norm_product) # (点乘值/范数乘积)取反余弦,即角度值# 向量的夹角(带叉乘符号的角度值)def angle_to(self,other):value=self.angle_value_to(other)cross_product=self.cross(other)return math.copysign(value,cross_product) #math.copysign(x, y)函数返回x的大小和y的符号# 向量的旋转,旋转一定角度def rotated_radians(self,radians):cos=math.cos(radians)sin=math.sin(radians)return Vector(self.u*cos-self.v*sin,self.u*sin+self.v*cos)# 垂直向量,旋转90度def perpendicular(self):return Vector(-self.v,self.u)# 相反向量,旋转180度def opposite(self):return Vector(-self.u,-self.v)# 向量的正旋和余弦@propertydef sine(self):return self.v/self.norm@propertydef cosine(self):return self.u/self.norm# 比较向量是否相等def __eq__(self, other):# 检查是否在比较相同的实例if self is other:return True# other不是Vector类的实例if not isinstance(other,Vector):return Falsereturn nums.are_close_enough(self.u,other.u) and \nums.are_close_enough(self.v,other.v)def __str__(self):return f'({self.u},{self.v}) with norm {self.norm}'

向量范数

向量的范数(norm)是指它的长度。单位范数的长度为一个单位。拥有单位范数的向量在确认向量方向时非常有用,因此,我们经常会想知道一个向量的范数是否为单位范数(它是否是单位向量)​。我们也经常需要归一化(normalize)一个向量:方向不变,长度变为1。

向量点乘

点乘(dot product)会得到一个标量,它可以反映两个向量方向的差异

图上有一个参考向量\vec{v}和另外三个向量:\vec{a}\vec{b}\vec{c}。一条垂直于\vec{v}的直线将空间分成两个半平面。向量\vec{b}在直线上,因此\vec{v}\vec{b}的夹角θ等于90°。而cos(90°)=0,因此\vec{v}\cdot\vec{b}=0。垂直向量的点乘为零。向量\vec{a}所在的半平面和\vec{v}相同,因此,\vec{v}\cdot\vec{a}> 0。最后,\vec{c}在与\vec{v}相对的半平面上,因此,\vec{v}\cdot\vec{c}< 0

向量叉乘

向量叉乘(cross product)会得到一个垂直于这两个向量所在平面的新向量。向量的顺序很重要,它决定了结果向量的方向。可以使用右手法则得到叉乘的方向。

叉乘不满足交换律:\vec{u}\times \vec{v}= - \vec{v}\times \vec{u}

二维向量叉乘的一个重要应用是确定角度的旋转方向\vec{u}\times \vec{v}> 0,因为从\vec{u}\vec{v}的角度为正(逆时针)​。相反,从\vec{v}\vec{u}的角度为负,因此叉乘\vec{v}\times \vec{u}< 0。最后,平行向量的叉乘为0,这很显然,因为sin 0=0。

向量旋转

cos(π/2)=0, sin(π/2)=1,cos(π)=-1, sin(π)=0

向量的正弦和余弦

三、直线和线段

四、多边形

一般多边形——用它们的顶点来定义;

圆是平面内与指定点(圆心)的距离(半径)相同的所有点的集合。因此,圆由圆心C的位置和半径R的值定义

矩形——由原点、宽度和高度定义

多边形中一个重要性质是质心(centroid),即所有顶点坐标的算术平均值。

五、仿射变换

仿射变换:它使我们能够通过缩放、旋转、平移和剪切来改变几何形状。

六、单元测试

断言方法

断言方法描述
assertAlmostEqual定义在我们引用的类unittest.TestCase中,用指定的公差来检查浮点数是否相等,公差用小数点后的位数表示,默认是7。请记住,在比较浮点数时,必须有公差,或者像上述例子,给定小数点后的位数
assertEqual使用==操作符来比较这两个参数
assertTrue检验给定表达式的计算结果是否为True
assertFalse检验给定表达式的计算结果是否为False

单元测试的三个规则

1、失败原因须唯一

单元测试应该有且仅有一个失败的原因。如果测试失败只有一个原因,那么很容易找到代码中的错误。如果一个测试失败可能有五个不同的原因。当测试失败时,你会发现自己花费太多时间去阅读错误消息和调试代码。

2、受控环境

测试的输入和输出应该是已知的。发生在测试中的一切都应该是确定的(deterministic),也就是说,不应该出现随机性或依赖任何你无法控制的东西:日期或时间、操作系统、未在测试中设置的机器环境变量,等等。

3、测试独立性

测试不应依赖于其他测试。每个测试都应该独立运行,绝不能依赖于其他测试所设置的运行测试的环境。这至少有三个原因。首先,你需要独立地运行或调试测试。其次,许多测试框架并不能保证测试的执行顺序。最后,不依赖于其他测试的测试要易读得多。


http://www.ppmy.cn/ops/150794.html

相关文章

Docker中编码和时区设置不生效问题排查

一、编码不生效排查 在 docker-compose.yml 中设置了环境变量&#xff0c;但进入 Docker 容器后 LANG 仍然显示为 zh_CN.UTF-8&#xff0c;按照以下步骤进行排查和修复&#xff1a; 1. 确保设置正确 确保你的 docker-compose.yml 文件中环境变量设置没有拼写错误&#xff0c;示…

【深度学习】Pytorch:自实现残差网络

ResNet&#xff08;残差网络&#xff09;是由何凯明等人在2015年发表的论文《深度残差学习用于图像识别》中提出的一种开创性深度学习架构。它在ILSVRC 2015分类任务中获胜&#xff0c;并解决了深度神经网络中的退化问题&#xff0c;使得训练数百甚至数千层的网络成为可能。 残…

Android 播放SMB共享视频

表面上看MediaPlayer只能播放本地和http协议视频。没有直接支持smb://协议。那还能播放smb视频呢&#xff1f;也可以的&#xff01; MediaPlayer有一个方法叫&#xff1a;setDataSource(MediaDataSource)。 /*** Sets the data source (MediaDataSource) to use.** param data…

Swift 专题二 语法速查

一 、变量 let, var 变量是可变的&#xff0c;使用 var 修饰&#xff0c;常量是不可变的&#xff0c;使用 let 修饰。类、结构体和枚举里的变量是属性。 var v1:String "hi" // 标注类型 var v2 "类型推导" let l1 "标题" // 常量class a {…

【设计模式-结构型】装饰器模式

一、什么是装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它的核心思想是在不改变原有对象结构的情况下&#xff0c;动态地给对象增加一些功能&#xff0c;从而达到扩展功能的目的。举个例子&#xff0c;今天在家妈妈给蒸馒…

python密码学列置换加密解密程序

1.置换密码 置换密码&#xff08;Permutation Cipher)又叫换位密码&#xff08;Transposi-tionCipher)&#xff0c;它根据一定的规则重新排列明文&#xff0c;以便打破明文的结构特性。置换密码的特点是保持明文的所有字符不变&#xff0c;只是利用置换打乱了明文字符的位置和次…

基于Verilog的简易音乐节奏游戏设计

基于Verilog的简易音乐节奏游戏设计 #### 一、设计目的 本实验旨在通过设计一个简易的音乐节奏游戏,让学生熟悉Verilog语言在FPGA设计中的应用,掌握时钟分频、状态机设计、按键扫描和音频输出等关键概念。 #### 二、设计原理 1. **时钟分频**:由于FPGA的工作频率通常较高…

Linux(Centos7)安装Mysql/Redis/MinIO

安装Mysql 安装Redis 搜索Redis最先版本所在的在线安装yum库 查看以上两个组件是否是开机自启 安装MinIO 开源的对象存储服务&#xff0c;存储非结构化数据&#xff0c;兼容亚马逊S3协议。 minio --help #查询命令帮助minio --server --help #查询--server帮助minio serve…