FineKernelToolKit 4.2.13
読み取り中…
検索中…
一致する文字列を見つけられません
全メンバ一覧
FK_CLI::fk_Math クラス

数学処理メソッド集合クラス [詳解]

#include <CLI/FK_CLI/include/Math_CLI.h>

静的公開メンバ関数

基本数値演算メソッド

符号メソッド

static double Sgn (double a)
 
static double Clamp (double a, double min, double max)
 数値範囲制限メソッド
 
ベクトル基本演算関数
static double CalcCosine (fk_Vector^ A, fk_Vector^ B)
 余弦値算出メソッド
 
static Tuple< double, double, double > ^ DivideVec (fk_Vector^ V, fk_Vector^ A, fk_Vector^ B, fk_Vector^ C)
 ベクトル分離係数算出メソッド
 
幾何的演算メソッド
static bool IsOnLine (fk_LineType type, fk_Vector^ A, fk_Vector^ B, fk_Vector^ P, bool openFlg)
 直線群上判定関数
 
static bool IsOnLine (fk_LineType type, fk_Vector^ A, fk_Vector^ B, fk_Vector^ P)
 
static bool IsCrossLine (fk_LineType t_L, fk_Vector^ A, fk_Vector^ B, fk_LineType t_M, fk_Vector^ C, fk_Vector^ D)
 直線群交差判定メソッド1
 
static bool IsCrossLine (fk_LineType t_L, fk_Vector^ A, fk_Vector^ B, fk_LineType t_M, fk_Vector^ C, fk_Vector^ D, bool openFlg)
 直線群交差判定メソッド2
 
static double CalcNearest (fk_Vector^ P, fk_LineType type, fk_Vector^ A, fk_Vector^ B)
 点・直線群間最近接点算出メソッド
 
static Tuple< double, double > ^ CalcNearest (fk_LineType t_L, fk_Vector^ A, fk_Vector^ B, fk_LineType t_M, fk_Vector^ C, fk_Vector^ D)
 直線群間最近接点算出メソッド
 
static Tuple< bool, double, double, double > ^ CalcCrossTriangle (fk_LineType type, fk_Vector^ P, fk_Vector^ Q, fk_Vector^ A, fk_Vector^ B, fk_Vector^ C)
 三角形対線分交差判定関数
 
static Tuple< int, double, double > ^ CalcCrossSphere (fk_Vector^ P, double r, fk_LineType type, fk_Vector^ A, fk_Vector^ B)
 直線群球面交差点算出メソッド
 
static Tuple< int, double, double, double, double > ^ CalcCrossCylinder (fk_Vector^ P, fk_Vector^ Q, double r, fk_LineType type, fk_Vector^ A, fk_Vector^ B)
 直線群円柱面交差点算出メソッド
 
四元数補間メソッド
static fk_QuaternionQuatInterLinear (fk_Quaternion^ Q1, fk_Quaternion^ Q2, double t)
 四元数単純線形補間メソッド
 
static fk_QuaternionQuatInterSphere (fk_Quaternion^ Q1, fk_Quaternion^ Q2, double t)
 四元数球面線形補間メソッド
 
乱数メソッド
static unsigned int Rand (void)
 一様整数乱数取得メソッド
 
static int Rand (int m, int M)
 範囲付一様整数乱数取得メソッド
 
static double DRand (void)
 一様実数乱数取得メソッド
 
static double DRand (double m, double M)
 範囲付一様実数乱数取得メソッド
 
static void Seed (unsigned int s)
 乱数シード値設定メソッド
 

詳解

数学処理メソッド集合クラス

このクラスは、様々な数学的処理メソッドを static メソッド群としてまとめたものです。 全てのメソッドは static 宣言されているため、 本クラスのメソッドを用いる際に fk_Math 型のインスタンスを生成する必要はありません。 例えば、以下のようにしてコードを記述します。

fk_Vector   vec1, vec2;
double      theta;

theta = fk_Math.CalcCosine(vec1, vec2);

本クラス内の説明において、「直線群」という単語は直線、半稜線、有向線分の総称と定義します。 なお、平面に関する幾何計算は fk_Plane 型に集約しているので、そちらも参照して下さい。

参照
fk_Plane, fk_Ray

関数詳解

◆ Sgn()

static double FK_CLI::fk_Math::Sgn ( double  a)
static

引数の符号に従い値を返します。

引数
[in]a対象とする値。
戻り値
a が正なら 1 を、負なら -1 を、0 なら 0 を返します。

◆ Clamp()

static double FK_CLI::fk_Math::Clamp ( double  a,
double  min,
double  max 
)
static

