微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将平面转换为 XY 平面

如何解决将平面转换为 XY 平面

我试图找到转换矩阵,这将允许我将给定的平面转移到 XY 平面。基于此 answer,我准备了执行这些计算的小型 Python 函数。但是我不明白为什么最终平面不在 XY 中。 你能帮我告诉我我做错了什么吗?

我的输入平面 (3d view):

390.17 * x + -571.67 * y + -4008.29 * z + 2833797.03 = 0
input = [390.17,-571.67,-4008.29,2833797.03]
z = 0.0973*x - 0.1427*y + 706.9838 

在我看来,要将其转移到 XY 平面,应该(首先)完成围绕 X 和 Y 轴的旋转。最后一个元素是沿 Z 轴的平移。

基于此 answer,我准备了我的函数 transform_plane()。 (代码如下)。

结果函数返回新平面:(3d view)

2.19436115e+00  1.61044899e+03  4.06772244e+03 -4.20201320e+04 = 0
out = [2.19436115e+00,1.61044899e+03,4.06772244e+03,-4.20201320e+04]
Z = -0.0005*x-0.3959*y+10.3301

看起来,平面只围绕 Y 旋转,为了与 XY 对齐,它还应该围绕 X 轴旋转。 这是否意味着我忘记了某事?或链接答案中提供的矩阵不足以对两个不同的轴进行转换?

编辑: 感谢下面的回答,我能够找到丢失的平方根,但是我仍然不明白为什么我的翻译不够。 我的结果不是 Z = 0,而是 Z = 10。在我看来,也许 -d/c 也应该除以平方根。

我的实现:

import numpy as np

def calc_cos_phi(a,b,c):
    return c / sqrt(a*a + b*b + c*c)


def calc_sin_phi(a,c):
    return sqrt((a*a + b*b) / (a*a + b*b + c*c))


def calc_u1(a,c):
    return b / (a*a + b*b)


def calc_u2(a,c):
    return -a / sqrt(a*a + b*b)


def get_transform_matrix(plane):
    a,c,d = plane
    cos_phi = calc_cos_phi(a,c)
    sin_phi = calc_sin_phi(a,c)
    u1 = calc_u1(a,c)
    u2 = calc_u2(a,c)
    out = np.array([
        [cos_phi + u1 * u1 * (1 - cos_phi),u1 * u2 * (1 - cos_phi),u2 * sin_phi,0            ],[u1 * u2 * (1 - cos_phi),cos_phi + u2 * u2 * (1 - cos_phi),-u1 * sin_phi,[-u2 * sin_phi,u1 * sin_phi,cos_phi,-d / c        ],[0,1            ]
    ])
    return out


def transform_plane(plane):
    t = get_transform_matrix(plane)
    t_inv = np.linalg.inv(t)
    new_plane = np.dot(plane,t_inv)
    print("new plane:")
    print(new_plane)
    return new_plane

测试:

plane = [390.17,2833797.03]
plane_xy = transform_plane(plane)

解决方法

您在这里错过了sqrt

def calc_u1(a,b,c):
   return b / (a*a + b*b)

应该

def calc_u1(a,c):
   return b / sqrt(a*a + b*b)

替换给出 [-1.13686838e-13 0.00000000e+00 4.06760715e+03 -4.19362793e+04] - x 系数几乎为零,平面平行于 OXY(如 z=-1.05

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。