FineKernelToolKit  3.1.0
全メンバ一覧
FK_CLI::fk_Math クラス

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

静的公開メンバ関数

基本数値演算メソッド
static double Clamp (double a, double min, double max)
 数値範囲制限メソッド [詳解]
 
幾何的演算メソッド
static bool IsOnLine (fk_Vector^ A, fk_Vector^ B, fk_Vector^ P)
 直線上判定メソッド [詳解]
 
static bool IsOnLineSegment (fk_Vector^ A, fk_Vector^ B, fk_Vector^ P, bool openFlg)
 線分上判定メソッド1 [詳解]
 
static bool IsOnLineSegment (fk_Vector^ A, fk_Vector^ B, fk_Vector^ P)
 線分上判定メソッド2 [詳解]
 
static bool IsCrossLine (fk_Vector^ A, fk_Vector^ B, fk_Vector^ C, fk_Vector^ D)
 直線交差判定メソッド [詳解]
 
static bool IsCrossLineSegment (fk_Vector^ A, fk_Vector^ B, fk_Vector^ C, fk_Vector^ D, bool openFlg)
 線分交差判定メソッド1 [詳解]
 
static bool IsCrossLineSegment (fk_Vector^ A, fk_Vector^ B, fk_Vector^ C, fk_Vector^ D)
 線分交差判定メソッド2 [詳解]
 
static double CalcClosestPtSegToSeg (fk_Vector^ A, fk_Vector^ B, fk_Vector^ C, fk_Vector^ D, double% s, double% t, fk_Vector^ P, fk_Vector^ Q)
 線分対線分・最近接点算出メソッド [詳解]
 
static void CalcClosestPtPtToSeg (fk_Vector^ C, fk_Vector^ A, fk_Vector^ B, double% t, fk_Vector^ P)
 点対線分・最近接点算出メソッド [詳解]
 
static bool CalcCrossLineAndTri (fk_Vector^ P, fk_Vector^ Q, fk_Vector^ A, fk_Vector^ B, fk_Vector^ C, fk_Vector^ R)
 三角形対線分交差判定メソッド1 [詳解]
 
static bool CalcCrossLineAndTri (fk_Vector^ P, fk_Vector^ Q, fk_Vector^ A, fk_Vector^ B, fk_Vector^ C)
 三角形対線分交差判定メソッド2 [詳解]
 
static double CalcCosine (fk_Vector^ A, fk_Vector^ B)
 余弦値算出メソッド [詳解]
 
static fk_VectorDivideVec (fk_Vector^ V, fk_Vector^ A, fk_Vector^ B, fk_Vector^ C)
 ベクトル分離係数算出メソッド [詳解]
 
四元数補間メソッド
static fk_QuaternionQuatInterLinear (fk_Quaternion^ Q1, fk_Quaternion^ Q2, double t)
 四元数単純線形補間メソッド [詳解]
 
static fk_QuaternionQuatInterSphere (fk_Quaternion^ Q1, fk_Quaternion^ Q2, double t)
 四元数球面線形補間メソッド [詳解]
 

詳解

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

このクラスは、様々な数学的処理メソッドを static メソッド群としてまとめたものです。

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

fk_Vector   vec1, vec2;
double      theta;

theta = fk_Math.CalcCosine(vec1, vec2);

関数詳解

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 を返します。
static bool FK_CLI::fk_Math::IsOnLine ( fk_Vector A,
fk_Vector B,
fk_Vector P 
)
static

直線上判定メソッド

頂点 $\mathbf{P}$ が、 $\mathbf{A}, \mathbf{B}$ を通る直線上にあるかどうかを判定します。 厳密には、直線と $\mathbf{P}$ の距離が FK.EPS 内である場合は、 直線上にあると解釈します。

引数
[in]A直線上の一点。B とは異なる位置でなければなりません。
[in]B直線上の一点。A とは異なる位置でなければなりません。
[in]P判定対象位置ベクトル
戻り値
直線上にあると判定されれば true を、 ないと判定されれば false を返します。 A と B が非常に近い(あるいは同じ位置にある)場合、 判定結果が異常となる場合があります。
参照
IsOnLineSegment()
static bool FK_CLI::fk_Math::IsOnLineSegment ( fk_Vector A,
fk_Vector B,
fk_Vector P,
bool  openFlg 
)
static

線分上判定メソッド1

