Beziex自由曲面バーチャル研究室
(C)1999-2012 EISHIN All Rights Reserved.

Beziex Ts (Home)
 & ダウンロード


Beziex LG (Home)
 & ダウンロード




マニュアル目次

1章 前知識
2章 新ベジェ境界曲面
3章 プログラムについて
4章 サンプル・アプリケーション
5章 自由曲面関数ライブラリ
6章 bxCore.h
7章 bxDB.h
8章 bxProc.h
9章 数値関数
10章 サンプル・ベースファイル



Copyright 1999-2011 EISHIN

9章 数値関数

1. bxMath.h

1-1. データ型

1) 2次元位置座標、ベクトル、パラメータ値 (例: double pos[ 2 ])
pos[ i ]とした場合、
i=0の時、 x値(u値)
i=1の時、 y値(v値)
となる。以後、総称を2次元値と略す。

2) 3次元位置座標、ベクトル (例: double pos[ 3 ])
pos[ i ]とした場合、
i=0の時、x
i=1の時、y
i=2の時、z
となる。以後、総称を3次元値と略す。

3) 3×3行列 (例: matrix[ 3 ][ 3 ])
matrix[ u ][ v ]とした場合、
u は、行
v は、列
となる。

4) 4×4行列 (例: matrix[ 4 ][ 4 ])
matrix[ u ][ v ]とした場合、
u は、行
v は、列
となる。

5) 平面 (例: axis[ 2 ][ 3 ])
axis[ i ][ j ]とした場合、
i=0の時、メイン軸
i=1の時、サブ軸
となる。また j は3次元ベクトルである。

6) 座標系 (例: axis[ 3 ][ 3 ])
axis[ i ][ j ]とした場合、
i=0の時、x
i=1の時、y
i=2の時、z
となる。また j は3次元ベクトルである。

7) double3
typedef double double3[ 3 ];

8) double4
typedef double double4[ 4 ];

9) スカラー値
配列でないdouble型の変数をスカラー値と呼ぶ。


1-2. 定数

double pi;円周率
double zero2[ 2 ];すべてゼロの2次元値
double zero3[ 3 ];すべてゼロの3次元値
double nearZero;ゼロの近似値(正値)
double nearZero2[ 2 ];すべてnearZeroの2次元値
double nearZero3[ 3 ];すべてnearZeroの3次元値
double minusNearZero2[ 2 ];すべて-nearZeroの2次元値
double minusNearZero3[ 3 ];すべて-nearZeroの3次元値
double identity3x3[ 3 ][ 3 ];3×3単位行列
double identity4x4[ 4 ][ 4 ];4×4単位行列
double worldAxis[ 3 ][ 3 ];ワールド座標系


1-3. 関数

入力要素と出力要素が同じデータ型の時、両方を同じ変数にしても良い。

←入力データ
→出力データ
⇔入出力データ




double*→z[]のポインタ
Set2(
const double a,←スカラー値(要素0)
const double b,←スカラー値(要素1)
double z[ 2 ] );→2次元値変数

2次元値変数にスカラー値をセットする。



double*→z[]のポインタ
Set3(
const double a,←スカラー値(要素0)
const double b,←スカラー値(要素1)
const double c,←スカラー値(要素2)
double z[ 3 ] );→3次元値変数

3次元値変数にスカラー値をセットする。



double*→z[]のポインタ
Copy2(
const double a[ 2 ],←2次元値変数(コピー元)
double z[ 2 ] );→2次元値変数(コピー先)

2次元値変数をコピーする。



double*→z[]のポインタ
Copy3(
const double a[ 3 ],←3次元値変数(コピー元)
double z[ 3 ] );→3次元値変数(コピー先)

3次元値変数をコピーする。



double*→z[]のポインタ
Add2(
const double a[ 2 ],←2次元値変数a
const double b[ 2 ],←2次元値変数b
double z[ 2 ] );→2次元値変数(結果)