数値範囲制限メソッド

数値を、指定した範囲内に収まるように補正します。

引数
[in]a対象とする値。
[in]min収めたい範囲の最小値。
[in]max収めたい範囲の最大値。
戻り値
\( min \leq a \leq max\) である場合は a そのままの値を、 \(a < min\) である場合は min を、 \(a > max\) である場合は max を返します。

◆ CalcCosine()

static double FK_CLI::fk_Math::CalcCosine ( fk_Vector A,
fk_Vector B 
)
static

余弦値算出メソッド

方向ベクトル \( \mathbf{A}, \mathbf{B} \) のなす角を \( \theta \) としたとき、 \( \cos\theta \) を返します。 \( \mathbf{A}, \mathbf{B} \) は正規化してある必要はありません。 なお、 \( \mathbf{A}, \mathbf{B} \) のいずれかが 零ベクトルである場合は 0 を返します。

引数
[in]A方向ベクトル
[in]B方向ベクトル
戻り値
余弦値。

◆ DivideVec()

static Tuple< double, double, double > ^ FK_CLI::fk_Math::DivideVec ( fk_Vector V,
fk_Vector A,
fk_Vector B,
fk_Vector C 
)
static

ベクトル分離係数算出メソッド

任意のベクトル \(\mathbf{V}\) と、 それぞれが一次独立であるベクトル \(\mathbf{A}, \mathbf{B}, \mathbf{C}\) について、

\[ \mathbf{V} = \alpha\mathbf{A} + \beta\mathbf{B} + \gamma\mathbf{C} \]

を満たすような実数列 \((\alpha, \beta, \gamma)\) を求めます。 \(\mathbf{A}, \mathbf{B}, \mathbf{C}\) が一次独立でなかった場合、 \((\alpha, \beta, \gamma)\) はすべて 0 として出力します。

引数
[in]V分離対象ベクトル
[in]A分離要素ベクトル
[in]B分離要素ベクトル
[in]C分離要素ベクトル
戻り値
\((\alpha, \beta, \gamma)\) をそれぞれ x 成分、y 成分、z 成分とする fk_Vector 型の変数を返します。

◆ IsOnLine() [1/2]

static bool FK_CLI::fk_Math::IsOnLine ( fk_LineType  type,
fk_Vector A,
fk_Vector B,
fk_Vector P,
bool  openFlg 
)
static

直線群上判定関数

頂点 P が、点 A, B を通る直線群上にあるかどうかを判定します。 厳密には、線と P の距離が fk_Math::EPS 内である場合は、線上にあると解釈します。

引数
[in]type直線群のタイプを指定します。
[in]A直線群上の点。B とは異なる位置でなければなりません。 直線群が有向線分または半直線の場合、A は始点を意味します。
[in]B直線群上の点。A とは異なる位置でなければなりません。 直線群が有向線分の場合、B は終点を意味します。
[in]P判定対象位置ベクトル
[in]openFlgtrue の場合は、有向線分や半直線の端点そのものも直線群の一部とみなします。 false の場合、端点は直線群には含まれないので、 もし P が端点と一致していた場合は false を返すことになります。 この引数は、type が直線であった場合は無視されます。
戻り値
線上にあると判定されれば true を、ないと判定されれば false を返します。 A と B が非常に近い(あるいは同じ位置にある)場合、判定結果が異常となる場合があります。

◆ IsOnLine() [2/2]

static bool FK_CLI::fk_Math::IsOnLine ( fk_LineType  type,
fk_Vector A,
fk_Vector B,
fk_Vector P 
)
static

◆ IsCrossLine() [1/2]

static bool FK_CLI::fk_Math::IsCrossLine ( fk_LineType  t_L,
fk_Vector A,
fk_Vector B,
fk_LineType  t_M,
fk_Vector C,
fk_Vector D 
)
static

直線群交差判定メソッド1

点 A, B を通る直線群 L と、点 C, D を通る直線群 M が、 空間上で交差するかどうかを判定します。 厳密には、両直線群の距離が FK.EPS 内である場合は、交差すると解釈します。

もし直線群 L と直線群 M が平行であった場合、 共有部分が存在すれば true を、なければ false を返します。

引数
[in]t_L直線群 L のタイプを指定します。
[in]A直線群 L 上の点。B とは異なる位置でなければなりません。 L が有向線分または半直線の場合、A は始点を意味します。
[in]B直線群 L 上の点。A とは異なる位置でなければなりません。 L が有向線分の場合、B は終点を意味します。
[in]t_M直線群 M のタイプを指定します。
[in]C直線群 M 上の点。D とは異なる位置でなければなりません。 M が有向線分または半直線の場合、C は始点を意味します。
[in]D直線群 M 上の点。C とは異なる位置でなければなりません。 M が有向線分の場合、D は終点を意味します。
戻り値
線が交差すると判定されれば true を、 しないと判定されれば false を返します。
参照
isOnLine()

