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

6章 bxCore.h

1. 構造体

1) AxisForDefault
GetDefaultAxis()用の構造体。

struct AxisForDefault {
AxisForDefaultIn in;入力データ
AxisForDefaultOut out;入出力データ
};

struct AxisForDefaultIn {
double vertexPos[ 3 ];頂点
ushort numRadial;境界曲線数(共有頂点上)
bool loopFlag;ループ頂点/非ループ頂点
AxisForDefaultSub* radial;境界曲線毎情報用配列(共有頂点上)
};

struct AxisForDefaultSub {
double vertexPos[ 3 ];対向頂点
};

struct AxisForDefaultOut {
double axisVec[ 2 ][ 3 ];頂点平面
};


2) HandleForTrans
GetDefaultHandle()、GetHandle()、ConvEdge()用の構造体。

struct HandleForTrans {
HandleForTransIn in;入力データ
HandleForTransOut out;入出力データ
};

struct HandleForTransIn {
double vertexPos[ 3 ];頂点
double axisVec[ 2 ][ 3 ];頂点平面
double radialVertexPos[ 3 ];対向頂点(ハンドル方向)
};

struct HandleForTransOut {
double handleVec[ 2 ];ハンドル
};


3) HandleForTransPlus
SetHandleInfo()用の構造体。

struct HandleForTransPlus {
HandleForTransPlusIn in;入力データ
HandleForTransPlusOut out;入出力データ
};

struct HandleForTransPlusIn {
double vertexPos[ 3 ];頂点
double radialVertexPos[ 3 ];対向頂点(ハンドル方向)
double wingHandle[ 2 ][ 2 ];ウイングハンドル
double lenRadialVec[ 2 ];ウイング頂点との頂点間距離
};

struct HandleForTransPlusOut {
double axisVec[ 2 ][ 3 ];頂点平面
double handleVec[ 2 ];ハンドル
};


4) VertexForRot
RotVertex()、GetNormalOnVertex()用の構造体。

struct VertexForRot {
VertexForRotOut out;入出力データ
};

struct VertexForRotOut {
double vertexPos[ 3 ];頂点
double axisVec[ 2 ][ 3 ];頂点平面
};


5) CtlPlaneDegForRot
GetAxisInCtlPlaneDeg()、GetNormalInCtlPlaneDeg()用の構造体。

struct CtlPlaneDegForRot {
CtlPlaneDegForRotIn in;入力データ
CtlPlaneDegForRotOut out;入出力データ。頂点0(単一境界曲線上)のデータ
};

struct CtlPlaneDegForRotIn {
CtlPlaneDegForRotSub sub[ 2 ];sub[ i ]とした場合、i は頂点番号(単一境界曲線上)
};

struct CtlPlaneDegForRotSub {
double vertexPos[ 3 ];頂点
double axisVec[ 2 ][ 3 ];頂点平面
double handleVec[ 2 ];ハンドル
};

struct CtlPlaneDegForRotOut {
double ctlPlaneDeg;ハンドル点法線
};


6) CtlVecForTrans
GetAxisInCtlVec()、GetCtlInCtlVec()用の構造体。

struct CtlVecForTrans {
CtlVecForTransIn in;入力データ
CtlVecForTransOut out;入出力データ。頂点0(単一境界曲線上)のデータ
};

struct CtlVecForTransIn {
CtlVecForTransSub sub[ 2 ];sub[ i ]とした場合、i は頂点番号(単一境界曲線上)
double ctlPlaneDeg;ハンドル点法線。頂点0(単一境界曲線上)のデータ
};

struct CtlVecForTransSub {
double vertexPos[ 3 ];頂点
double axisVec[ 2 ][ 3 ];頂点平面
double handleVec[ 2 ];ハンドル
double wingHandle[ 2 ][ 2 ];ウイングハンドル
double lenRadialVec[ 2 ];ウイング頂点との頂点間距離
};

struct CtlVecForTransOut {
double ctlVec[ 2 ];コントロールバー(単一曲面の1頂点上)
};


7) CtlVecForTransPlus
SetCtlInfo()用の構造体。

