平面旋转与交线投影夹角计算

问题描述

在笛卡尔坐标系oxyz中,xoy平面上存在平面p1。将该平面绕y轴逆时针旋转β角度后得到平面p2,平面p2与xoz平面(y=0)的交线记为L。将p2依次绕L顺时针旋转α₁、α₂角度,得到新平面p3、p4。再将p4绕z轴旋转180°得到平面p5。需计算平面p3与p5的交线在xoy平面上的投影与x轴的夹角,并代入β=25°、α₁=10°、α₂=30°进行验证。

推导过程

步骤1:平面p1绕y轴旋转生成p2

  • 初始状态:平面p1为xoy平面(z=0),法向量为(0, 0, 1)
  • 旋转变换 :绕y轴逆时针旋转β后,法向量变为(-sinβ, 0, cosβ),平面方程为:
    sin ⁡ β ⋅ x − cos ⁡ β ⋅ z = 0 \sin\beta \cdot x - \cos\beta \cdot z = 0 sinβ⋅x−cosβ⋅z=0

步骤2:确定交线L

  • 几何特性:平面p2与xoz平面(y=0)相交,联立方程得交线L
  • 方向向量:由法向量叉乘计算,方向向量为(cosβ, 0, sinβ)

步骤3:绕L旋转生成p3、p4

  • 罗德里格斯旋转 :以L为轴顺时针旋转α₁、α₂角度后:
    • p3法向量:(-sinβcosα₁, sinα₁, cosβcosα₁)
    • p4法向量:(-sinβcosα₂, sinα₂, cosβcosα₂)

步骤4:生成平面p5

  • z轴旋转 :将p4绕z轴旋转180°,法向量变为:
    ( sin ⁡ β cos ⁡ α 2 , − sin ⁡ α 2 , cos ⁡ β cos ⁡ α 2 ) (\sin\beta\cosα₂, -\sinα₂, \cos\beta\cosα₂) (sinβcosα2,−sinα2,cosβcosα2)

步骤5:计算交线方向向量

  • 叉乘运算 :p3与p5的法向量叉乘得交线方向向量:
    v = ( cos ⁡ β sin ⁡ ( α 1 + α 2 ) , 2 sin ⁡ β cos ⁡ α 1 cos ⁡ α 2 , sin ⁡ β sin ⁡ ( α 2 − α 1 ) ) \mathbf{v} = \left( \cos\beta\sin(α₁+α₂),\ 2\sin\beta\cosα₁\cosα₂,\ \sin\beta\sin(α₂-α₁) \right) v=(cosβsin(α1+α2), 2sinβcosα1cosα2, sinβsin(α2−α1))

步骤6:投影与夹角计算

  • 投影处理 :保留x、y分量,投影方向向量为:
    v p r o j = ( cos ⁡ β sin ⁡ ( α 1 + α 2 ) , 2 sin ⁡ β cos ⁡ α 1 cos ⁡ α 2 ) \mathbf{v}_{proj} = \left( \cos\beta\sin(α₁+α₂),\ 2\sin\beta\cosα₁\cosα₂ \right) vproj=(cosβsin(α1+α2), 2sinβcosα1cosα2)
  • 正切公式
    tan ⁡ θ = 2 sin ⁡ β cos ⁡ α 1 cos ⁡ α 2 sin ⁡ ( α 1 + α 2 ) \tan\theta = \frac{2\sin\beta\cosα₁\cosα₂}{\sin(α₁+α₂)} tanθ=sin(α1+α2)2sinβcosα1cosα2

步骤7:数值计算验证

代入β=25°,α₁=10°,α₂=30°:
tan ⁡ θ = 2 sin ⁡ 25 ° cos ⁡ 10 ° cos ⁡ 30 ° sin ⁡ 40 ° ≈ 1.120    ⟹    θ ≈ 48.3 ° \tan\theta = \frac{2\sin25°\cos10°\cos30°}{\sin40°} \approx 1.120 \implies \theta \approx 48.3° tanθ=sin40°2sin25°cos10°cos30°≈1.120⟹θ≈48.3°