◆ IsCrossLine() [2/2]

static bool FK_CLI::fk_Math::IsCrossLine ( fk_LineType  t_L,
fk_Vector A,
fk_Vector B,
fk_LineType  t_M,
fk_Vector C,
fk_Vector D,
bool  openFlg 
)
static

直線群交差判定メソッド2

点 A, B を通る直線群 L と、点 C, D を通る直線群 M が、 空間上で交差するかどうかを判定します。 厳密には、両直線群の距離が FK.EPS 内である場合は、交差すると解釈します。

もし直線群 L と直線群 M が平行であった場合、 共有部分が存在すれば true を、なければ false を返します。

引数
[in]t_L直線群 L のタイプを指定します。
[in]A直線群 L 上の点。B とは異なる位置でなければなりません。 L が有向線分または半直線の場合、A は始点を意味します。
[in]B直線群 L 上の点。A とは異なる位置でなければなりません。 L が有向線分の場合、B は終点を意味します。
[in]t_M直線群 M のタイプを指定します。
[in]C直線群 M 上の点。D とは異なる位置でなければなりません。 M が有向線分または半直線の場合、C は始点を意味します。
[in]D直線群 M 上の点。C とは異なる位置でなければなりません。 M が有向線分の場合、D は終点を意味します。
[in]openFlgtrue の場合は、有向線分や半直線の端点そのものも直線群の一部とみなします。 false の場合、端点は直線群には含まれないので、 もし交点が端点と一致していた場合は false を返すことになります。 この引数は、type が直線であった場合は無視されます。
戻り値
線が交差すると判定されれば true を、 しないと判定されれば false を返します。
参照
isOnLine()

◆ CalcNearest() [1/2]

static double FK_CLI::fk_Math::CalcNearest ( fk_Vector P,
fk_LineType  type,
fk_Vector A,
fk_Vector B 
)
static

点・直線群間最近接点算出メソッド

点Pに対する、点A,Bを通る直線群 L 上の最近接点のパラメータを算出します。

引数
[in]P点の座標。
[in]type直線群 L のタイプを指定します。
[in]A直線群 L 上の点。B とは異なる位置でなければなりません。 直線群 L が有向線分または半直線の場合、A は始点を意味します。
[in]B直線群 L 上の点。A とは異なる位置でなければなりません。 直線群 L が有向線分の場合、B は終点を意味します。
戻り値
直線群 L 上の最近接点を示すパラメータを返します。 以下の式は、直線群 L 上の点 P をパラメータ表現したものです。

\[ \mathbf{P} = (1 - t)\mathbf{A} + t\mathbf{B} \]

◆ CalcNearest() [2/2]

static Tuple< double, double > ^ FK_CLI::fk_Math::CalcNearest ( fk_LineType  t_L,
fk_Vector A,
fk_Vector B,
fk_LineType  t_M,
fk_Vector C,
fk_Vector D 
)
static

直線群間最近接点算出メソッド

点 A,B を通る直線群 L と、点 C, D を通る直線群 M における最近接点を算出します。 直線群の交差のみを判定するのであれば isCrossLine() で十分ですが、 この関数は直線群間の距離と、それぞれの直線群における最近接点を指すパラメータを 同時に算出することができます。

引数
[in]t_L直線群 L のタイプを指定します。
[in]A直線群 L 上の点。B とは異なる位置でなければなりません。 L が有向線分または半直線の場合、A は始点を意味します。
[in]B直線群 L 上の点。A とは異なる位置でなければなりません。 L が有向線分の場合、B は終点を意味します。
[in]t_M直線群 M のタイプを指定します。
[in]C直線群 M 上の点。D とは異なる位置でなければなりません。 M が有向線分または半直線の場合、C は始点を意味します。
[in]D直線群 M 上の点。C とは異なる位置でなければなりません。 M が有向線分の場合、D は終点を意味します。
戻り値
第1要素は直線群 L の最近接点を示すパラメータが代入されます。 以下の式は、直線群 L 上の点 P をパラメータ表現したものです。

\[ \mathbf{P} = (1 - s)\mathbf{A} + s\mathbf{B} \]

また、第2要素は直線群 M の最近接点を示すパラメータが代入されます。 以下の式は、直線群 M 上の点 Q をパラメータ表現したものです。

\[ \mathbf{Q} = (1 - t)\mathbf{C} + t\mathbf{D} \]

