nlib
nn::nlib::simd::Vector4 クラス

4次元ベクトルの計算を行う関数が集められたクラスです。 [詳解]

#include "nn/nlib/simd/SimdVector4.h"

静的公開メンバ関数

static bool IsNaN (SimdVectorArg vec) noexcept
 vec のいずれかの要素がNaNであるかどうかを検証します。 [詳解]
 
static bool IsInfinite (SimdVectorArg vec) noexcept
 vec のいずれかの要素が正か負の無限大になっているかどうかを検証します。 [詳解]
 
static bool InBound (SimdVectorArg vec, SimdVectorArg bounds) noexcept
 vec の要素がbounds の境界内であるかどうかを検証します。 [詳解]
 
static f128 Dot (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 4次元ベクトル間の内積を計算します。 [詳解]
 
template<bool SetLane0, bool SetLane1, bool SetLane2, bool SetLane3>
static f128 DotEx (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 4次元ベクトル間の内積を計算して、各レーンに設定します。 [詳解]
 
static f128 Dot2 (SimdVectorArg a, SimdVectorArg b0, SimdVectorArg b1) noexcept
 4次元ベクトル間の内積, dot(a, b0), dot(a, b1)を計算して、結果をレーン0, 1に設定します。 [詳解]
 
static f128 Dot3 (SimdVectorArg a, SimdVectorArg b0, SimdVectorArg b1, SimdVectorArg b2) noexcept
 4次元ベクトル間の内積, dot(a, b0), dot(a, b1), dot(a, b2)を計算して、結果をレーン0, 1, 2に設定します。 [詳解]
 
static f128 Dot4 (SimdVectorArg a, SimdVectorArg b0, SimdVectorArg b1, SimdVectorArg b2, SimdVectorArg b3) noexcept
 4次元ベクトル間の内積, dot(a, b0), dot(a, b1), dot(a, b2), dot(a, b3)を計算して、結果をレーン0, 1, 2, 3に設定します。 [詳解]
 
static SimdVector Normalize (SimdVectorArg vec) noexcept
 4次元ベクトルを正規化します。 [詳解]
 
static SimdVector NormalizeEst (SimdVectorArg vec) noexcept
 4次元ベクトルを相対的に低い精度で正規化します。 [詳解]
 
static f128 LengthSq (SimdVectorArg vec) noexcept
 4次元ベクトルの長さの2乗を計算します。 [詳解]
 
static f128 Length (SimdVectorArg vec) noexcept
 4次元ベクトルの長さを計算します。 [詳解]
 
static f128 LengthEst (SimdVectorArg vec) noexcept
 4次元ベクトルの長さを相対的に低い精度で計算します。 [詳解]
 
static f128 RecpLength (SimdVectorArg vec) noexcept
 4次元ベクトルの長さの逆数を計算します。 [詳解]
 
static f128 RecpLengthEst (SimdVectorArg vec) noexcept
 4次元ベクトルの長さの逆数を相対的に低い精度で計算します。 [詳解]
 
static f128 GetAngle (SimdVectorArg vec1_normalized, SimdVectorArg vec2_normalized) noexcept
 正規化された2つの4次元ベクトル間の角度(ラジアン)を計算します。 [詳解]
 
static SimdVector Reflect (SimdVectorArg vec, SimdVectorArg normal) noexcept
 4次元の法線ベクトルによって4次元ベクトルを反射します。 [詳解]
 
static SimdVector Transform (SimdVectorArg vec, SimdMatrixArg m) noexcept
 行列により4次元ベクトルを変換します。 [詳解]
 
ロードとストア
template<typename MyVector4 >
static SimdVector LoadFloat4 (const MyVector4 *p) noexcept
 メモリから4次元ベクトルを読み込みます [詳解]
 
template<typename MyVector4 >
static void StoreFloat4 (MyVector4 *p, SimdVectorArg vec) noexcept
 4次元ベクトルをメモリに書き込みます [詳解]
 
比較
static bool CmpEq (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 2つの4次元ベクトルが等しいかどうか比較します。 [詳解]
 
static bool CmpLt (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 vec1 の全ての要素がvec2 の対応する要素よりも小さいかどうか比較します。 [詳解]
 
static bool CmpLe (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 vec1 の全ての要素がvec2 の対応する要素以下かどうか比較します。 [詳解]
 
static bool CmpGt (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 vec1 の全ての要素がvec2 の対応する要素よりも大きいかどうか比較します。 [詳解]
 
static bool CmpGe (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 vec1 の全ての要素がvec2 の対応する要素以上かどうか比較します。 [詳解]
 
static bool CmpNe (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 vec1vec2 が等しくないかどうか比較します。 [詳解]
 
static bool CmpNearEq (SimdVectorArg vec1, SimdVectorArg vec2, SimdVectorArg eps) noexcept
 vec1vec2 がほぼ等しいかどうか比較します。 [詳解]
 

詳解

4次元ベクトルの計算を行う関数が集められたクラスです。

説明
それぞれの要素が独立に計算される処理については、F128クラスに実装されている関数を使うことができる場合があります。
SSEやNEONがサポートされていない環境でも利用することができますが、パフォーマンスは最適なものではありません。
このクラスのメンバは全て静的関数で、クラスをインスタンス化することはできません。

SimdVector4.h11 行目に定義があります。

関数詳解

§ CmpEq()

nn::nlib::simd::Vector4::CmpEq ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
inlinestaticnoexcept

2つの4次元ベクトルが等しいかどうか比較します。

引数
[in]vec14次元ベクトル
[in]vec24次元ベクトル
戻り値
ベクトルの要素がそれぞれ同じ場合はtrue, そうでなければfalse

SimdVector4.h17 行目に定義があります。

§ CmpGe()

nn::nlib::simd::Vector4::CmpGe ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
inlinestaticnoexcept

vec1 の全ての要素がvec2 の対応する要素以上かどうか比較します。

引数
[in]vec14次元ベクトル
[in]vec24次元ベクトル
戻り値
vec1vec2 以上の場合はtrue, そうでなければfalse

SimdVector4.h29 行目に定義があります。

§ CmpGt()

nn::nlib::simd::Vector4::CmpGt ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
inlinestaticnoexcept

vec1 の全ての要素がvec2 の対応する要素よりも大きいかどうか比較します。

引数
[in]vec14次元ベクトル
[in]vec24次元ベクトル
戻り値
vec1vec2 よりも大きい場合はtrue, そうでなければfalse

SimdVector4.h26 行目に定義があります。

§ CmpLe()

nn::nlib::simd::Vector4::CmpLe ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
inlinestaticnoexcept

vec1 の全ての要素がvec2 の対応する要素以下かどうか比較します。

引数
[in]vec14次元ベクトル
[in]vec24次元ベクトル
戻り値
vec1vec2 以下の場合はtrue, そうでなければfalse

SimdVector4.h23 行目に定義があります。

§ CmpLt()

nn::nlib::simd::Vector4::CmpLt ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
inlinestaticnoexcept

vec1 の全ての要素がvec2 の対応する要素よりも小さいかどうか比較します。

引数
[in]vec14次元ベクトル
[in]vec24次元ベクトル
戻り値
vec1vec2 よりも小さい場合はtrue, そうでなければfalse

SimdVector4.h20 行目に定義があります。

§ CmpNe()

nn::nlib::simd::Vector4::CmpNe ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
inlinestaticnoexcept

vec1vec2 が等しくないかどうか比較します。

引数
[in]vec14次元ベクトル
[in]vec24次元ベクトル
戻り値
vec1vec2 と等しくない場合はtrue, そうでなければfalse

SimdVector4.h32 行目に定義があります。

§ CmpNearEq()

nn::nlib::simd::Vector4::CmpNearEq ( SimdVectorArg  vec1,
SimdVectorArg  vec2,
SimdVectorArg  eps 
)
inlinestaticnoexcept

vec1vec2 がほぼ等しいかどうか比較します。

引数
[in]vec14次元ベクトル
[in]vec24次元ベクトル
[in]eps許容値
戻り値
vec1vec2 がほぼ等しい場合はtrue, そうでなければfalse
説明
以下のような処理になります。
return abs(vec1[0] - vec2[0]) <= eps[0] &&
abs(vec1[1] - vec2[1]) <= eps[1] &&
abs(vec1[2] - vec2[2]) <= eps[2] &&
abs(vec1[3] - vec2[3]) <= eps[3];

SimdVector4.h36 行目に定義があります。

§ Dot()

nn::nlib::simd::Vector4::Dot ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
staticnoexcept

4次元ベクトル間の内積を計算します。

引数
[in]vec14次元ベクトル
[in]vec24次元ベクトル
戻り値
各レーンに内積が格納されます。

§ Dot2()

nn::nlib::simd::Vector4::Dot2 ( SimdVectorArg  a,
SimdVectorArg  b0,
SimdVectorArg  b1 
)
staticnoexcept

4次元ベクトル間の内積, dot(a, b0), dot(a, b1)を計算して、結果をレーン0, 1に設定します。

引数
[in]a4次元ベクトル
[in]b04次元ベクトル
[in]b14次元ベクトル
戻り値
レーン0にdot(a, b0), レーン1にdot(a, b1)が格納されています。

§ Dot3()

nn::nlib::simd::Vector4::Dot3 ( SimdVectorArg  a,
SimdVectorArg  b0,
SimdVectorArg  b1,
SimdVectorArg  b2 
)
staticnoexcept

4次元ベクトル間の内積, dot(a, b0), dot(a, b1), dot(a, b2)を計算して、結果をレーン0, 1, 2に設定します。

引数
[in]a4次元ベクトル
[in]b04次元ベクトル
[in]b14次元ベクトル
[in]b24次元ベクトル
戻り値
レーン0にdot(a, b0), レーン1にdot(a, b1), レーン2にdot(a, b2)が格納されています。

§ Dot4()

nn::nlib::simd::Vector4::Dot4 ( SimdVectorArg  a,
SimdVectorArg  b0,
SimdVectorArg  b1,
SimdVectorArg  b2,
SimdVectorArg  b3 
)
staticnoexcept

4次元ベクトル間の内積, dot(a, b0), dot(a, b1), dot(a, b2), dot(a, b3)を計算して、結果をレーン0, 1, 2, 3に設定します。

引数
[in]a4次元ベクトル
[in]b04次元ベクトル
[in]b14次元ベクトル
[in]b24次元ベクトル
[in]b34次元ベクトル
戻り値
レーン0にdot(a, b0), レーン1にdot(a, b1), レーン2にdot(a, b2), レーン3にdot(a, b3)が格納されています。

§ DotEx()

template<bool SetLane0, bool SetLane1, bool SetLane2, bool SetLane3>
nn::nlib::simd::Vector4::DotEx ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
staticnoexcept

4次元ベクトル間の内積を計算して、各レーンに設定します。

テンプレート引数
SetLane0trueの場合レーン0に内積が、falseの場合0.fが格納されます。
SetLane1trueの場合レーン1に内積が、falseの場合0.fが格納されます。
SetLane2trueの場合レーン2に内積が、falseの場合0.fが格納されます。
SetLane3trueの場合レーン3に内積が、falseの場合0.fが格納されます。
引数
[in]vec14次元ベクトル
[in]vec24次元ベクトル
戻り値
テンプレートパラメータに指定した値によって、各要素に内積か0.fかが格納されます。
説明
以下のような擬似コードで示される処理を行います。
float dot = vec1[0] * vec2[0] + vec1[1] * vec2[1] + vec1[2] * vec2[2] + vec1[3] * vec2[3];
ret[0] = SetLane0 ? dot : 0.f;
ret[1] = SetLane1 ? dot : 0.f;
ret[2] = SetLane2 ? dot : 0.f;
ret[3] = SetLane3 ? dot : 0.f;
return ret;

§ GetAngle()

nn::nlib::simd::Vector4::GetAngle ( SimdVectorArg  vec1_normalized,
SimdVectorArg  vec2_normalized 
)
staticnoexcept

正規化された2つの4次元ベクトル間の角度(ラジアン)を計算します。

引数
[in]vec1_normalized正規化された4次元ベクトル
[in]vec2_normalized正規化された4次元ベクトル
戻り値
各レーンに4次元ベクトル間の角度(ラジアン)が格納されます。

§ InBound()

nn::nlib::simd::Vector4::InBound ( SimdVectorArg  vec,
SimdVectorArg  bounds 
)
inlinestaticnoexcept

vec の要素がbounds の境界内であるかどうかを検証します。

引数
[in]vec4次元ベクトル
[in]bounds境界となる4次元のボックス
戻り値
境界内にあればtrue, そうでなければfalse
説明
以下のような処理になります。
return abs(vec[0]) <= bounds[0] &&
abs(vec[1]) <= bounds[1] &&
abs(vec[2]) <= bounds[2] &&
abs(vec[3]) <= bounds[3];

SimdVector4.h45 行目に定義があります。

§ IsInfinite()

nn::nlib::simd::Vector4::IsInfinite ( SimdVectorArg  vec)
inlinestaticnoexcept

vec のいずれかの要素が正か負の無限大になっているかどうかを検証します。

引数
[in]vec4次元ベクトル
戻り値
vec のいずれかの要素が無限大であればtrue, そうでなければfalse

SimdVector4.h42 行目に定義があります。

§ IsNaN()

nn::nlib::simd::Vector4::IsNaN ( SimdVectorArg  vec)
inlinestaticnoexcept

vec のいずれかの要素がNaNであるかどうかを検証します。

引数
[in]vec4次元ベクトル
戻り値
vec のいずれかの要素がNaNであればtrue, そうでなければfalse

SimdVector4.h39 行目に定義があります。

§ Length()

nn::nlib::simd::Vector4::Length ( SimdVectorArg  vec)
staticnoexcept

4次元ベクトルの長さを計算します。

引数
[in]vec4次元ベクトル
戻り値
各レーンに長さが格納されます。

§ LengthEst()

nn::nlib::simd::Vector4::LengthEst ( SimdVectorArg  vec)
staticnoexcept

4次元ベクトルの長さを相対的に低い精度で計算します。

引数
[in]vec4次元ベクトル
戻り値
各レーンに長さが格納されます。

§ LengthSq()

nn::nlib::simd::Vector4::LengthSq ( SimdVectorArg  vec)
staticnoexcept

4次元ベクトルの長さの2乗を計算します。

引数
[in]vec4次元ベクトル
戻り値
各レーンに長さの2乗が格納されます。

§ LoadFloat4()

template<typename MyVector4 >
nn::nlib::simd::Vector4::LoadFloat4 ( const MyVector4 *  p)
staticnoexcept

メモリから4次元ベクトルを読み込みます

テンプレート引数
MyVector4float型のx, y, z, wという名前の公開データメンバを連続した領域に持つ構造体
引数
[in]p4次元ベクトルが格納されているポインタ
戻り値
4次元ベクトル
説明
MyVector4は例えばnlibnn::nlib::simd::Float4 やDirectXのXMFLOAT4, XMFLOAT4Aのようなクラスになります。

§ Normalize()

nn::nlib::simd::Vector4::Normalize ( SimdVectorArg  vec)
staticnoexcept

4次元ベクトルを正規化します。

引数
[in]vec4次元ベクトル
戻り値
正規化された4次元ベクトル
説明
vec の長さが無限大の場合は各要素がNaNのベクトルを、長さが0の場合は0ベクトルを返します。

§ NormalizeEst()

nn::nlib::simd::Vector4::NormalizeEst ( SimdVectorArg  vec)
staticnoexcept

4次元ベクトルを相対的に低い精度で正規化します。

引数
[in]vec4次元ベクトル
戻り値
正規化された4次元ベクトル

§ RecpLength()

nn::nlib::simd::Vector4::RecpLength ( SimdVectorArg  vec)
staticnoexcept

4次元ベクトルの長さの逆数を計算します。

引数
[in]vec4次元ベクトル
戻り値
各レーンに長さの逆数が格納されます。

§ RecpLengthEst()

nn::nlib::simd::Vector4::RecpLengthEst ( SimdVectorArg  vec)
staticnoexcept

4次元ベクトルの長さの逆数を相対的に低い精度で計算します。

引数
[in]vec4次元ベクトル
戻り値
各レーンに長さの逆数が格納されます。

§ Reflect()

nn::nlib::simd::Vector4::Reflect ( SimdVectorArg  vec,
SimdVectorArg  normal 
)
staticnoexcept

4次元の法線ベクトルによって4次元ベクトルを反射します。

引数
[in]vec反射される4次元ベクトル
[in]normal4次元法線ベクトル(単位ベクトル)
戻り値
反射された4次元ベクトルを返します。

§ StoreFloat4()

template<typename MyVector4 >
nn::nlib::simd::Vector4::StoreFloat4 ( MyVector4 *  p,
SimdVectorArg  vec 
)
staticnoexcept

4次元ベクトルをメモリに書き込みます

テンプレート引数
MyVector4float型のx, y, z, wという名前の公開データメンバを連続した領域に持つ構造体
引数
[in,out]p4次元ベクトルが格納されるポインタ
[in]vec4次元ベクトル
説明
MyVector4は例えばDirectXのXMFLOAT4, XMFLOAT4Aのようなクラスになります。

§ Transform()

nn::nlib::simd::Vector4::Transform ( SimdVectorArg  vec,
SimdMatrixArg  m 
)
staticnoexcept

行列により4次元ベクトルを変換します。

引数
[in]vec4次元ベクトル
[in]m変換行列
戻り値
変換された4次元ベクトル

このクラス詳解は次のファイルから抽出されました: