位置向量与法向量夹角计算结果异常的原因排查
问题分析与解决
错误根源
你的直觉判断有误:位置向量A的z分量为**-0.93**,意味着这个向量是从原点指向z轴负方向,而法向量Na是(0,0,1)(z轴正方向),两个向量方向相反,夹角必然大于90度,代码的计算结果是完全正确的。
你混淆了「点A的位置」和「位置向量的方向」:点A的z坐标为负只是说明它在z轴负半轴,但位置向量的定义是从原点指向该点,所以方向是朝向z负方向,和z正方向的法向量自然形成钝角。
手动验证计算
我们可以拆解计算过程确认结果:
- 位置向量的模长:
√((-51.85)² + (-2.38)² + (-0.93)²) ≈ 51.91 - 归一化后位置向量的z分量:
-0.93 / 51.91 ≈ -0.0179 - 与法向量(0,0,1)的点积等于该z分量,约为-0.0179
arccos(-0.0179) ≈ 1.588弧度,转换为角度约为91度,确实大于90度。
若你实际需求是计算「点A指向原点的向量」与法向量的夹角
如果你想得到小于90度的结果,应该计算从点A指向原点的向量(即位置向量的反向)与法向量的夹角,修正后的代码如下:
import numpy as np import math point_vector = np.array([-51.85,-2.38,-0.93]) # 取反得到从A指向原点的向量 vector_from_A_to_origin = -point_vector normalized_vector = vector_from_A_to_origin / np.linalg.norm(vector_from_A_to_origin) normal = np.array([0,0,1]) normalized_normal = normal / np.linalg.norm(normal) dot_product = np.dot(normalized_vector, normalized_normal) angle = np.arccos(dot_product) print("angle is:", angle*(180/math.pi)) # 结果约为89度,小于90度
内容的提问来源于stack exchange,提问作者Tariq Islam
相关产品推荐
相关产品推荐