参照
isCrossLine()

◆ CalcCrossTriangle()

static Tuple< bool, double, double, double > ^ FK_CLI::fk_Math::CalcCrossTriangle ( fk_LineType  type,
fk_Vector P,
fk_Vector Q,
fk_Vector A,
fk_Vector B,
fk_Vector C 
)
static

三角形対線分交差判定関数

点 P, Q を通る直線群 と、三角形 ABC が交差しているかどうかを判定します。 この関数では、三角形の境界と線分が接している場合や、 直線群の端点が三角形面上にあるような場合でも、交差していると判断します。 以下の条件を満たす場合は、常に false を返します。

  • 直線群 PQ の両端点が同じ場所にある場合。
  • 三角形 ABC の 3 点のうち、少なくとも 2 点が同じ場所にある場合。
  • 三角形 ABC の 3 点が同一直線上にある場合。
  • 直線群 PQ と 三角形 ABC が平行だった場合。
引数
[in]type直線群の種類
[in]P直線群を通る任意の点。半直線または線分の場合は始点を表します。
[in]Q直線群を通る任意の点。線分の場合は終点を表します。
[in]A三角形の頂点。
[in]B三角形の頂点。
[in]C三角形の頂点。
戻り値
第1要素は交差していれば true が、していなければ false が入ります。 交差の有無にかかわらず、 返値の第2〜4要素にはPQを通る直線とABCを通る平面の交点のパラメータが入ります。 以下の式は、ABC平面上の点 T をパラメータ表現したものです。

\[ \mathbf{T} = \mathbf{A} + u (\mathbf{B} - \mathbf{A}) + v (\mathbf{C} - \mathbf{A}) \]

また、以下の式は直線群 PQ 上の点 L をパラメータ表現したものです。

\[ \mathbf{L} = (1 - t)\mathbf{P} + t\mathbf{Q} \]

これらの式のうち、平面パラメータ \( u, v, t \) がそれぞれ第2,3,4要素に入ります。

◆ CalcCrossSphere()

static Tuple< int, double, double > ^ FK_CLI::fk_Math::CalcCrossSphere ( fk_Vector P,
double  r,
fk_LineType  type,
fk_Vector A,
fk_Vector B 
)
static

直線群球面交差点算出メソッド

球面と直線群の交差判定および交差点の算出を行います。

引数
[in]P球面の中心点位置ベクトル
[in]r球面半径
[in]type直線群の種類
[in]A直線群の始点
[in]B直線群の終点
戻り値
第1要素は、交点数が入ります。球面と直線群が接している場合、 交点数は「2」ではなく「1」と判定します。
第2要素と第3要素は、交点がある場合のパラメータが入ります。 以下の式は、直線群 AB 上の点 C をパラメータ表現したものです。

\[ \mathbf{C} = (1 - t)\mathbf{A} + t\mathbf{B} \]

なお、交点数が 0 である場合の第2,3要素は常に 0 であり、 交点数が 1 である場合の第3要素は常に 0 となります。

◆ CalcCrossCylinder()

static Tuple< int, double, double, double, double > ^ FK_CLI::fk_Math::CalcCrossCylinder ( fk_Vector P,
fk_Vector Q,
double  r,
fk_LineType  type,
fk_Vector A,
fk_Vector B 
)
static

直線群円柱面交差点算出メソッド

円柱面 C と直線群 L の交差判定および交差点の算出を行います。 この関数における「円柱面」は、円柱における側面を指すものであり、 円柱での上面や底面を表す平面との交点ではありません。 また、円柱面は上下方向に無限に続く物と想定します。

引数
[in]P円柱面 C の中心軸上の1点。Q とは異なる位置でなければなりません。
[in]Q円柱面 C の中心軸上の1点。P とは異なる位置でなければなりません。
[in]r円柱面 C の半径
[in]type直線群 L の種類
[in]A直線群 L の始点
[in]B直線群 L の終点
戻り値
第1要素は、交点数が入ります。 円柱面 C と直線群 L が接している場合、交点数は「2」ではなく「1」と判定します。 もし円柱面 C の中心軸と直線群 L が平行だった場合、 L が C と重なっているかどうかに関わらず交点数は常に 0 となります。
第2要素と第3要素は、交点がある場合の直線群 L 上でのパラメータが入ります。 以下の式は、直線群 AB 上の点 R をパラメータ表現したものです。

\[ \mathbf{R} = (1 - t)\mathbf{A} + t\mathbf{B} \]

