从任意给定位置的4个点和局部坐标获取高度(在三维地形上行走)

2024-04-23 16:27:32 发布

您现在位置:Python中文网/ 问答频道 /正文

在三维地形上,我得到每个顶点的高度信息,4个顶点组成一个面,我需要得到面上任意点的高度,给定局部(每个面)x/y坐标和4个顶点z(在我的地形中z是向上的),我搜索了很多,但找不到任何关于它的信息。你知道吗


Tags: 信息高度局部地形顶点
1条回答
网友
1楼 · 发布于 2024-04-23 16:27:32

三个non-colinear点定义了一个平面。如果有三个点p1p2p3,当为两个标量值ab选择正确的值时,该平面上的每个点都可以从p1+a*(p2-p1)+b*(p3-p1)到达。(p2-p1p3-p1必须是linearly independant!)你知道吗

你也可以用cx+dy+ez+f=0来描述一个平面。这意味着如果你已经给出了四个标量值cdef,平面上坐标为xyz的任何点都将给出0的方程cx+dy+ez+f。见here。你知道吗

您已经给出了平面的第一个描述,并希望将其转换为第二个描述,以获得给定的xyz。如here所示。你知道吗

cross为任何向量的叉积(p2-p1)x(p3-p1)p[0]为任何向量的xpp[1]为任何向量的ypp[2]为任何向量的zp,则可以求解z

z=-(cross[0]*(x-p1[0])+cross[1]*(y-p1[1]))/cross[2]+p1[2]

如果cross[2]0,你在这里除以0!这种情况是如果你的平面垂直于x-y-平面。所以任何xy对都没有或有无穷多个解。你知道吗

将整个过程转换为python可以这样做:

import numpy as np

def get_z(p1, p2, p3, x, y):
    p2_minus_p1 = p2-p1
    p3_minus_p1 = p3-p1

    cross = np.cross(p2_minus_p1, p3_minus_p1, axis=0)

    if np.abs(cross[2]) < 0.00001:
        raise ValueError('plane is perpendicular to x-y plane')

    return -(cross[0]*(x-p1[0])+cross[1]*(y-p1[1]))/cross[2]+p1[2]

if __name__=='__main__':

    p1 = np.array([1., 1., 1.])
    p2 = np.array([0., 1., 0.])
    p3 = np.array([-2., -1., -1.])
    x = 4.0
    y = 2.0

    z = get_z(p1, p2, p3, x, y)

    print(z)

输出:

3.5

所以对于p1=[1,1,1]p2=[0,1,0]p3=[-2,-1,-1]x=4y=2你得到z=3.5

如何从全局坐标转换到局部坐标取决于局部坐标的定义。你知道吗

相关问题 更多 >