関数calculate_line_point_distance マニュアル

(The documentation of function calculate_line_point_distance)

Last Update: 2021/12/20


◆機能・用途(Purpose)

2点を結ぶ直線と別の点との間の距離を計算する。
Compute the distance from a straight line connecting two points to another point.


◆形式(Format)

#include <geometry.h>
inline double calculate_line_point_distance
(const struct matrix line,const struct columnvector point)


◆引数(Arguments)

line 直線を定義する2地点の座標から成る\(2\times 3\)の配列。 2地点の座標を\(P_1(x_1,y_1,z_1)\), \(P_2(x_2,y_2,z_2)\)として line.main[0][0]\(=x_1\), line.main[0][1]\(=y_1\), line.main[0][2]\(=z_1\), line.main[1][0]\(=x_2\), line.main[1][1]\(=y_2\), line.main[1][2]\(=z_2\) となるように与える。 すなわちline.main[0]が\(P_1\)を、line.main[1]が\(P_2\)を表す。
A \(2\times 3\) array composed of the coordinates of the two points that define the straight line. Give the array components as line.main[0][0]\(=x_1\), line.main[0][1]\(=y_1\), line.main[0][2]\(=z_1\), line.main[1][0]\(=x_2\), line.main[1][1]\(=y_2\), and line.main[1][2]\(=z_2\), where \(P_1(x_1,y_1,z_1)\) and \(P_2(x_2,y_2,z_2)\) are the two points; line.main[0] and line.main[1] represent the points \(P_1\) and \(P_2\), respectively.
point 直線からの距離を計算したい地点の座標を表す3要素ベクトル。 この地点の座標を\(P_0(x_0,y_0,z_0)\)として point.main[0]\(=x_0\), point.main[1]\(=y_0\), point.main[2]\(=z_0\) となるように与える。
A vector of 3 components representing the coordinate of the point where the distance from the line is to be calculated. Give the vector components as point.main[0]\(=x_0\), point.main[1]\(=y_0\), point.main[2]\(=z_0\), where \(P_0(x_0,y_0,z_0)\) is the point.


◆戻り値(Return value)

\(P_1\), \(P_2\)を通る直線と点\(P_0\)との距離。
Distance from the straight line connecting \(P_1\) and \(P_2\) to the point \(P_0\).


◆使用例(Example)

struct matrix line;
struct columnvector point;
line=get_matrix_memory(2,3);
line.main[0][0]=3.0;
line.main[0][1]=1.0;
line.main[0][2]=-1.0;
line.main[1][0]=-5.0;
line.main[1][1]=7.0;
line.main[1][2]=1.0;
point=get_columnvector_memory(3);
point.main[0]=0.0;
point.main[1]=0.0;
point.main[2]=0.0;
double distance=calculate_line_point_distance(line,point);

この例では2点\(P_1(3,1,-1)\), \(P_2(-5,7,1)\)を結ぶ直線と原点との距離が計算され、 結果が変数distanceに代入される。
In this example, the distance from a straight line connecting \(P_1(3,1,-1)\) and \(P_2(-5,7,1)\) to the origin is computed, and the result is inserted into the variable “distance”.


◆計算式(Formula)

2点\(P_1(x_1,y_1,z_1)\), \(P_2(x_2,y_2,z_2)\)を結ぶ直線\(L\)と 点\(P_0(x_0,y_0,z_0)\)との距離\(r\)を考える。 距離は平行移動しても変わらないので\(P_0\)が座標原点にくるように3点を平行移動する。 すなわち \[\begin{equation} {x’}_1=x_1-x_0, \hspace{1em} {y’}_1=y_1-y_0, \hspace{1em} {z’}_1=z_1-z_0 \label{eq.xyzdash1} \end{equation}\] \[\begin{equation} {x’}_2=x_2-x_0, \hspace{1em} {y’}_2=y_2-y_0, \hspace{1em} {z’}_2=z_2-z_0 \label{eq.xyzdash2} \end{equation}\] と置いて2点 \({P’}_1({x’}_1,{y’}_1,{z’}_1)\), \({P’}_2({x’}_2,{y’}_2,{z’}_2)\) を結ぶ直線\(L’\)と座標原点\((0,0,0)\)との距離を求めれば それが\(r\)になる。
Consider to compute the distance \(r\) from a straight line \(L\) defined by two points \(P_1(x_1,y_1,z_1)\) and \(P_2(x_2,y_2,z_2)\) to point \(P_0(x_0,y_0,z_0)\). Since the distance does not change by parallel movements of the three points, \(r\) is the distance from a straight line \(L’\) defined by \({P’}_1({x’}_1,{y’}_1,{z’}_1)\) and \({P’}_2({x’}_2,{y’}_2,{z’}_2)\) to the coordinate origin \((0,0,0)\), where \({x’}_1\), \({y’}_1\), \({z’}_1\), \({x’}_2\), \({y’}_2\), and \({z’}_2\) are defined by Eqs. (\ref{eq.xyzdash1}) and (\ref{eq.xyzdash2}).

