FineKernelToolKit 4.2.13
|
数学処理関数集合クラス [詳解]
#include <FK/Math.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 std::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=true) |
直線群上判定関数 | |
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=true) |
直線群交差判定関数 | |
static double | calcNearest (fk_Vector P, fk_LineType type, fk_Vector A, fk_Vector B) |
点・直線群間最近接点算出関数 | |
static std::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 std::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 std::tuple< int, double, double > | calcCrossSphere (fk_Vector P, double r, fk_LineType type, fk_Vector A, fk_Vector B) |
直線群球面交差点算出関数 | |
static std::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_Quaternion | quatInterLinear (fk_Quaternion q1, fk_Quaternion q2, double t) |
四元数単純線形補間関数 | |
static fk_Quaternion | quatInterSphere (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 constexpr double | EPS = 1.0e-8 |
数値演算用誤差値 | |
static constexpr double | PI = 3.1415926535897932 |
円周率 | |
数学処理関数集合クラス
このクラスは、様々な数学的処理関数を static 関数群としてまとめたものです。 本クラスの全ての関数は static 宣言されているため、 関数を用いる際に fk_Math 型のインスタンスを生成する必要はありません。 例えば、以下のようにしてコードを記述します。
fk_Vector vec1, vec2; double theta; theta = fk_Math::calcCosine(vec1, vec2);
本クラス内の説明において、「直線群」という単語は直線、半稜線、有向線分の総称と定義します。 なお、平面に関する幾何計算は fk_Plane 型に集約しているので、そちらも参照して下さい。
|
static |
符号関数
引数の符号に従い値を返します。
[in] | a | 対象とする値。 |
|
static |
数値範囲制限関数
数値を、指定した範囲内に収まるように補正します。
[in] | a | 対象とする値。 |
[in] | min | 収めたい範囲の最小値。 |
[in] | max | 収めたい範囲の最大値。 |
余弦値算出関数
方向ベクトル \( \mathbf{A}, \mathbf{B} \) のなす角を \( \theta \) としたとき、 \( \cos\theta \) を返します。 \( \mathbf{A}, \mathbf{B} \) は正規化してある必要はありません。 なお、 \( \mathbf{A}, \mathbf{B} \) のいずれかが 零ベクトルである場合は 0 を返します。
[in] | A | 方向ベクトル |
[in] | B | 方向ベクトル |
|
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 | 分離要素ベクトル |
|
static |
直線群上判定関数
頂点 P が、点 A, B を通る直線群上にあるかどうかを判定します。 厳密には、線と P の距離が fk_Math::EPS 内である場合は、線上にあると解釈します。
[in] | type | 直線群のタイプを指定します。 |
[in] | A | 直線群上の点。B とは異なる位置でなければなりません。 直線群が有向線分または半直線の場合、A は始点を意味します。 |
[in] | B | 直線群上の点。A とは異なる位置でなければなりません。 直線群が有向線分の場合、B は終点を意味します。 |
[in] | P | 判定対象位置ベクトル |
[in] | openFlg | true の場合は、有向線分や半直線の端点そのものも直線群の一部とみなします。 false の場合、端点は直線群には含まれないので、 もし P が端点と一致していた場合は false を返すことになります。 この引数は、type が直線であった場合は無視されます。 |
|
static |
直線群交差判定関数
点 A, B を通る直線群 L と、点 C, D を通る直線群 M が、 空間上で交差するかどうかを判定します。 厳密には、両直線群の距離が fk_Math::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] | openFlg | true の場合は、有向線分や半直線の端点そのものも直線群の一部とみなします。 false の場合、端点は直線群には含まれないので、 もし交点が端点と一致していた場合は false を返すことになります。 この引数は、type が直線であった場合は無視されます。 |
|
static |
点・直線群間最近接点算出関数
点Pに対する、点A,Bを通る直線群 L 上の最近接点のパラメータを算出します。
[in] | P | 点の座標。 |
[in] | type | 直線群 L のタイプを指定します。 |
[in] | A | 直線群 L 上の点。B とは異なる位置でなければなりません。 直線群 L が有向線分または半直線の場合、A は始点を意味します。 |
[in] | B | 直線群 L 上の点。A とは異なる位置でなければなりません。 直線群 L が有向線分の場合、B は終点を意味します。 |
\[ \mathbf{P} = (1 - t)\mathbf{A} + t\mathbf{B} \]
|
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 は終点を意味します。 |
\[ \mathbf{P} = (1 - s)\mathbf{A} + s\mathbf{B} \]
また、第2要素は直線群 M の最近接点を示すパラメータが代入されます。 以下の式は、直線群 M 上の点 Q をパラメータ表現したものです。\[ \mathbf{Q} = (1 - t)\mathbf{C} + t\mathbf{D} \]
|
static |
三角形対線分交差判定関数
点 P, Q を通る直線群 と、三角形 ABC が交差しているかどうかを判定します。 この関数では、三角形の境界と線分が接している場合や、 直線群の端点が三角形面上にあるような場合でも、交差していると判断します。 以下の条件を満たす場合は、常に false を返します。
[in] | type | 直線群の種類 |
[in] | P | 直線群を通る任意の点。半直線または線分の場合は始点を表します。 |
[in] | Q | 直線群を通る任意の点。線分の場合は終点を表します。 |
[in] | A | 三角形の頂点。 |
[in] | B | 三角形の頂点。 |
[in] | C | 三角形の頂点。 |
\[ \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要素に入ります。
|
static |
直線群球面交差点算出関数
球面と直線群の交差判定および交差点の算出を行います。
[in] | P | 球面の中心点位置ベクトル |
[in] | r | 球面半径 |
[in] | type | 直線群の種類 |
[in] | A | 直線群の始点 |
[in] | B | 直線群の終点 |
\[ \mathbf{C} = (1 - t)\mathbf{A} + t\mathbf{B} \]
なお、交点数が 0 である場合の第2,3要素は常に 0 であり、 交点数が 1 である場合の第3要素は常に 0 となります。
|
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 の終点 |
\[ \mathbf{R} = (1 - t)\mathbf{A} + t\mathbf{B} \]
なお、交点数が 0 である場合の第2,3要素は常に 0 であり、 交点数が 1 である場合の第3要素は常に 0 となります。\[ \mathbf{S} = (1 - t)\mathbf{P} + t\mathbf{Q} \]
|
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 \) となりますが、 範囲外も算出は可能です。 |
|
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 \) となりますが、 範囲外も算出は可能です。 |
|
static |
一様整数乱数取得関数
任意の正の整数から一様乱数を取得します。
|
static |
範囲付一様整数乱数取得関数
\( m \leq r < M\) を満たす一様整数乱数 r を取得します。
[in] | m | 乱数最小値 |
[in] | M | 乱数最大値。ただし、M は乱数範囲に含まれません。 |
|
static |
一様実数乱数取得関数
0 以上 1 未満となる一様実数乱数を取得します。
|
static |
範囲付一様実数乱数取得関数
\( m \leq r < M\) を満たす一様実数乱数 r を取得します。
[in] | m | 乱数最小値 |
[in] | M | 乱数最大値。ただし、M は乱数範囲に含まれません。 |
|
static |
乱数シード値設定関数
乱数関数に対するシード値を設定します。
[in] | s | シード値 |
|
staticconstexpr |
数値演算用誤差値
|
staticconstexpr |
円周率