頂点 $\mathbf{P}$ が、 $\mathbf{A}, \mathbf{B}$ を端点とする線分上にあるかどうかを判定します。 厳密には、線分と $\mathbf{P}$ の距離が FK.EPS 内である場合は、 線分上にあると解釈します。

引数
[in]A線分の始点。B とは異なる位置でなければなりません。
[in]B線分の終点。A とは異なる位置でなければなりません。
[in]P判定対象位置ベクトル
[in]openFlgtrue の場合は、線分を閉区間として解釈します。 つまり、両端点そのものも線分の一部とみなします。 false の場合は線分を開区間として解釈します。 この場合は、両端点は線分には含まれないので、 もし P が A や B と一致していた場合は false を返すことになります。
戻り値
線分上にあると判定されれば true を、 ないと判定されれば false を返します。 A と B が非常に近い(あるいは同じ位置にある)場合、 判定結果が異常となる場合があります。
参照
IsOnLine()
static bool FK_CLI::fk_Math::IsOnLineSegment ( fk_Vector A,
fk_Vector B,
fk_Vector P 
)
static

線分上判定メソッド2

頂点 $\mathbf{P}$ が、 $\mathbf{A}, \mathbf{B}$ を端点とする線分上にあるかどうかを判定します。 厳密には、線分と $\mathbf{P}$ の距離が FK.EPS 内である場合は、 線分上にあると解釈します。 なお、本メソッドにおいて線分は閉区間として解釈します。 つまり、両端点そのものも線分の一部とみなします。 線分を開区間として扱いたい場合は、 IsOnLineSegment(fk_Vector^, fk_Vector^, fk_Vector^, bool) を利用して下さい。

引数
[in]A線分の始点。B とは異なる位置でなければなりません。
[in]B線分の終点。A とは異なる位置でなければなりません。
[in]P判定対象位置ベクトル
戻り値
線分上にあると判定されれば true を、 ないと判定されれば false を返します。 A と B が非常に近い(あるいは同じ位置にある)場合、 判定結果が異常となる場合があります。
参照
IsOnLine()
static bool FK_CLI::fk_Math::IsCrossLine ( fk_Vector A,
fk_Vector B,
fk_Vector C,
fk_Vector D 
)
static

直線交差判定メソッド

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

もし直線 AB と直線 CD が平行であった場合、 両直線が一致していれば true を、一致していない場合は false を返します。

引数
[in]A1本目の直線上の一点。B とは異なる位置でなければなりません。
[in]B1本目の直線上の一点。A とは異なる位置でなければなりません。
[in]C2本目の直線上の一点。D とは異なる位置でなければなりません。
[in]D2本目の直線上の一点。C とは異なる位置でなければなりません。
戻り値
交差している場合 true を、していない場合 false を返します。
参照
IsCrossLineSegment()
static bool FK_CLI::fk_Math::IsCrossLineSegment ( fk_Vector A,
fk_Vector B,
fk_Vector C,
fk_Vector D,
bool  openFlg 
)
static

線分交差判定メソッド1

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

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

引数
[in]A1本目の線分の始点。B とは異なる位置でなければなりません。
[in]B1本目の線分の終点。A とは異なる位置でなければなりません。
[in]C2本目の線分の始点。D とは異なる位置でなければなりません。
[in]D2本目の線分の終点。C とは異なる位置でなければなりません。
[in]openFlgtrue の場合は、線分を閉区間として解釈します。 つまり、両端点そのものも線分の一部とみなします。 false の場合は線分を開区間として解釈します。 この場合は、両端点は線分には含まれないので、 端点と線分が交差しているような場合は false を返すことになります。
戻り値
線分が交差すると判定されれば true を、 しないと判定されれば false を返します。 両線分の端点が非常に近い(あるいは同じ位置にある)場合、 判定結果が異常となる場合があります。
参照
IsCrossLine()
static bool FK_CLI::fk_Math::IsCrossLineSegment ( fk_Vector A,
fk_Vector B,
fk_Vector C,
fk_Vector D 
)
static

線分交差判定メソッド2

点A,Bを端点とする線分と、点C,Dを端点とする線分が、 空間上で交差するかどうかを判定します。 厳密には、両線分の距離が FK.EPS 内である場合は、交差すると解釈します。 なお、本メソッドにおいて線分は閉区間として解釈します。 つまり、両端点そのものも線分の一部とみなします。 線分を開区間として扱いたい場合は、 IsCrossLineSegment(fk_Vector^, fk_Vector^, fk_Vector^, fk_Vector^, bool) を利用して下さい。

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

