FineKernelToolKit  2.8.10
Static Public メソッド
クラス fk_Math

数学処理関数集合クラス [詳細]

すべてのメンバ一覧

Static Public メソッド

static double clamp (double a, double min, double max)
 数値範囲制限関数
static bool isOnLine (const fk_Vector &A, const fk_Vector &B, const fk_Vector &P)
 直線上判定関数
static bool isOnLineSegment (const fk_Vector &A, const fk_Vector &B, const fk_Vector &P, bool openFlg=true)
 線分上判定関数
static bool isCrossLine (const fk_Vector &A, const fk_Vector &B, const fk_Vector &C, const fk_Vector &D)
 直線交差判定関数
static bool isCrossLineSegment (const fk_Vector &A, const fk_Vector &B, const fk_Vector &C, const fk_Vector &D, bool openFlg=true)
 線分交差判定関数
static double calcClosestPtSegToSeg (const fk_Vector &A, const fk_Vector &B, const fk_Vector &C, const fk_Vector &D, double *s, double *t, fk_Vector *P, fk_Vector *Q)
 線分対線分・最近接点算出関数
static void calcClosestPtPtToSeg (const fk_Vector &C, const fk_Vector &A, const fk_Vector &B, double *t, fk_Vector *P)
 点対線分・最近接点算出関数
static bool calcCrossLineAndTri (const fk_Vector &P, const fk_Vector &Q, const fk_Vector &A, const fk_Vector &B, const fk_Vector &C, fk_Vector *R=NULL)
 三角形対線分交差判定関数
static double calcCosine (fk_Vector A, fk_Vector B)
 余弦値算出関数
static fk_Vector divideVec (const fk_Vector &V, const fk_Vector &A, const fk_Vector &B, const fk_Vector &C)
 ベクトル分離係数算出関数
static fk_QuaternionquatInterLinear (const fk_Quaternion &q1, const fk_Quaternion &q2, double t)
 四元数単純線形補間関数
static fk_QuaternionquatInterSphere (const fk_Quaternion &q1, const fk_Quaternion &q2, double t)
 四元数球面線形補間関数

説明

数学処理関数集合クラス

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

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

    fk_Vector   vec1, vec2;
    double      theta;

    theta = fk_Math::calcCosine(vec1, vec2);

関数

static double 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_Math::isOnLine ( const fk_Vector A,
const fk_Vector B,
const 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_Math::isOnLineSegment ( const fk_Vector A,
const fk_Vector B,
const fk_Vector P,
bool  openFlg = true 
) [static]

線分上判定関数

頂点 $\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_Math::isCrossLine ( const fk_Vector A,
const fk_Vector B,
const fk_Vector C,
const 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_Math::isCrossLineSegment ( const fk_Vector A,
const fk_Vector B,
const fk_Vector C,
const fk_Vector D,
bool  openFlg = true 
) [static]

線分交差判定関数

点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 double fk_Math::calcClosestPtSegToSeg ( const fk_Vector A,
const fk_Vector B,
const fk_Vector C,
const 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_Math::calcClosestPtPtToSeg ( const fk_Vector C,
const fk_Vector A,
const 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_Math::calcCrossLineAndTri ( const fk_Vector P,
const fk_Vector Q,
const fk_Vector A,
const fk_Vector B,
const fk_Vector C,
fk_Vector R = NULL 
) [static]

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

線分 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 double 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_Math::divideVec ( const fk_Vector V,
const fk_Vector A,
const fk_Vector B,
const 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_Math::quatInterLinear ( const fk_Quaternion q1,
const 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_Math::quatInterSphere ( const fk_Quaternion q1,
const 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()
 全て クラス ネームスペース ファイル 関数 変数 型定義 列挙型 列挙型の値 フレンド マクロ定義