struct CtlVecForTransPlus {
CtlVecForTransPlusIn in;入力データ
CtlVecForTransPlusOut out;入出力データ。頂点0(単一境界曲線上)のデータ
};

struct CtlVecForTransPlusIn {
short minusPlusNo;コントロールバー番号
  (共有頂点内の基準ハンドル上)
CtlVecForTransSub sub[ 2 ];sub[ i ]とした場合、i は頂点番号(単一境界曲線上)
};

struct CtlVecForTransPlusOut {
double ctlPlaneDeg;ハンドル点法線
double ctlVec[ 2 ];コントロールバー(単一曲面の1頂点上)
};


8) CtlVecForDefault
GetDefaultCtlVec()用の構造体。

struct CtlVecForDefault {
CtlVecForDefaultIn in;入力データ
CtlVecForDefaultOut out;入出力データ
};

struct CtlVecForDefaultIn {
short numVertex;頂点数(単一曲面上)
CtlVecForDefaultInVertex vertex[ 4 ];頂点毎情報(単一曲面上)
};

struct CtlVecForDefaultInVertex {
double vertexPos[ 3 ];頂点
double axisVec[ 2 ][ 3 ];頂点平面
CtlVecForDefaultInEdge edge[ 2 ];edge[ i ]とした場合、
  i はハンドル番号(単一曲面の1頂点上)
};

struct CtlVecForDefaultInEdge {
double handleVec[ 2 ];ハンドル
double wingHandle[ 2 ];ウイングハンドル(該当曲面の外側の要素。
  この曲面の境界ではない方)
double lenRadialVec;ウイング頂点との頂点間距離
  (上記、ウイングハンドルの方向)
double ctlPlaneDeg;ハンドル点法線
double antiCtlVec[ 2 ];コントロールバー(該当曲面の外側の要素)
};

struct CtlVecForDefaultOut {
CtlVecForDefaultOutVertex vertex[ 4 ];頂点毎情報(単一曲面上)
};

struct CtlVecForDefaultOutVertex {
CtlVecForDefaultOutEdge edge[ 2 ];edge[ i ]とした場合、
  i はハンドル番号(単一曲面の1頂点上)
};

struct CtlVecForDefaultOutEdge {
double ctlVec[ 2 ];コントロールバー(該当曲面の内側の要素)
};


9) SurfaceForPick
ConvSurface()、DispChkOnEdgeSurface()用の構造体。

struct SurfaceForPick {
short numVertex;頂点数(単一曲面上)
SurfaceForPickVertex vertex[ 4 ];頂点毎情報(単一曲面上)
};

struct SurfaceForPickVertex {
double vertexPos[ 3 ];頂点
double axisVec[ 2 ][ 3 ];頂点平面
SurfaceForPickEdge edge[ 2 ];edge[ i ]とした場合、
  i はハンドル番号(単一曲面の1頂点上)
};

struct SurfaceForPickEdge {
double handleVec[ 2 ];ハンドル
double wingHandle[ 2 ];ウイングハンドル(該当曲面の外側の要素。
  この曲面の境界ではない方)
double lenRadialVec;ウイング頂点との頂点間距離
  (上記、ウイングハンドルの方向)
double ctlPlaneDeg;ハンドル点法線
double ctlVec[ 2 ];コントロールバー(該当曲面の内側の要素)
double antiCtlVec[ 2 ];コントロールバー(該当曲面の外側の要素)
};


10) PatchRec
ConvSurface()、PosNormalSurface()、PosSurface()、NormalSurface()用の構造体。

struct PatchRec {
short numVertex;頂点数(単一曲面上)
union {
RectPatch rect;4角曲面時の情報
TriPatch tri[ 3 ];3角曲面時の情報
};
};




2. 関数
←入力データ
→出力データ
⇔入出力データ


2-1. Public関数

bool→エラーの場合、真
ConvSurface(
const SurfaceForPick* src,←データベースからの入力データ
bool* dispChk,→変換データは有効(表示可能)か?
PatchRec* dst );→曲面内の位置座標、法線ベクトルを得るためのデータ形式

単一曲面に対して、通常のデータ形式からPatchRec形式に変換する。