引数
[in]A1本目の線分の始点。B とは異なる位置でなければなりません。
[in]B1本目の線分の終点。A とは異なる位置でなければなりません。
[in]C2本目の線分の始点。D とは異なる位置でなければなりません。
[in]D2本目の線分の終点。C とは異なる位置でなければなりません。
戻り値
線分が交差すると判定されれば true を、 しないと判定されれば false を返します。 両線分の端点が非常に近い(あるいは同じ位置にある)場合、 判定結果が異常となる場合があります。
参照
isCrossLine()
static double FK_CLI::fk_Math::CalcClosestPtSegToSeg ( fk_Vector A,
fk_Vector B,
fk_Vector C,
fk_Vector D,
double%  s,
double%  t,
fk_Vector P,
fk_Vector Q 
)
static

線分対線分・最近接点算出メソッド

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

引数
[in]A1本目の線分の始点。B とは異なる位置でなければなりません。
[in]B1本目の線分の終点。A とは異なる位置でなければなりません。
[in]C2本目の線分の始点。D とは異なる位置でなければなりません。
[in]D2本目の線分の終点。C とは異なる位置でなければなりません。
[out]s1本目の線分上の最近接点を示すパラメータが代入されます。
[out]t2本目の線分上の最近接点を示すパラメータが代入されます。
[out]P1本目の線分上の最近接点座標が代入されます。
[out]Q2本目の線分上の最近接点座標が代入されます。
戻り値
線分間の距離を返します。線分が交差してる場合はこの値は 0 になります。
参照
IsCrossLine(), IsCrossLineSegment()
static void FK_CLI::fk_Math::CalcClosestPtPtToSeg ( fk_Vector C,
fk_Vector A,
fk_Vector B,
double%  t,
fk_Vector P 
)
static

点対線分・最近接点算出メソッド

点Cに対する、点A,Bを端点とする線分上の最近接点を算出します。 最近接点を指すパラメータと座標値を同時に返します。

引数
[in]C点の座標。
[in]A線分の始点。B とは異なる位置でなければなりません。
[in]B線分の終点。A とは異なる位置でなければなりません。
[out]t線分上の最近接点を示すパラメータが代入されます。
[out]P線分上の最近接点座標が代入されます。
static bool FK_CLI::fk_Math::CalcCrossLineAndTri ( fk_Vector P,
fk_Vector Q,
fk_Vector A,
fk_Vector B,
fk_Vector C,
fk_Vector R 
)
static

三角形対線分交差判定メソッド1

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

  • 線分 PQ の両端点が同じ場所にある場合。
  • 三角形 ABC の 3 点のうち、少なくとも 2 点が同じ場所にある場合。
  • 三角形 ABC の 3 点が同一直線上にある場合。
  • 線分 PQ と 三角形 ABC が平行だった場合。
引数
[in]P有向線分の始点。
[in]Q有向線分の終点。
[in]A三角形の頂点。
[in]B三角形の頂点。
[in]C三角形の頂点。
[out]R交差の有無にかかわらず、 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 $ が R の x 成分と y 成分、 直線パラメータ $ t $ が R の z 成分に代入されます。 なお、パラメータ出力を必要としない場合は、 本引数を省略するか null を代入しても構いません。
戻り値
交差していれば true を、していなければ false を返します。
static bool FK_CLI::fk_Math::CalcCrossLineAndTri ( fk_Vector P,
fk_Vector Q,
fk_Vector A,
fk_Vector B,
fk_Vector C 
)
static

三角形対線分交差判定メソッド2

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

  • 線分 PQ の両端点が同じ場所にある場合。
  • 三角形 ABC の 3 点のうち、少なくとも 2 点が同じ場所にある場合。
  • 三角形 ABC の 3 点が同一直線上にある場合。
  • 線分 PQ と 三角形 ABC が平行だった場合。

交点の直線上と三角形上でのパラメータを知りたい場合は、 CalcCrossLineAndTri(fk_Vector^, fk_Vector^, fk_Vector^, fk_Vector^, fk_Vector^, fk_Vector^) を利用して下さい。

引数
[in]P有向線分の始点。
[in]Q有向線分の終点。
[in]A三角形の頂点。
[in]B三角形の頂点。
[in]C三角形の頂点。
戻り値
交差していれば true を、していなければ false を返します。
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方向ベクトル
戻り値
余弦値。
static fk_Vector ^ 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 型の変数を返します。
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()
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()