なお、交点数が 0 である場合の第2,3要素は常に 0 であり、 交点数が 1 である場合の第3要素は常に 0 となります。
第4要素と第5要素は、交点がある場合の交点から 円柱中心軸 PQ への射影点パラメータが入ります。 以下の式は、直線群 PQ 上の点 S をパラメータ表現したものです。

\[ \mathbf{S} = (1 - t)\mathbf{P} + t\mathbf{Q} \]

◆ QuatInterLinear()

static fk_Quaternion ^ FK_CLI::fk_Math::QuatInterLinear ( fk_Quaternion Q1,
fk_Quaternion Q2,
double  t 
)
static

四元数単純線形補間メソッド

2つの四元数 \( \mathbf{q}_1, \mathbf{q}_2 \) に対し、 パラメータ \( t \) で単純線形補間した四元数を返します。 補間式は以下のとおりです。

\[ \mathbf{q}(t) = \frac{(1-t)\mathbf{q}_1 + t\mathbf{q}_2} {|(1-t)\mathbf{q}_1 + t\mathbf{q}_2|} \]

単純線形補間は、 quatInterSphere() による球面線形補間と比べて高速です。 しかし、回転速度が一定でない、 正反対に近い姿勢の補間で誤差が生じやすいといった問題が生じることがあります。 速度面がそれほど切実でないのであれば、 quatInterSphere() による球面線形補間を推奨します。

引数
[in]Q1補間の始点となる四元数
[in]Q2補間の終点となる四元数
[in]t補間パラメータ。0 で始点、1 で終点となります。 通常の補間域は \( 0 \leq t \leq 1 \) となりますが、 範囲外も算出は可能です。
戻り値
補間四元数。常に正規化されています。
参照
fk_Quaternion, quatInterSphere()

◆ QuatInterSphere()

static fk_Quaternion ^ FK_CLI::fk_Math::QuatInterSphere ( fk_Quaternion Q1,
fk_Quaternion Q2,
double  t 
)
static

四元数球面線形補間メソッド

2つの四元数 \( \mathbf{q}_1, \mathbf{q}_2 \) に対し、 パラメータ \( t \) で球面線形補間した四元数を返します。 補間式は以下のとおりです。

\[ \mathbf{q}(t) = \frac{\sin((1-t)\theta)}{\sin\theta}\mathbf{q}_1 + \frac{\sin(t\theta)}{\sin\theta}\mathbf{q}_2 \qquad (\theta = \cos^{-1}(\mathbf{q}_1\cdot\mathbf{q}_2)) \]

球面線形補間は、 quatInterLinear() による単純線形補間と比べて計算速度はやや劣りますが、 回転速度が一定であることや、 正反対に近い姿勢の補間で誤差が生じにくいといった長所があります。 速度面がそれほど切実でないのであれば、 quatInterLinear() による単純線形補間よりも 本メソッドによる球面線形補間を推奨します。

引数
[in]Q1補間の始点となる四元数
[in]Q2補間の終点となる四元数
[in]t補間パラメータ。0 で始点、1 で終点となります。 通常の補間域は \( 0 \leq t \leq 1 \) となりますが、 範囲外も算出は可能です。
戻り値
補間四元数。常に正規化されています。
参照
fk_Quaternion, quatInterLinear()

◆ Rand() [1/2]

static unsigned int FK_CLI::fk_Math::Rand ( void  )
static

一様整数乱数取得メソッド

任意の正の整数から一様乱数を取得します。

戻り値
乱数値

◆ Rand() [2/2]

static int FK_CLI::fk_Math::Rand ( int  m,
int  M 
)
static

範囲付一様整数乱数取得メソッド

\( m \leq r < M\) を満たす一様整数乱数 r を取得します。

引数
[in]m乱数最小値
[in]M乱数最大値。ただし、M は乱数範囲に含まれません。
戻り値
乱数値

◆ DRand() [1/2]

static double FK_CLI::fk_Math::DRand ( void  )
static

一様実数乱数取得メソッド

0 以上 1 未満となる一様実数乱数を取得します。

戻り値
乱数値

◆ DRand() [2/2]

static double FK_CLI::fk_Math::DRand ( double  m,
double  M 
)
static

範囲付一様実数乱数取得メソッド

\( m \leq r < M\) を満たす一様実数乱数 r を取得します。

引数
[in]m乱数最小値
[in]M乱数最大値。ただし、M は乱数範囲に含まれません。
戻り値
乱数値

◆ Seed()

static void FK_CLI::fk_Math::Seed ( unsigned int  s)
static

乱数シード値設定メソッド

乱数関数に対するシード値を設定します。

引数
[in]sシード値
参照
Rand(), Rand(int, int), DRand(), DRand(double, double)