2次元値変数aとbを足す。



double*→z[]のポインタ
Add3(
const double a[ 3 ],←3次元値変数a
const double b[ 3 ],←32次元値変数b
double z[ 3 ] );→3次元値変数(結果)

3次元値変数aとbを足す。



double*→z[]のポインタ
Subtract2(
const double a[ 2 ],←2次元値変数a
const double b[ 2 ],←2次元値変数b
double z[ 2 ] );→2次元値変数(結果)

2次元値変数aからbを引く。



double*→z[]のポインタ
Subtract3(
const double a[ 3 ],←3次元値変数a
const double b[ 3 ],←3次元値変数b
double z[ 3 ] );→3次元値変数(結果)

3次元値変数aからbを引く。



double→距離
Distance2(
const double a[ 2 ],←2次元位置a
const double b[ 2 ] );←2次元位置b

2次元位置aとbの間の距離を得る。



double→距離
Distance3(
const double a[ 3 ],←3次元位置a
const double b[ 3 ] );←3次元位置b

3次元位置aとbの間の距離を得る。



double→距離の2乗
DistanceSquared2(
const double a[ 2 ],←2次元位置a
const double b[ 2 ] );←2次元位置b

2次元位置aとbの間の距離の2乗を得る。



double→距離の2乗
DistanceSquared3(
const double a[ 3 ],←3次元位置a
const double b[ 3 ] );←3次元位置b

3次元位置aとbの間の距離の2乗を得る。



double*→z[]のポインタ
Ratio2(
const double a[ 2 ],←2次元値変数a
const double b[ 2 ],←2次元値変数b
const double t,←パラメータ値
double z[ 2 ] );→2次元値変数(結果)

「 z = ( 1 - t )a + tb 」(2次元値変数)を求める。



double*→z[]のポインタ
Ratio3(
const double a[ 3 ],←3次元値変数a
const double b[ 3 ],←3次元値変数b
const double t,←パラメータ値
double z[ 3 ] );→3次元値変数(結果)

「 z = ( 1 - t )a + tb 」(3次元値変数)を求める。



double*→z[]のポインタ
Scale2(
const double a[ 2 ],←2次元値変数
const double scale,←拡大率
double z[ 2 ] );→2次元値変数(結果)

2次元値を拡大縮小する。



double*→z[]のポインタ
Scale3(
const double a[ 3 ],←3次元値変数
const double scale,←拡大率
double z[ 3 ] );→3次元値変数(結果)

3次元値を拡大縮小する。



double→長さ
Length2(
const double a[ 2 ] );←2次元ベクトル

2次元ベクトルの長さを求める。



double→長さ
Length3(
const double a[ 3 ] );←3次元ベクトル

3次元ベクトルの長さを求める。



double→長さの2乗
LengthSquared2(
const double a[ 2 ] );←2次元ベクトル

2次元ベクトルの長さの2乗を求める。



double→長さの2乗
LengthSquared3(
const double a[ 3 ] );←3次元ベクトル

3次元ベクトルの長さの2乗を求める。



double*→z[]のポインタ
Normalize2(
const double a[ 2 ],←2次元ベクトル
const double* valueWhenErr/*[ 2 ]*/,
←エラー時、出力させる値(0としても良い:0==NULL)
double z[ 2 ],→2次元ベクトル(結果)
bool* errResult = 0 );→エラー時、真(省略可)

2次元の単位ベクトルを求める。



double*→z[]のポインタ
Normalize3(
const double a[ 3 ],←3次元ベクトル
const double* valueWhenErr/*[ 3 ]*/,
←エラー時、出力させる値(0としても良い:0==NULL)
double z[ 3 ],→3次元ベクトル(結果)
bool* errResult = 0 );→エラー時、真(省略可)

3次元の単位ベクトルを求める。



double→外積値
Cross2(
const double a[ 2 ],←2次元ベクトルa
const double b[ 2 ] );←2次元ベクトルb

