几何模型
点向直线&点向平面的表示方法
在解析几何计算中,大部分计算可以由点向直线转换为参数方程来解决
点向直线参数方程
已知直线上一点 $(x_0,y_0,z_0)$ 与方向向量 $v=(a,b,c)$
则参数方程为:
$$
f(x)=\begin{cases}
x=at+x_0\\
y=bt+y_0\\
z=ct+z_0
\end{cases}
$$
点向平面方程
已知平面上一点 $(x_0,y_0,z_0)$ 与平面法向量 $v=(a,b,c)$
则平面方程为:
$$
a(x-x_0)+b(y-y_0)+c(z-z_0)=0
$$
除此之外,平面方程可以由一些特定的平面旋转和平移得来
如:$xy$ 平面的方程为 $z=0$ 而绕 $y$ 旋转 $\alpha$ 后为 $z=xtan\alpha$
值得注意的是,方向向量一般可以通过画图构造几何关系来求解;
三维问题可以尝试画三视图,更利于思考
坐标变换
二维坐标变换
- 平移:即平移通过的定点 $(x_0,y_0)$ 即可
点直接平移;直线平移定点,方向向量不变
- 旋转:此时要利用旋转矩阵:
$$
\begin{bmatrix}
cos\theta&-sin\theta\\
sin\theta&cos\theta
\end{bmatrix}
$$
有
$$
(x_1,y_1)^T=\begin{bmatrix}
cos\theta&-sin\theta\\
sin\theta&cos\theta
\end{bmatrix}(x_0,y_0)^T
$$
点直接旋转,直线旋转方向向量
三维坐标变换
平移:同二维坐标变换
旋转:三维坐标的旋转要三个旋转矩阵,分别代表在三个坐标平面的旋转角度
$XY$ 旋转 $\alpha$ :
$$
R(z)=\begin{bmatrix}
cos\alpha&-sin\alpha&0\\
sin\alpha&cos\alpha&0\\
0&0&1
\end{bmatrix}
$$
$YZ$ 旋转 $\beta$ :
$$
R(x)=\begin{bmatrix}
cos\beta&0&-sin\beta\\
0&1&0\\
sin\beta&0&cos\beta
\end{bmatrix}
$$
$XZ$ 旋转 $\gamma$ :
$$
R(y)=\begin{bmatrix}
1&0&0\\
0&cos\gamma&-sin\gamma\\
0&sin\gamma&cos\gamma
\end{bmatrix}
$$
总旋转矩阵为:$R=R(x)R(y)R(z)$旋转后坐标:$(x_1,y_1,z_1)^T=R(x_0,y_0,z_0)^T$
Numpy向量计算
解析几何的问题以及其扩展都涉及多维计算,这时需要涉及向量计算
在使用前要引用库函数 import numpy as np
向量&矩阵属性的输出与基本运算
# 一维向量固定为列向量
np.array([1,2,3]) # 列向量
np.array([[1,2,3],[4,5,6],[7,8,9]]) # 矩阵
v=np.array()
# 维度
v.shape # 向量维度或者矩阵长宽
v.shape[0] # 行数
v.shape[1] # 列数
# 引索
v[i] # 第i+1行元素
v[i,j] # 第i+1行,第j+1列
# 切片
v[i1:i2] # 第i1+1行到第i2行的元素
v[i1:i2,j1:j2]# 第i1+1行到第i2行,第j1+1列到j2列的元素
# 加法
np.add(v1,v2)
# 点乘
np.dot(v1,v2)
v1@v2
# 数乘
n=10
n*v
# 转置
v.T
# 行列式计算,必须是方阵
linalg.det(v)
# 逆矩阵
linalg.pinv(v)
# 矩阵特征值与特征向量
# 对于矩阵A,若存在向量x满足 Ax=tx
# 则t为A特征值,x为A的特征向量
# 前一个参数为特征值,n阶方阵在复数域有n个特征值,
# 后一个为特征向量,每个特征值对应一个特征向量
eigenvalues, eigenvectors = np.linalg.eig(matrix)
# 范数计算
# 范数描述向量在空间种的大小
np.linalg.norm(vector)
坐标旋转
二维坐标旋转
def rotat2( a,p ):
# 设定旋转角度,这里我们以30度为例
theta = np.radians(a) # 将30度转换为弧度
# 创建旋转矩阵
rotation_matrix = np.array([
[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]
])
# 通过旋转矩阵变换这个点的坐标
return rotation_matrix.dot(p)
三维坐标旋转
# a为在Z轴旋转的角度
# b为在Y轴旋转的角度
# c为在X轴旋转的角度
# p为预旋转的向量
def rotat3( a,b,c,p ):
# 定义旋转角度(以弧度为单位)
alpha = np.radians(a) # 绕 Z 轴旋转
beta = np.radians(b) # 绕 Y 轴旋转
gamma = np.radians(c) # 绕 X 轴旋转
# 定义旋转矩阵
R_z = np.array([[np.cos(alpha), -np.sin(alpha), 0],
[np.sin(alpha), np.cos(alpha), 0],
[0, 0, 1]])
R_y = np.array([[np.cos(beta), 0, np.sin(beta)],
[0, 1, 0],
[-np.sin(beta), 0, np.cos(beta)]])
R_x = np.array([[1, 0, 0],
[0, np.cos(gamma), -np.sin(gamma)],
[0, np.sin(gamma), np.cos(gamma)]])
# 总旋转矩阵
R = R_z @ R_y @ R_x
# 计算旋转后的坐标
return R @ p
方程组计算
解析几何的大部分计算都涉及方程组计算
# a 数组记录方程左侧未知数的参数
# b 数组记录右侧方程的值
import numpy as np
a = np.array([[10, -1, -2], [-1, 10, -2], [-1, -1, 5]])
b = np.array([[72], [83], [42]])
c = np.linalg.solve(a, b)
print(c)
可以用于求解直线与直线相交,直线与平面相交等问题