3D旋转后曲线长度不一致的原因排查
问题根源:旋转变换代码逻辑错误
你的曲线长度差异完全是因为3D转换时的变换公式写错了,根本不是旋转矩阵的拉伸问题——你写的变换根本不是旋转操作,而是错误的线性变换,直接导致坐标被不合理拉伸。
错误代码的核心问题
看你3D转换的这段代码:
xs = (x_max * math.cos(np.radians(DIR))) - (x_max * math.sin(np.radians(DIR))) ys = (x_max * math.sin(np.radians(DIR))) + (x_max* math.cos(np.radians(DIR)))
正确的2D平面旋转公式是针对每个(x,y)点,绕原点旋转θ角后的新坐标为:
x' = x * cosθ - y * sinθ y' = x * sinθ + y * cosθ
但你代码里把公式中的y_max全部替换成了x_max,相当于只对x坐标做了两次缩放组合,完全偏离了旋转的逻辑。这种错误变换会大幅拉伸坐标,自然会让曲线长度异常增大。
修正后的代码示例
根据你的需求,分两种常见场景修正:
- 把原始2D曲线(
x_max,y_max)旋转后映射到3D的XY平面(z轴为0):
DIR = 297.72642328058686 theta = np.radians(DIR) cos_theta = math.cos(theta) sin_theta = math.sin(theta) # 正确的2D旋转公式 xs = x_max * cos_theta - y_max * sin_theta ys = x_max * sin_theta + y_max * cos_theta zs = np.zeros_like(x_max) # 保持在XY平面,z设为0
- 把原始2D曲线的y坐标作为3D的z坐标,同时将x坐标旋转到XY平面:
DIR = 297.72642328058686 theta = np.radians(DIR) cos_theta = math.cos(theta) sin_theta = math.sin(theta) # x轴坐标旋转到XY平面,原始y作为z轴 xs = x_max * cos_theta ys = x_max * sin_theta zs = y_max
效果验证
旋转属于保距变换,修正后的代码计算出的曲线长度会和2D场景下的21.31左右完全一致。
内容的提问来源于stack exchange,提问作者Acqueux
相关产品推荐
相关产品推荐

