几何模型


几何模型


点向直线&点向平面的表示方法

在解析几何计算中,大部分计算可以由点向直线转换为参数方程来解决

点向直线参数方程

已知直线上一点 $(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)

可以用于求解直线与直线相交,直线与平面相交等问题


文章作者: Paramec1um
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Paramec1um !
评论
  目录