bool→エラーの場合、真
PosNormalSurface(
const PatchRec* patch,←ConvSurface()の変換データ
const double uv[ 2 ],←パラメータ値
double pos[ 3 ],→位置座標
double normalVec[ 3 ] );→法線ベクトル

曲面内の位置座標と法線ベクトルを得る。



bool→エラーの場合、真
PosSurface(
const PatchRec* patch,←ConvSurface()の変換データ
const double uv[ 2 ],←パラメータ値
double pos[ 3 ] );→位置座標

曲面内の位置座標を得る。



bool→エラーの場合、真
NormalSurface(
const PatchRec* patch,←ConvSurface()の変換データ
const double uv[ 2 ],←パラメータ値
double normalVec[ 3 ] );→法線ベクトル

曲面内の法線ベクトルを得る。




2-2. Protected関数

bool→エラーの場合、真
GetDefaultAxis(
const AxisForDefaultIn* in,←データベースからの入力データ
AxisForDefaultOut* out );⇔データベースとの入出力データ

共有頂点とその対向頂点から、デフォルト(当ライブラリが類推した値)の頂点平面を作成する。
共有頂点と対向頂点を結び、直線化した場合、共有頂点の回りの曲面はポリゴンのようになる。このポリゴンの共有頂点上での法線を考えると、これらの法線の平均値が、デフォルトの頂点法線であり、これより頂点平面が求まる。
この関数の実行前は、頂点平面が不定値であってもかまわない。



bool→エラーの場合、真
GetDefaultHandle(
const HandleForTransIn* in,←データベースからの入力データ
HandleForTransOut* out );⇔データベースとの入出力データ

頂点と対向頂点、頂点平面等から、デフォルト(当ライブラリが類推した値)のハンドルを作成する。このデフォルト値を使うと、境界曲線が円弧になるべく近くなるように補正される。
この関数の実行前は、ハンドルが不定値であってもかまわない。



bool→エラーの場合、真
GetDefaultCtlVec(
const CtlVecForDefaultIn* in,←データベースからの入力データ
bool* dispChk,→出力データは表示可能か?
CtlVecForDefaultOut* out );⇔データベースとの入出力データ

デフォルト(当ライブラリが類推した値)のコントロールバーを作成する。このデフォルト値を使うと、曲面が球面になるべく近くなるように補正される。
この関数の実行前に、既にコントロールバーに値が入っている必要がある。



bool→エラーの場合、真
SetVertexPos(
const double newPos[ 3 ],←新しい頂点
double vertexPos[ 3 ] );⇔データベースとの入出力データ(頂点)

頂点を新しい位置に移す。



bool→エラーの場合、真
RotVertex(
const double origin[ 3 ],←回転中心位置
const double axis[ 3 ],←回転軸ベクトル
const double deg,←回転角
VertexForRotOut* rot );⇔データベースとの入出力データ

任意の中心と回転軸を使って、頂点を回転する。



bool→エラーの場合、真
ScaleVertex(
const double origin[ 3 ],←拡大縮小中心位置
const double scale,←拡大率
double vertexPos[ 3 ] );⇔データベースとの入出力データ(頂点)

任意の位置を中心として、頂点を拡大縮小する。



bool→エラーの場合、真
SetHandleVec(
const double newHandle[ 2 ],←新しいハンドル
double handleVec[ 2 ] );⇔データベースとの入出力データ(ハンドル)

頂点平面を変化しない範囲で、ハンドルを新しくする。



bool→エラーの場合、真
SetHandleInfo(
const double newHandleVec[ 3 ],←新しいハンドル(ベクトル値)
const HandleForTransPlusIn* in,←データベースからの入力データ
bool* dispChk,→出力データは表示可能か?
HandleForTransPlusOut* out );⇔データベースとの入出力データ

ハンドルが新しいベクトルになるように、頂点平面とハンドルを変化させる。



void
SetCtlPlaneDeg(
const double newCtl,←新しいハンドル点法線
double* ctlPlaneDeg );⇔データベースとの入出力データ(ハンドル点法線)

ハンドル点法線のみを変える。