2次元の外積値を求める。



double*→z[]のポインタ
Cross3(
const double a[ 3 ],←3次元ベクトルa
const double b[ 3 ],←3次元ベクトルb
double z[ 3 ] );←3次元ベクトル(外積値)

3次元の外積値を求める。



double→内積値
Dot2(
const double a[ 2 ],←2次元ベクトルa
const double b[ 2 ] );←2次元ベクトルb

2次元の内積値を求める。



double→内積値
Dot3(
const double a[ 3 ],←3次元ベクトルa
const double b[ 3 ] );←3次元ベクトルb

3次元の内積値を求める。



double*→z[]のポインタ
Transform2(
const double a[ 2 ],←2次元値変数
const double b[ 3 ][ 3 ],←3×3行列
double z[ 2 ] );→2次元値変数(結果)

2次元値に対し、3×3行列演算を行う。



double*→z[]のポインタ
Transform3(
const double a[ 3 ],←3次元値変数
const double b[ 4 ][ 4 ],←4×4行列
double z[ 3 ] );→3次元値変数(結果)

3次元値に対し、4×4行列演算を行う。



double*→z[]のポインタ
Negate2(
const double a[ 2 ],←2次元値変数
double z[ 2 ] );→2次元値変数(結果)

2次元値の正負を反転する。



double*→z[]のポインタ
Negate3(
const double a[ 3 ],←3次元値変数
double z[ 3 ] );→3次元値変数(結果)

3次元値の正負を反転する。



double*→z[]のポインタ
Abs2(
const double a[ 2 ],←2次元値変数
double z[ 2 ] );→2次元値変数(結果)

2次元の絶対値を求める。



double*→z[]のポインタ
Abs3(
const double a[ 3 ],←3次元値変数
double z[ 3 ] );→3次元値変数(結果)

3次元の絶対値を求める。



double3*→z[][]のポインタ
Copy3x3(
const double a[ 3 ][ 3 ],←3×3行列(コピー元)
double z[ 3 ][ 3 ] );→3×3行列(コピー先)

3×3行列をコピーする。



double4*→z[][]のポインタ
Copy4x4(
const double a[ 4 ][ 4 ],←4×4行列(コピー元)
double z[ 4 ][ 4 ] );→4×4行列(コピー先)

4×4行列をコピーする。



double3*→z[][]のポインタ
MakeIdentity3x3(
double z[ 3 ][ 3 ] );→3×3単位行列

z[][]を3×3単位行列にする。



double4*→z[][]のポインタ
MakeIdentity4x4(
double z[ 4 ][ 4 ] );→4×4単位行列

z[][]を4×4単位行列にする。



double3*→z[][]のポインタ
Multiply3x3(
const double a[ 3 ][ 3 ],←3×3行列
const double b[ 3 ][ 3 ],←3×3行列
double z[ 3 ][ 3 ] );→3×3行列(結果)

3×3行列どうしを乗算する。



double4*→z[][]のポインタ
Multiply4x4(
const double a[ 4 ][ 4 ],←4×4行列
const double b[ 4 ][ 4 ],←4×4行列
double z[ 4 ][ 4 ] );→4×4行列(結果)

4×4行列どうしを乗算する。



double3*→result[][]のポインタ
Translete3x3(
const double x,←平行移動値x
const double y,←平行移動値y
double result[ 3 ][ 3 ] );→3×3行列(結果)

平行移動(2次元)を行う3×3行列を求める。



double4*→result[][]のポインタ
Translete4x4(
const double x,←平行移動値x
const double y,←平行移動値y
const double z,←平行移動値z
double result[ 4 ][ 4 ] );→4×4行列(結果)

平行移動(3次元)を行う4×4行列を求める。



double3*→result[][]のポインタ
Scale3x3(
const double x,←拡大率x
const double y,←拡大率y
double result[ 3 ][ 3 ] );→3×3行列(結果)