直線\(L’\)上の任意の点\(P(x,y,z)\)は\(\alpha\)を実数としてベクトル形式で \[\begin{equation} (x,y,z)=({x’}_1,{y’}_1,{z’}_1) +\alpha({x’}_2-{x’}_1, {y’}_2-{y’}_1, {z’}_2-{z’}_1) \label{eq.xyz} \end{equation}\] と書ける。成分表記では \[\begin{equation} x={x’}_1+\alpha({x’}_2-{x’}_1) \label{eq.x} \end{equation}\] \[\begin{equation} y={y’}_1+\alpha({y’}_2-{y’}_1) \label{eq.y} \end{equation}\] \[\begin{equation} z={z’}_1+\alpha({z’}_2-{z’}_1) \label{eq.z} \end{equation}\] となる。原点から点\(P\)までの距離は \[\begin{eqnarray} R(\alpha) &=& \sqrt{x^2+y^2+z^2} \nonumber \\ &=& \sqrt{\left[{x’}_1+\alpha({x’}_2-{x’}_1)\right]^2 +\left[{y’}_1+\alpha({y’}_2-{y’}_1)\right]^2 +\left[{z’}_1+\alpha({z’}_2-{z’}_1)\right]^2} \label{eq.R} \end{eqnarray}\] と\(\alpha\)の関数の形で書ける。 この\(R(\alpha)\)の最小値が求める\(r\)である。
Any point \(P(x,y,z)\) on the straight line \(L’\) is written in a vector format as Eq. (\ref{eq.xyz}), where \(\alpha\) is a real number. The components are given by Eqs. (\ref{eq.x})-(\ref{eq.z}). The distance from the origin to point \(P\) is given as Eq. (\ref{eq.R}); thus the distance is a function of \(\alpha\). Minimizing \(R(\alpha)\) gives the distance \(r\) from the line to the point.

\(R(\alpha)\)を最小にする\(\alpha\)と \(R(\alpha)^2\)を最小にする\(\alpha\)は等しいので、 ここでは計算がより簡単な \[\begin{equation} R(\alpha)^2 =\left[{x’}_1+\alpha({x’}_2-{x’}_1)\right]^2 +\left[{y’}_1+\alpha({y’}_2-{y’}_1)\right]^2 +\left[{z’}_1+\alpha({z’}_2-{z’}_1)\right]^2 \label{eq.R.sqr} \end{equation}\] の最小化を考える。これは \[\begin{eqnarray} \frac{dR(\alpha)^2}{d\alpha} &=& 2\left[{x’}_1+\alpha({x’}_2-{x’}_1)\right] ({x’}_2-{x’}_1) \nonumber \\ & & +2\left[{y’}_1+\alpha({y’}_2-{y’}_1)\right] ({y’}_2-{y’}_1) \nonumber \\ & & +2\left[{z’}_1+\alpha({z’}_2-{z’}_1)\right] ({z’}_2-{z’}_1) \nonumber \\ &=& 2\left[{x’}_1({x’}_2-{x’}_1) +{y’}_1({y’}_2-{y’}_1) +{z’}_1({z’}_2-{z’}_1)\right] \nonumber \\ & & +2\alpha\left[({x’}_2-{x’}_1)^2 +({y’}_2-{y’}_1)^2 +({z’}_2-{z’}_1)^2\right] \nonumber \\ &=& 0 \label{eq.R.minimize} \end{eqnarray}\] の条件から求めることができ、 \[\begin{equation} \alpha =-\frac{{x’}_1({x’}_2-{x’}_1) +{y’}_1({y’}_2-{y’}_1) +{z’}_1({z’}_2-{z’}_1)} {({x’}_2-{x’}_1)^2 +({y’}_2-{y’}_1)^2 +({z’}_2-{z’}_1)^2} \label{eq.alpha} \end{equation}\] となる。(\ref{eq.alpha})を用いて\(\alpha\)を計算し、 これを(\ref{eq.R})に代入すれば直線と点との距離\(r\)が求まる。
Minimizing \(R(\alpha)\) is equivalent to minimizing \(R(\alpha)^2\) given by Eq. (\ref{eq.R.sqr}). This latter condition is expressed by Eq. (\ref{eq.R.minimize}), which can be solved for \(\alpha\) as (\ref{eq.alpha}). Computing \(\alpha\) by Eq. (\ref{eq.alpha}) and inserting the result into (\ref{eq.R}) gives the distance \(r\) from the straight line to the point.