python三维点云投影(一)

python三维点云投影(一),第1张


一、立体几何基础知识 1.1 平面表示

        三维平面的统一表示方法:

1.2 法向量

        假设(x1, y1, z1)、(x2,y2,z2)为平面上两个点,那么可以得到:

        

        (x2-x1, y2-y1, z2-z1)是平面上的一个向量,并且根据上式可知,(A, B, C)与这个向量垂直,显然(A, B, C)为平面的法向量。


1.3 过定点且与平面垂直的直线方程

        假设(x0, y0, z0)为空间中的任意一点,它在平面上的投影坐标为(x, y, z),那么由这两个点组成的向量也是平面的法向量,则应与法向量(A, B, C)平行,从而可以得到:

        

        即(直线方程的参数表达形式):

        

1.4 直线与平面交点

        将上述结果带入平面方程公式(1)中可以得到:

        

        将公式(5)带回到公式(4)即可得到投影后坐标。



二、python代码

        代码以在xy投影为例,并提供矩阵计算形式。


# -*- coding: utf-8 -*-
"""
Created on Mon Apr 11 22:25:48 2022

@author: suiyingy
"""

import numpy as np

#定义平面方程Ax+By+Cz+D=0
#以z=0平面为例,即在xy平面上的投影A=0, B=0, C=1(任意值), D=0
#para[0, 0, 1, 0]
def point_project(points, para):
    x = points[:, 0]  # x position of point
    y = points[:, 1]  # y position of point
    z = points[:, 2]  # z position of point
    d = para[0]**2 + para[1]**2 + para[2]**2
    t = -(para[0]*x  + para[1]*y + para[2]*z + para[3])/d
    x = para[0]*t + x
    y = para[1]*t + y
    z = para[2]*t + z
    return np.array([x, y, z]).T

#矩阵写法
#定义平面方程Ax+By+Cz+D=0
#以z=0平面为例,即在xy平面上的投影A=0, B=0, C=1(任意值), D=0
#para[0, 0, 1, 0]
def point_project_array(points, para):
    para  = np.array(para)
    d = para[0]**2 + para[1]**2 + para[2]**2
    t = -(np.matmul(points[:, :3], para[:3].T) + para[3])/d
    points = np.matmul(t[:, np.newaxis], para[np.newaxis, :3]) + points[:, :3]
    return points
    
    
if  __name__ == '__main__':
    #定义平面方程Ax+By+Cz+D=0
    #以z=0平面为例,即在xy平面上的投影A=0, B=0, C=1(任意值), D=0
    project_pane = [0, 0, 1, 0]
    
    p0  = np.random.randint(1, 3, (2, 3))
    print('p0: \n', p0)
    
    p1 = point_project(p0, project_pane)
    print('p1: \n', p1)
    
    p2 = point_project_array(p0, project_pane)
    print('p2: \n', p2)

python三维点云投影(二)_Coding的叶子的博客-CSDN博客

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/589805.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-13
下一篇2022-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存