拡大縮小(2次元)を行う3×3行列を求める。



double4*→result[][]のポインタ
Scale4x4(
const double x,←拡大率x
const double y,←拡大率y
const double z,←拡大率z
double result[ 4 ][ 4 ] );→4×4行列(結果)

拡大縮小(3次元)を行う4×4行列を求める。



double3*→z[][]のポインタ
Rotate3x3(
const double a,←回転角(degree)
double result[ 3 ][ 3 ] );→3×3行列(結果)

回転(degree)を行う3×3行列を求める。



double3*→z[][]のポインタ
RotateRad3x3(
const double a,←回転角(radian)
double result[ 3 ][ 3 ] );→3×3行列(結果)

回転(radian)を行う3×3行列を求める。



double4*→result[][]のポインタ
RotateX4x4(
const double x,←x軸回転角(degree)
double result[ 4 ][ 4 ] );→4×4行列(結果)

x軸回転(degree)を行う4×4行列を求める。



double4*→result[][]のポインタ
RotateY4x4(
const double y,←y軸回転角(degree)
double result[ 4 ][ 4 ] );→4×4行列(結果)

y軸回転(degree)を行う4×4行列を求める。



double4*→result[][]のポインタ
RotateZ4x4(
const double z,←z軸回転角(degree)
double result[ 4 ][ 4 ] );→4×4行列(結果)

z軸回転(degree)を行う4×4行列を求める。



double4*→result[][]のポインタ
RotateXRad4x4(
const double x,←x軸回転角(radian)
double result[ 4 ][ 4 ] );→4×4行列(結果)

x軸回転(radian)を行う4×4行列を求める。



double4*→result[][]のポインタ
RotateYRad4x4(
const double y,←y軸回転角(radian)
double result[ 4 ][ 4 ] );→4×4行列(結果)

y軸回転(radian)を行う4×4行列を求める。



double4*→result[][]のポインタ
RotateZRad4x4(
const double z,←z軸回転角(radian)
double result[ 4 ][ 4 ] );→4×4行列(結果)

z軸回転(radian)を行う4×4行列を求める。



double4*→result[][]のポインタ
RotateAxis4x4(
const double angle,←回転角(degree)
const double axis[ 3 ],←回転軸ベクトル
double result[ 4 ][ 4 ],→4×4行列(結果)
bool* errResult = 0 );→エラー時、真(省略可)

任意の回転軸回りに回転(degree)を行う4×4行列を求める。



double4*→result[][]のポインタ
RotateAxisRad4x4(
const double angle,←回転角(radian)
const double axis[ 3 ],←回転軸ベクトル
double result[ 4 ][ 4 ],→4×4行列(結果)
bool* errResult = 0 );→エラー時、真(省略可)

任意の回転軸回りに回転(radian)を行う4×4行列を求める。



double3*→result[][]のポインタ
SetAxis(
const double mainAxis[ 3 ],←メイン軸
const double subAxis[ 3 ],←サブ軸
double result[ 2 ][ 3 ] );→平面

メイン軸とサブ軸により、平面を作成する。



double3*→result[][]のポインタ
SetAxisXYZ(
const double xAxis[ 3 ],←x軸
const double yAxis[ 3 ],←y軸
const double zAxis[ 3 ],←z軸
double result[ 3 ][ 3 ] );→座標系

xyz軸により、座標系を作成する。



double3*→z[][]のポインタ
CopyAxis(
const double a[ 2 ][ 3 ],←平面(コピー元)
double z[ 2 ][ 3 ] );→平面(コピー先)

平面をコピーする。



double3*→z[][]のポインタ
CopyAxisXYZ(
const double a[ 3 ][ 3 ],←座標系(コピー元)
double z[ 3 ][ 3 ] );→座標系(コピー先)

座標系をコピーする。



double3*→z[][]のポインタ
RegularAxis(
const double a[ 2 ][ 3 ],←平面
double z[ 2 ][ 3 ],→平面(結果)
bool* errResult = 0 );→エラー時、真(省略可)

