三维平面的统一表示方法:
假设(x1, y1, z1)、(x2,y2,z2)为平面上两个点,那么可以得到:
(x2-x1, y2-y1, z2-z1)是平面上的一个向量,并且根据上式可知,(A, B, C)与这个向量垂直,显然(A, B, C)为平面的法向量。
假设(x0, y0, z0)为空间中的任意一点,它在平面上的投影坐标为(x, y, z),那么由这两个点组成的向量也是平面的法向量,则应与法向量(A, B, C)平行,从而可以得到:
即(直线方程的参数表达形式):
将上述结果带入平面方程公式(1)中可以得到:
将公式(5)带回到公式(4)即可得到投影后坐标。
代码以在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博客python点云投影样例。https://blog.csdn.net/suiyingy/article/details/124136567python三维点云研究计划_Coding的叶子的博客-CSDN博客_python 三维点云将按照以下目录持续进行更新……点云格式介绍、点云可视化、点云投影、生成鸟瞰图、生成前视图、点云配准、点云分割、三维目标检测、点云重建、深度学习点云算法……https://blog.csdn.net/suiyingy/article/details/124017716
更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。