FineKernelToolKit: FK::fk_Math クラス

FineKernelToolKit 4.3.0

読み取り中…
検索中…
一致する文字列を見つけられません
静的公開変数類 | 全メンバ一覧
FK::fk_Math クラス

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

`#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 型に集約しているので、そちらも参照して下さい。

参照
  fk_Plane, fk_Ray

## 関数詳解

## ◆ sgn()

double FK::fk_Math::sgn | ( | double | a | ) |

static

符号関数

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

引数

  [in] | a | 対象とする値。

戻り値
  a が正なら 1 を、負なら -1 を、0 なら 0 を返します。

## ◆ clamp()

double FK::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()

double FK::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()

std::tuple< double, double, double > FK::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 | 分離要素ベクトル

戻り値
  第1,2,3要素にそれぞれ \((\alpha, \beta, \gamma)\) が入ります。

## ◆ isOnLine()

bool FK::fk_Math::isOnLine | ( | fk_LineType | type,
|  | fk_Vector | A,
|  | fk_Vector | B,
|  | fk_Vector | P,
|  | bool | openFlg = true )

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 が直線であった場合は無視されます。

戻り値
  線上にあると判定されれば true を、ないと判定されれば false を返します。 A と B が非常に近い(あるいは同じ位置にある)場合、判定結果が異常となる場合があります。

## ◆ isCrossLine()

bool FK::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 = true )

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 が直線であった場合は無視されます。

戻り値
  線が交差すると判定されれば true を、 しないと判定されれば false を返します。

参照
  isOnLine()

## ◆ calcNearest() [1/2]

double FK::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]

std::tuple< double, double > FK::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()

std::tuple< bool, double, double, double > FK::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()

std::tuple< int, double, double > FK::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()

std::tuple< int, double, double, double, double > FK::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()

fk_Quaternion FK::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()

fk_Quaternion FK::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]

unsigned int FK::fk_Math::rand | ( | void |  | ) |

static

一様整数乱数取得関数

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

戻り値
  乱数値

## ◆ rand() [2/2]

int FK::fk_Math::rand | ( | int | m,
|  | int | M )

static

範囲付一様整数乱数取得関数

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

引数

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

戻り値
  乱数値

## ◆ drand() [1/2]

double FK::fk_Math::drand | ( | void |  | ) |

static

一様実数乱数取得関数

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

戻り値
  乱数値

## ◆ drand() [2/2]

double FK::fk_Math::drand | ( | double | m,
|  | double | M )

static

範囲付一様実数乱数取得関数

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

引数

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

戻り値
  乱数値

## ◆ seed()

void FK::fk_Math::seed | ( | unsigned int | s | ) |

static

乱数シード値設定関数

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

引数

  [in] | s | シード値

参照
  rand(), rand(int, int), drand(), drand(double, double)

## メンバ詳解

## ◆ EPS

double FK::fk_Math::EPS = 1.0e-8

staticconstexpr

数値演算用誤差値

## ◆ PI

double FK::fk_Math::PI = 3.1415926535897932

staticconstexpr

円周率