平面を正規化(各軸を単位ベクトルにし、サブ軸をメイン軸と90°になるように回転)する。



double3*→result[][]のポインタ
MakeSubAxis(
const double mainAxis[ 3 ],←メイン軸
double result[ 2 ][ 3 ],→サブ軸(結果)
bool* errResult = 0 );→エラー時、真(省略可)

サブ軸が任意方向でかまわない場合、この関数によりメイン軸からサブ軸を自動作成できる。



double4*→result[][]のポインタ
RotWorldToLocal(
const double axis[ 2 ][ 3 ],←ローカル平面
double result[ 4 ][ 4 ],→4×4行列(結果)
bool* errResult = 0 );→エラー時、真(省略可)

ワールド平面(ワールド座標xy平面)がローカル平面になるように回転した場合の、4×4行列を作成。



double4*→result[][]のポインタ
RotLocalToWorld(
const double axis[ 2 ][ 3 ],←ローカル平面
double result[ 4 ][ 4 ],→4×4行列(結果)
bool* errResult = 0 );→エラー時、真(省略可)

ローカル平面がワールド平面(ワールド座標xy平面)になるように回転した場合の、4×4行列を作成。



double4*→result[][]のポインタ
RotateAxis(
const double srcAxis[ 2 ][ 3 ],←ローカル平面(回転前)
const double dstAxis[ 2 ][ 3 ],←ローカル平面(回転後)
double result[ 4 ][ 4 ],→4×4行列(結果)
bool* errResult = 0 );→エラー時、真(省略可)

ローカル平面(回転前)がローカル平面(回転後)になるように回転した場合の、4×4行列を作成。



bool→sin値が負数の場合、真
IsMinusSin(
const double axis[ 3 ],←回転軸
const double zeroDegVec[ 3 ],←ゼロ度となるライン(ベクトル)
const double vecOnPlane[ 3 ] );←チェックしたいベクトル
(回転軸を法線とする平面上にあること)

sin値(三角関数)が負数であるか、チェックする。



double→角度(degree)
CosToDeg(
const double cosP,←cos値(三角関数)
const bool minusSin,←sin値(三角関数)の正負(負の時、真)
bool* errResult = 0 );→エラー時、真(省略可)

cos値とsin値から角度(degree)を求める。



double→角度(radian)
CosToRad(
const double cosP,←cos値(三角関数)
const bool minusSin,←sin値(三角関数)の正負(負の時、真)
bool* errResult = 0 );→エラー時、真(省略可)

cos値とsin値から角度(radian)を求める。



double→角度(radian)
NegateRad(
const double rad );←角度(radian)

入力角度(radian)に対し、180°加算した角度を出力する。



double→角度(degree)
NegateDeg(
const double deg );←角度(degree)

入力角度(degree)に対し、180°加算した角度を出力する。



double→角度(radian)
RegularRad(
const double rad );←角度(radian)

入力角度(radian)に対し、正規化(-π〜πの範囲にする)を行う。



double→角度(degree)
RegularDeg(
const double deg );←角度(degree)

入力角度(degree)に対し、正規化(-180°〜180°の範囲にする)を行う。



double→角度(radian)
UnsignedRegularRad(
const double rad );←角度(radian)

入力角度(radian)に対し、正値の正規化(0〜2πの範囲にする)を行う。



double→角度(degree)
UnsignedRegularDeg(
const double deg );←角度(degree)

入力角度(degree)に対し、正値の正規化(0°〜360°の範囲にする)を行う。




2. bxUtil.h

double*→pos[]のポインタ
PosBezierLine(
const double bezierLine[ 4 ][ 3 ],←ベジェ曲線
const double t,←パラメータ値
double pos[ 3 ] );→位置

任意のベジェ曲線に対して、パラメータ値tでの位置座標を出力する。




(C)1999-2012 EISHIN All Rights Reserved.