クラス 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 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] openFlg true の場合は、線分を閉区間として解釈します。 つまり、両端点そのものも線分の一部とみまします。 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] A 1本目の直線上の一点。B とは異なる位置でなければなりません。
[in] B 1本目の直線上の一点。A とは異なる位置でなければなりません。
[in] C 2本目の直線上の一点。D とは異なる位置でなければなりません。
[in] D 2本目の直線上の一点。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] A 1本目の線分の始点。B とは異なる位置でなければなりません。
[in] B 1本目の線分の終点。A とは異なる位置でなければなりません。
[in] C 2本目の線分の始点。D とは異なる位置でなければなりません。
[in] D 2本目の線分の終点。C とは異なる位置でなければなりません。
[in] openFlg true の場合は、線分を閉区間として解釈します。 つまり、両端点そのものも線分の一部とみまします。 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] A 1本目の線分の始点。B とは異なる位置でなければなりません。
[in] B 1本目の線分の終点。A とは異なる位置でなければなりません。
[in] C 2本目の線分の始点。D とは異なる位置でなければなりません。
[in] D 2本目の線分の終点。C とは異なる位置でなければなりません。
[out] s 1本目の線分上の最近接点を示すパラメータが代入されます。
[out] t 2本目の線分上の最近接点を示すパラメータが代入されます。
[out] P 1本目の線分上の最近接点座標が代入されます。
[out] Q 2本目の線分上の最近接点座標が代入されます。
戻り値:
線分間の距離を返します。線分が交差してる場合はこの値は 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 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()
FineKernelToolKitに対してFri Apr 23 16:38:41 2010に生成されました。  doxygen 1.6.3