python之二维几何学习笔记
一、概要
资料来源《机械工程师Python编程:入门、实战与进阶》安琪儿·索拉·奥尔巴塞塔 2024年6月
- 点和向量:向量的缩放、范数、点乘、叉乘、旋转、平行、垂直、夹角
- 直线和线段:线段中点、离线段最近的点、线段的交点、直线交点、线段的垂直平分线
- 多边形:一般多边形、圆、矩形
- 仿射变换
书中强调了单元测试的重要性。
二、点和向量
数字比较
import math
def are_close_enough(a,b,tolerance=1e-10):
return math.fabs(a-b)<tolerance
def 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)
点
import math
from geom2d import nums
from geom2d.vector import Vector
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
# 计算两点间的距离
def distance_to(self, other):
delta_x = other.x - self.x
delta_y = other.y - self.y
return 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 True
if not isinstance(other, Point):
return False
return 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})'
向量
import math
from geom2d import nums
class Vector:
def __init__(self, u, v):
self.u = u
self.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)
# 计算向量的范数
@property
def norm(self):
return math.sqrt(self.u**2+self.v**2)
# 验证向量是否为单位向量
@property
def 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)
# 检验两向量是否平行,即叉乘是否为0
def is_parallel_to(self,other):
return nums.is_close_to_zero(self.cross(other))
# 检验两向量是否垂直,即点乘是否为0
def 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)
# 向量的正旋和余弦
@property
def sine(self):
return self.v/self.norm
@property
def 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 False
return 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)会得到一个标量,它可以反映两个向量方向的差异。
图上有一个参考向量和另外三个向量:、和。一条垂直于的直线将空间分成两个半平面。向量在直线上,因此和的夹角θ等于90°。而cos(90°)=0,因此。垂直向量的点乘为零。向量所在的半平面和相同,因此,。最后,在与相对的半平面上,因此,。
向量叉乘
向量叉乘(cross product)会得到一个垂直于这两个向量所在平面的新向量。向量的顺序很重要,它决定了结果向量的方向。可以使用右手法则得到叉乘的方向。
叉乘不满足交换律:
二维向量叉乘的一个重要应用是确定角度的旋转方向。,因为从到的角度为正(逆时针)。相反,从到的角度为负,因此叉乘。最后,平行向量的叉乘为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、测试独立性
测试不应依赖于其他测试。每个测试都应该独立运行,绝不能依赖于其他测试所设置的运行测试的环境。这至少有三个原因。首先,你需要独立地运行或调试测试。其次,许多测试框架并不能保证测试的执行顺序。最后,不依赖于其他测试的测试要易读得多。
原文地址:https://blog.csdn.net/jerry201108/article/details/145164592
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!