python推导

复制代码
import sympy as sp
from sympy import sin, cos, tan, atan2, pi, Matrix

# 定义符号变量
beta, alpha1, alpha2 = sp.symbols('beta alpha1 alpha2')

# 步骤1:平面p1绕y轴旋转得到平面p2的法向量
n_p2 = Matrix([-sin(beta), 0, cos(beta)])

# 步骤2:平面p2与xoz平面交线L的方向向量
dir_L = Matrix([cos(beta), 0, sin(beta)])

# 步骤3:平面p2绕直线L旋转得到平面p3和p4的法向量
# 罗德里格斯旋转公式
def rodrigues(v, k, theta):
    v_rot = v * cos(theta) + (k.cross(v)) * sin(theta) + k * (k.dot(v)) * (1 - cos(theta))
    return v_rot

k = dir_L / dir_L.norm()  # 单位旋转轴
n_p3 = rodrigues(n_p2, k, -alpha1)  # 顺时针旋转alpha1
n_p4 = rodrigues(n_p2, k, -alpha2)  # 顺时针旋转alpha2

# 步骤4:平面p4绕z轴旋转180°得到平面p5的法向量
R_z_180 = Matrix([[cos(pi), -sin(pi), 0],
                  [sin(pi), cos(pi), 0],
                  [0, 0, 1]])
n_p5 = R_z_180 * n_p4

# 步骤5:计算平面p3和p5的交线方向向量
dir_intersect = n_p3.cross(n_p5)

# 步骤6:投影到xoy平面并计算夹角
dir_project = Matrix([dir_intersect[0], dir_intersect[1], 0])
tan_theta = dir_project[1] / dir_project[0]
theta = atan2(dir_project[1], dir_project[0])

# 化简表达式
tan_theta_simplified = sp.simplify(tan_theta)
theta_simplified = sp.simplify(theta)

print("tan(theta) =", tan_theta_simplified)
print("theta =", theta_simplified)

输出:

python验证

复制代码
import sympy as sp
from sympy import sin, cos, atan2, pi, sqrt

# 定义符号变量
beta, alpha1, alpha2 = sp.symbols('beta alpha1 alpha2')

# 代入具体数值
beta_val = 25 * pi / 180  # 25度转换为弧度
alpha1_val = 10 * pi / 180  # 10度转换为弧度
alpha2_val = 30 * pi / 180  # 30度转换为弧度

# 计算tan(theta)
tan_theta = 2 * sqrt(sp.Abs(sin(beta))**2 + sp.Abs(cos(beta))**2) * sin(beta) * cos(alpha1) * cos(alpha2) / sin(alpha1 + alpha2)

# 计算theta
theta = atan2(2 * sin(beta) * cos(alpha1) * cos(alpha2) * cos(beta), sin(alpha1 + alpha2) * cos(beta) / sqrt(sp.Abs(sin(beta))**2 + sp.Abs(cos(beta))**2))

# 代入数值并计算
tan_theta_val = tan_theta.subs({beta: beta_val, alpha1: alpha1_val, alpha2: alpha2_val})
theta_val = theta.subs({beta: beta_val, alpha1: alpha1_val, alpha2: alpha2_val})

# 将theta从弧度转换为角度
theta_deg = sp.deg(theta_val)

print("tan(theta) =", tan_theta_val.evalf())
print("theta (弧度) =", theta_val.evalf())
print("theta (角度) =", theta_deg.evalf())

输出:

tan(theta) = 1.12148339835876

theta (弧度) = 0.842599117084027

theta (角度) = 48.277373230364

相关推荐
用户277844910499313 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
JavaEdge在掘金16 小时前
ssl.SSLCertVerificationError报错解决方案
python
我不会编程55516 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
CoderIsArt16 小时前
QT中已知4个坐标位置求倾斜平面与倾斜角度
qt·平面
满怀101517 小时前
Python入门(7):模块
python
无名之逆17 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
你觉得20517 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
啊喜拔牙17 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
__lost18 小时前
Pysides6 Python3.10 Qt 画一个时钟
python·qt