void
SetCtlVec(
const double newCtl[ 2 ][ 2 ],←新しいコントロールバー(共有頂点内の基準ハンドル上)
double ctlVec[ 2 ][ 2 ] );⇔データベースとの入出力データ(コントロールバー)

ハンドル点法線を変化しない範囲で、コントロールバーを新しくする。



bool→エラーの場合、真
SetCtlInfo(
const double newCtlVec[ 3 ],←新しいコントロールバー(単一曲面の1頂点上。ベクトル値)
const CtlVecForTransPlusIn* in,←データベースからの入力データ
bool* dispChk,→出力データは表示可能か?
CtlVecForTransPlusOut* out );⇔データベースとの入出力データ

コントロールバーが新しいベクトルになるように、ハンドル点法線とコントロールバーを変化させる。



void
GetNormalOnVertex(
const VertexForRot* data,←データベースからの入力データ
double normalVec[ 3 ] );→頂点法線

頂点法線を得る。



bool→エラーの場合、真
GetHandle(
const HandleForTrans* handle,←データベースからの入力データ
bool* dispChk,→出力データは表示可能か?
double handleVec[ 3 ] );→ハンドル(ベクトル値)

ハンドル(ベクトル値)を得る。



bool→エラーの場合、真
GetAxisInCtlPlaneDeg(
const CtlPlaneDegForRot* ctl,←データベースからの入力データ
bool* dispChk,→出力データは表示可能か?
double axisVec[ 3 ] );→ハンドル点回転軸(ベクトル値)

ハンドル点回転軸(ベクトル値)を得る。



bool→エラーの場合、真
GetNormalInCtlPlaneDeg(
const CtlPlaneDegForRot* ctl,←データベースからの入力データ
bool* dispChk,→出力データは表示可能か?
double normalVec[ 3 ] );→ハンドル点法線(ベクトル値)

ハンドル点法線(ベクトル値)を得る。



bool→エラーの場合、真
GetAxisInCtlVec(
const CtlVecForTrans* ctl,←データベースからの入力データ
bool* dispChk,→出力データは表示可能か?
double axis[ 2 ][ 3 ] );→ハンドル点平面

ハンドル点平面を得る。



bool→エラーの場合、真
GetCtlInCtlVec(
const CtlVecForTrans* ctl,←データベースからの入力データ
bool* dispChk,→出力データは表示可能か?
double ctlVec[ 3 ] );→コントロールバー(ベクトル値)

コントロールバー(ベクトル値)を得る。



bool→エラーの場合、真
ConvEdge(
const HandleForTrans vertex[ 2 ],←データベースからの入力データ
bool* dispChk,→出力データは表示可能か?
double bezierLine[ 4 ][ 3 ] );→ベジェ曲線

データベース入力データ(境界曲線)を、ベジェ曲線(制御点位置)データに変換する。



bool→エラーの場合、真
ErrChkAxisVec(
const double axisVec[ 2 ][ 3 ] );←データベースからの入力データ(頂点平面)

現在の頂点平面データがエラー値であるかどうか、判定する。



bool→エラーの場合、真
ErrChkHandleVec1(
const double handleVec1 );←ハンドルの「頂点間距離に対する長さ比率」
  = handleVec[ 1 ]

現在のハンドルの「頂点間距離に対する長さ比率」データがエラー値であるかどうか、判定する。



bool→エラーの場合、真
ErrChkCtlPlaneDeg(
const double ctlPlaneDeg );←データベースからの入力データ(ハンドル点法線)

現在のハンドル点法線データがエラー値であるかどうか、判定する。



bool→エラーの場合、真
ErrChkCtlVec(
const double ctlVec[ 2 ][ 2 ] );←データベースからの入力データ(コントロールバー)

現在のコントロールバーデータがエラー値であるかどうか、判定する。



ushort→境界曲線数(共有頂点上)の最大値
MaxNumRadial( void );

境界曲線数(共有頂点上)の最大値を得る。



bool→エラーの場合、真
DispChkOnEdgeSurface(
const SurfaceForPick* data,←データベースからの入力データ
bool* dispChk );→このデータは表示可能か?

任意の曲面に対して、現在表示可能かどうか、判定する。




(C)1999-2012 EISHIN All Rights Reserved.