当前位置:网站首页>空间顶点到平面的距离计算的证明及其源码
空间顶点到平面的距离计算的证明及其源码
2022-07-30 05:49:00 【夕阳染色的坡道】
目的:最近写C++代码,遇到一些基础的算法。如计算顶点到平面的距离。
上篇文章已经介绍了平面以及它的数学表达形式:
几何表达形式 P l a n e Plane Plane:平面法向量 N = ( n 0 n 1 n 2 ) N=\begin{pmatrix} n_0 \\ n_1 \\ n_2 \end{pmatrix} N=⎝⎛n0n1n2⎠⎞,以及平面上的一个顶点 P 0 = ( x 0 y 0 z 0 ) P_0=\begin{pmatrix} x_0 \\ y_0 \\ z_0 \end{pmatrix} P0=⎝⎛x0y0z0⎠⎞
顶点的表达形式: P 1 = ( x 1 y 1 z 1 ) P_1=\begin{pmatrix} x_1 \\ y_1 \\ z_1 \end{pmatrix} P1=⎝⎛x1y1z1⎠⎞
计算 P 1 P_1 P1到平面 P l a n e Plane Plane的距离。
P l a n e Plane Plane的表达可以转化为 n 0 ( x − x 0 ) + n 1 ( y − y 0 ) + n 2 ( z − z 0 ) = 0 n_0(x-x_0)+n_1(y-y_0)+n_2(z-z_0)=0 n0(x−x0)+n1(y−y0)+n2(z−z0)=0,计算得到 n 0 x + n 1 y + n 2 z + d = 0 n_0x+n_1y+n_2z+d=0 n0x+n1y+n2z+d=0其中 d = − n 0 x 0 − n 1 y 0 − n 2 z 0 = − N T ⋅ P 0 d=-n_0x_0-n_1y_0-n_2z_0=-N^T \cdot P_0 d=−n0x0−n1y0−n2z0=−NT⋅P0
推导公式如下:
计算红色的顶点 P 1 P_1 P1到蓝色平面 P l a n e Plane Plane的距离。黄色的顶点为平面上的一点 P 0 P_0 P0。顶点到平面距离定义:它垂直到平面的点的距离(在图中使用灰色线段表示)。
基于垂直三角形的算法得到灰色线段的长度为 d i s t dist dist
d i s t = ∥ P 0 − P 1 ∥ ⋅ c o s ( θ ) ( 1 ) dist=\lVert P_0-P_1 \rVert \cdot cos(\theta) \space \space (1) dist=∥P0−P1∥⋅cos(θ) (1)
其中 θ \theta θ是两个向量 P 0 P 1 P_0P_1 P0P1和平面法向量 N N N的夹角,
c o s ( θ ) = ∣ N T ⋅ ( P 0 − P 1 ) ∣ ∥ P 0 − P 1 ∥ ⋅ ∥ N ∥ ( 2 ) cos(\theta) = \cfrac {|N^T \cdot (P_0-P_1)|}{\lVert P_0-P_1 \rVert \cdot \lVert N \rVert} \space \space (2) cos(θ)=∥P0−P1∥⋅∥N∥∣NT⋅(P0−P1)∣ (2)
将公式(2)带入公式(1)可以得到如下:
d i s t = ∣ N T ⋅ ( P 0 − P 1 ) ∣ ∥ N ∥ ( 3 ) dist=\cfrac {|N^T \cdot (P_0-P_1)|}{ \lVert N \rVert} \space \space (3) dist=∥N∥∣NT⋅(P0−P1)∣ (3)
将向量 P 0 = ( x 0 y 0 z 0 ) P_0=\begin{pmatrix} x_0 \\ y_0 \\ z_0 \end{pmatrix} P0=⎝⎛x0y0z0⎠⎞, P 1 = ( x 1 y 1 z 1 ) P_1=\begin{pmatrix} x_1 \\ y_1 \\ z_1 \end{pmatrix} P1=⎝⎛x1y1z1⎠⎞, N = ( n 0 n 1 n 2 ) N=\begin{pmatrix} n_0 \\ n_1 \\ n_2 \end{pmatrix} N=⎝⎛n0n1n2⎠⎞带入公式(3)得到的方程
d i s t = ∣ N T ⋅ P 0 − N T ⋅ P 1 ∣ ∥ N ∥ = ∣ − d − N T ⋅ P 1 ∣ ∥ N ∥ = ∣ N T ⋅ P 1 + d ∣ ∥ N ∥ ( 4 ) dist=\cfrac {|N^T \cdot P_0 - N^T \cdot P_1|}{ \lVert N \rVert}=\cfrac {|-d - N^T \cdot P_1|}{ \lVert N \rVert} =\cfrac {|N^T \cdot P_1 + d|}{ \lVert N \rVert} \space \space (4) dist=∥N∥∣NT⋅P0−NT⋅P1∣=∥N∥∣−d−NT⋅P1∣=∥N∥∣NT⋅P1+d∣ (4)
可以将上述向量的形式改写为代数形式为:
d i s t = ∣ n 0 x 1 + n 1 y 1 + n 2 z 1 + d ∣ n 0 2 + n 1 2 + n 2 2 ( 5 ) dist = \cfrac{|n_0x_1 + n_1y_1+n_2z_1+d|}{\sqrt{n_0^2+n_1^2+n_2^2}} \space \space (5) dist=n02+n12+n22∣n0x1+n1y1+n2z1+d∣ (5)
源码的如下,它是基于向量的模式写的。它需要你配置好Eigen库:
float Pnt3d2PlaneDist(Eigen::Vector4f& fn, Eigen::Vector3f& pnt)
{
Eigen::Vector3f n = Eigen::Vector3f(fn[0], fn[1], fn[2]);
float sd = n.norm();
if (sd < 1e-8)
return std::numeric_limits<float>::max();
float sb = std::abs(n.dot(pnt) + fn[3]);
float d = sb / sd;
return d;
}
详细见网站:https://mathinsight.org/distance_point_plane
边栏推荐
- 软件测试_01
- Linux(centos7)下安装MySQL
- Redis下载与安装
- 测试开发工程师成长日记009 - 环境排排站:开发环境、测试环境、生产环境、UAT环境、仿真环境
- Mastering JESD204B (2) – Debugging of AD6676
- Graph analysis like NetworkX with GraphScope
- 05-Theos
- debian 问题
- prometheus监控minio
- Test and Development Engineer Growth Diary 009 - Environment Pai Pai Station: Development Environment, Test Environment, Production Environment, UAT Environment, Simulation Environment
猜你喜欢
随机推荐
ParseException line 8:13 mismatched input ‘(‘ expecting ) near ‘int‘ in create table statement
测试开发工程师成长日记001 - 敏捷测试、CI/CD/CT、DecOps的一些介绍
原力计划微服务实战|集中配置中心Config非对称加密与安全管理
Test and Development Engineer Growth Diary 009 - Environment Pai Pai Station: Development Environment, Test Environment, Production Environment, UAT Environment, Simulation Environment
05-Theos
Deploy GraphScope with Helm
DNS域名解析服务
proftpd 配置文件说明
测试开发工程师成长日记007 - Bug的优先级定义及填写规范
About memcache kernel, so one of the most popular
Graph analysis like NetworkX with GraphScope
Rapidly develop GraphScope graph analysis applications
基于 JupyterLab 插件在 GraphScope 中交互式构图
How to import matlab data into modelsim simulation
测试开发工程师成长日记010 - Jenkins中的CI/CD/CT(持续集成构建/持续交付/持续测试)
2021-05-26
如何将modelsim仿真数据存成文件
Redis下载与安装
Vineyard: 开源分布式内存数据管理框架
【无标题】








