空間頂点から平面までの距離計算の証明とソースコード

目的: 最近 C++ コードを作成し、いくつかの基本的なアルゴリズムに遭遇しました。頂点から平面までの距離を計算するなど。

前回の記事では、平面とその数式を紹介しました:
幾何学的表現P レーン 平面P l a n e : 平面法線ベクトル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=バツ0y0z0
頂点式: P 1 = ( x 1 y 1 z 1 ) P_1=\begin{pmatrix} x_1 \\ y_1 \\ z_1 \end{pmatrix}P1=バツ1y1z1

P 1 P_1を計算するP1平面へP レーン 平面平面距離. _ _ _
平面 平面P l a n eの式は、 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)=0n0( ×バツ0)+n1( yy0)+n2( zz0)=0n 0 x + n 1 y + n 2 z + d = 0 n_0x+n_1y+n_2z+d=0 をn0バツ+n1y+n2z+d=0其中d = − n 0 x 0 − n 1 y 0 − n 2 z 0 = − NT ⋅ P 0 d=-n_0x_0-n_1y_0-n_2z_0=-N^T \cdot P_0d=n0バツ0n1y0n2z0=NTP0

導出式は次のとおりです。
ここに画像の説明を挿入

赤い頂点を計算P 1 P_1P1ブループレーンへPレーンプレーン平面距離. _ _ _ 黄色の頂点は平面上のP 0 P_0P0頂点から平面までの距離の定義: 平面に垂直な点の距離 (図の灰色の線分で示されています)。

垂直三角形アルゴリズムに基づいて、灰色の線分の長さはdist distです。d i s t
dist = ∥ P 0 − P 1 ∥ ⋅ cos ( θ ) ( 1 ) dist=\lVert P_0-P_1 \rVert \cdot cos(\theta) \space \space (1)違う_ _ _=∥P _0P1c o s ( θ ) ( 1 )   θ \theta
を増加させるθは 2 つのベクトルP 0 P 1 P_0P_1P0P1と平面法線ベクトルNNたとえば
cos ( θ ) = ∣ NT ⋅ ( 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)c o s ( i )=∥P _0P1N ∣N _T( P0P1)  ( 2 )
式 (1) に式 (2) を代入すると、次のようになります。
dist = ∣ NT ⋅ ( P 0 − P 1 ) ∣ ∥ N ∥ ( 3 ) dist=\cfrac {|N^T \cdot ( P_0 -P_1)|}{ \lVert N \rVert} \space \space (3)違う_ _ _=N ∣N _T( P0P1)  ( 3 )
ベクトルP 0 = ( x 0 y 0 z 0 ) P_0=\begin{pmatrix} x_0 \\ y_0 \\ z_0 \end{pmatrix} をP0=バツ0y0z0, P 1 = ( x 1 y 1 z 1 ) P_1=\begin{pmatrix} x_1 \\ y_1 \\ z_1 \end{pmatrix}P1=バツ1y1z1, N = ( n 0 n 1 n 2 ) N=\begin{pmatrix} n_0 \\ n_1 \\ n_2 \end{pmatrix}N=n0n1n2方程式
dist = ∣ NT ⋅ P 0 − NT ⋅ P 1 ∣ ∥ N ∥ = ∣ − d − NT ⋅ P 1 ∣ ∥ N ∥ = ∣ NT ⋅ 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)違う_ _ _=N ∣N _TP0NTP1=N dNTP1=N ∣N _TP1+d  ( 4 )

上記のベクトル形式は代数形式に書き直すことができます。
dist = ∣ 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)違う_ _ _=n02+n12+n22 n0バツ1+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;
	}

詳細については、Web サイトを参照してください: https://mathinsight.org/ distance_point_plane

おすすめ

転載: blog.csdn.net/weixin_43851636/article/details/125334394