NURBS演算ライブラリ
【NURBS_Func.h】
NURBS操作モジュールを提供します。
■シンボル
#define PTNUMMAX 10000 NURBSの点列の最大数
#define RANKMAX 9 NURBSの階数の最大値
#define INTERSECPTNUMMAX 1000 交点格納配列長
#define NEAREST_GAP 0.01 2点が同一点とみなす距離
#define CONVERG_GAP 0.00001 ニュートン法の収束を判別する閾値
#define LOOPCOUNTMAX 10000 収束計算回数の条件
#define CONVDIVNUM 10 収束計算用のパラメータ分割数
#define TRM_BORDERDIVNUM 20 トリム境界線上に生成する点の数
#define FORWARD 1 交線追跡の方向(順)
#define INVERSE 0 交線追跡の方向(逆)
#define OUTTER_TRIM 0 外周トリミング領域
#define INNER_TRIM 1 内周トリミング領域
■インクルードライブラリ
"BODY.h" "Describe_BODY.h"
■型定義
なし
■クラス
NURBS_Func
<継承>
BODY_Handler
■関数(Class NURBS_Func)
public
Coord CalcNurbsCCoord(NURBSC *NurbsC)
Coord CalcNurbsSCoord(NURBSS *NurbsS)
- <説明>
- 指定したパラメータにおけるNURBS曲線/曲面の座標値を求める。
- <引数>
- *NurbsC / *NurbsS:NURBS曲線/曲面へのポインタ
- <戻り値>
- NURBS曲線/曲面の座標値
public
void CalcNurbsCCoords(NURBSC *NurbsC,int Ptnum,double *T,Coord *Pt)
void CalcNurbsSCoords(NURBSS *NurbsS,int Ptnum,Coord *UV,Coord *Pt)
- <説明>
- 指定したパラメータ群におけるNURBS曲線/曲面の座標値群を求める。
- <引数>
- *NurbsC / *NurbsS:NURBS曲線/曲面へのポインタ
Ptnum:求める点群の数
T/UV:NURBS曲線/曲面のパラメータ群
Pt:NURBS曲線/曲面の座標値
- <戻り値>
- なし
public
Coord CalcDiffuNurbsS(NURBSS *NurbsS,double div_u,double div_v);
Coord CalcDiffvNurbsS(NURBSS *NurbsS,double div_u,double div_v);
- <説明>
- 指定したパラメータにおけるNURBS曲面のu/v方向の1階微分係数を求める。
- <引数>
- *NurbsS:NURBS曲面へのポインタ
div_u:uパラメータ
div_v:vパラメータ
- <戻り値>
- 1階微分係数
public
int GenNurbsC(NURBSC *NurbsC,int K,int M,int N,double T[],double W[],Coord cp[],double V[],int prop)
int GenNurbsC(NURBSC *NurbsC,NURBSC nurb)
- <説明>
- 1つのNURBS曲線を生成/コピーする。
- <引数>
- *NurbsC:NURBS曲線へのポインタ
K:コントロールポイントの数
M:階数
N:ノットベクトルの数
T[]:ノットシーケンスの値
W[]:Weightの値
cp[]:コントロールポイントの値
V[]:パラメータの範囲
prop[]:各プロパティの値
euflag:ディレクトリ部 Entity Use Flagの値
*NurbsC:新たに生成するNURBS曲線
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
public
int GenNurbsS(NURBSS *NurbsS,int Mu,int Mv,int Ku,int Kv,double *S,double *T,double **W,Coord **Cp,double U_s,double U_e,double V_s,double V_e)
int NURBS_Func::GenNurbsS(NURBSS *Nurbs,NURBSS nurb)
- <説明>
- 1つのNURBS曲面を生成/コピーする。
- <引数>
- *NurbsS:NURBS曲面へのポインタ
Mu:u方向の階数
Mv:v方向の階数
Ku:u方向のコントロールポイントの数
Kv:v方向のコントロールポイントの数
*S:u方向のノットベクトルの値
*T:v方向のノットベクトルの値
**W:Weightの値
**Cp:コントロールポイントの値
U_s:uパラメータの範囲の最初の値
U_e:uパラメータの範囲の最後の値
V_s:vパラメータの範囲の最初の値
V_e:vパラメータの範囲の最後の値
*NurbsS:新たに生成するNURBS曲線
nurb:コピーするNURBS曲面
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
public
int GenRotNurbsS(NURBSS *NurbsS,NURBSC NurbsC,Coord Axis,double deg)
- <説明>
- NURBS曲線を原点を通る任意の回転軸回りにある角度だけ回転させ、回転サーフェスを生成する。
- <引数>
- *NurbsS:生成された回転サーフェス
NurbsC:回転させるNURBS曲線
Axis:任意の回転軸
deg:回転角度
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
public
int GenSweepNurbsS(NURBSS *NurbsS,NURBSC NurbsC,Coord Axis,double Len)
- <説明>
- NURBS曲線を原点を通る任意の回転軸回りにある角度だけ回転させ、回転サーフェスを生成する。
- <引数>
- *NurbsS:生成されたスイープサーフェス
NurbsC:スイープさせるNURBS曲線
Axis:任意の軸
Len:移動距離
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
public
int GenTrimdNurbsS(TRIMD_NURBSS *TNurbs,TRIMD_NURBSS tnurb)
- <説明>
- トリム面を有するNURBS曲面を生成する。
- <引数>
- *Tnurbs:新たに生成するトリム面
nurb:元となるトリム面
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
public
int DelTrimdNurbsS(TRIMD_NURBSS *TNurbs)
- <説明>
- GenTrimdNurbsS()によって生成されたトリム面を削除する。
- <引数>
- *Tnurbs:削除するトリム面
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
public
void DelNurbsC(NURBSC *NurbsC)
void DelNurbsS(NURBSS *NurbsS)
- <説明>
- GenNurbsC()/GenNurbsS()によって生成されたNURBS曲線/曲面を削除する。
- <引数>
- *NurbsC/*NurbsS:削除するNURBS曲線/曲面
- <戻り値>
- なし
public
double CalcBSbasis(double t, double knot[],int N,int I,int M)
- <説明>
- GenNurbsC()/GenNurbsS()によって生成されたNURBS曲線/曲面を削除する。
- <引数>
- t:ノット
knot[]:ノットベクトル
N:ノットベクトルの数
I:Bスプライン基底関数下添え字の1つ目(0〜)
M:Bスプライン基底関数下添え字の2つ目(階数)
- <戻り値>
- Bスプライン基底関数の計算結果
public
double CalcDiffBSbasis(double t,double knot[],int N,int I,int M)
- <説明>
- Bスプライン基底関数の1階微分係数を求める。
- <引数>
- t:ノット
knot[]:ノットベクトル
N:ノットベクトルの数
I:注目中のコントロールポイント
M:階数
- <戻り値>
- Bスプライン基底関数の1階微分係数の計算結果
public
double CalcDiffBSbasisN(double t,double knot[],int N,int I,int M,int Dn)
- <説明>
- Bスプライン基底関数のN階微分係数を求める。
- <引数>
- t:ノット
knot[]:ノットベクトル
N:ノットベクトルの数
I:注目中のコントロールポイント
M:階数
Dn:微分階数
- <戻り値>
- Bスプライン基底関数のN階微分係数の計算結果
public
Coord CalcDiffNurbsC(NURBSC *NurbsC,double t)
- <説明>
- NURBS曲線の1階微分係数を求める。
- <引数>
- *NurbsC:NURBS曲線へのポインタ
t:ノット
- <戻り値>
- NURBS曲線の1階微分係数
public
Coord CalcDiff2NurbsC(NURBSC *NurbsC,double t)
- <説明>
- NURBS曲線の2階微分係数を求める。
- <引数>
- *NurbsC:NURBS曲線へのポインタ
t:ノット
- <戻り値>
- NURBS曲線の2階微分係数
public
Coord CalcNormVecOnNurbsS(NURBSS *nurb,double u,double v)
- <説明>
- NURBS曲面上の(u,v)における方線ベクトルを求める。
- <引数>
- *nurb:NURBS曲面へのポインタ
u:uパラメータ
v:vパラメータ
- <戻り値>
- 単位法線ベクトル
public
int ClacuIntersecPtNurbsLine(NURBSS *Nurb,Coord r,Coord p,Coord *ans,Coord *param)
- <説明>
- NURBS曲面と直線の交点を算出する。
- <引数>
- *Nurb:NURBS曲面へのポインタ
r:直線N(t)上の1点
p:直線N(t)の方向
*ans:交点座標
*param:交点のu,v,tパラメータ
- <戻り値>
- KOD_ERR:収束しなかった
KOD_TRUE:収束した
public
int CalcIntersecCurve3(NURBSC *nurb,Coord pt,Coord nvec,double *ans,int ans_size)
- <説明>
- NURBS曲線と平面との交点を求める。
- <引数>
- *nurb:NURBS曲面へのポインタ
pt:平面上の一点
nvec:平面の法線ベクトル
*ans:算出された交点のtパラメータ値
ans_size:ansの配列長
- <戻り値>
- 交点の個数
交点は最大で(M-1)*(K-M+1)点得られる。
よって引数*ansは(M-1)*(K-M+1)個の配列を用意することが望ましい。
public
int CalcIntersecPtsPlaneV3(NURBSS *nurb,Coord pt,Coord nvec,int v_divnum,Coord *ans,int ans_size)
- <説明>
- 3次以下のNURBS曲面と平面との交点群を代数解法にて求める(vパラメータ)。
- <引数>
- *nurb:NURBS曲面へのポインタ
pt:平面上の一点
nvec:平面の法線ベクトル
v_divnum:vパラメータ分割数
*ans:算出された交点のu,vパラメータ値
ans_size:ansの配列長
- <戻り値>
- 交点の個数(交点の数がans_sizeを超えた:KOD_ERR)
public
int CalcIntersecPtsPlaneU3(NURBSS *nurb,Coord pt,Coord nvec,int u_divnum,Coord *ans,int ans_size)
- <説明>
- 3次以下のNURBS曲面と平面との交点群を代数解法にて求める(vパラメータ)。
- <引数>
- *nurb:NURBS曲面へのポインタ
pt:平面上の一点
nvec:平面の法線ベクトル
u_divnum:uパラメータ分割数
*ans:算出された交点のu,vパラメータ値
ans_size:ansの配列長
- <戻り値>
- 交点の個数(交点の数がans_sizeを超えた:KOD_ERR)
public
int CalcIntersecPtsPlaneSearch3(NURBSS *nurb,Coord pt,Coord nvec,double ds,int initdivnum,Coord *ans,int ans_size)
- <説明>
- NURBS曲面と平面との交点群を交線追跡法にて求める。
- <引数>
- *nurb:NURBS曲面へのポインタ
pt:平面上の一点
nvec:平面の法線ベクトル
ds:交線(交点群)の粗さ(密0.1〜2疎)
*ans:算出された交点のu,vパラメータ値
ans_size:ansの配列長
- <戻り値>
- 交点の個数(NURBS曲面と平面が交差していない:KOD_FALSE、交点の数がans_sizeを超えた:KOD_ERR)
public
int CalcIntersecPtsNurbsSGeom(NURBSS *nurbR,NURBSS *nurbS,int u_divnum,int v_divnum,Coord *ansR,Coord *ansS,int ans_size)
- <説明>
- NURBS曲面S(u,v)とNURBS曲面R(w,t)の交線(交点群)を幾何学的にて求める(補助平面を用いた解法)
- <引数>
- *nurbR:NURBS曲面R(w,t)へのポインタ
*nurbS:NURBS曲面S(u,v)へのポインタ
u_divnum:uパラメータの分割数
v_divnum:vパラメータの分割数
*ansR:算出された交点のw,tパラメータ値
*ansS:算出された交点のu,vパラメータ値
ans_size:ansの配列長
- <戻り値>
- 交点の個数(交点の数がans_sizeを超えた:KOD_ERR)
public
int CalcIntersecPtsNurbsSSearch(NURBSS *nurbR,NURBSS *nurbS,int div,double ds,Coord *ansR,Coord *ansS,int ans_size)
- <説明>
- NURBS曲面S(u,v)とNURBS曲面R(w,t)の交線(交点群)を交点追跡法にて求める。
- <引数>
- *nurbR:NURBS曲面R(w,t)へのポインタ
*nurbS:NURBS曲面S(u,v)へのポインタ
div:パラメータの分割数
ds:交線(交点群)の粗さ(密0.1〜2疎)
*ansR:算出された交点のw,tパラメータ値
*ansS:算出された交点のu,vパラメータ値
ans_size:ansの配列長
- <戻り値>
- NURBS曲面同士が交差していない:KOD_FALSE 特異点または発散により処理を中断:KOD_ERR
public
int GetBSplCoef3(int, int, int, double *, double **)
int GetBSplCoef2(int, int, int, double *, double **)
int GetBSplCoef1(int, int, int, double *, double **)
- <説明>
- 3/2/1次のBスプライン曲線の各係数を求める。
- <引数>
- M:階数
K:コントロールポイントの数
i:注目中のコントロールポイント
*t:ノットベクトル列
*coef:算出される係数
- <戻り値>
- 正常終了:KOD_TRUE
public
void ShiftNurbsC(NURBSC *nurbs,Coord shift)
void ShiftNurbsS(NURBSS *nurbs,Coord shift)
- <説明>
- NURBS曲線/曲面をシフトする。
- <引数>
- *NurbsC/*NurbsS:シフトされるNURBS曲線/曲面
shift:シフト量
- <戻り値>
- なし
public
void ChRatioNurbsC(NURBSC *NurbsC,Coord ratio)
void ChRatioNurbsS(NURBSS *NurbsS,Coord ratio)
- <説明>
- NURBS曲線/曲面の倍率を変更する。
- <引数>
- *NurbsC/*NurbsS:変更されるNURBS曲線/曲面
ratio:倍率
- <戻り値>
- なし
public
int SetCPNurbsS(NURBSS *nurbs,NURBSS Nurbs)
- <説明>
- NURBS曲面間にコントロールポイントを代入する。
- <引数>
- *nurbs:代入されるNURBS曲面
Nurbs:代入元のNURBS曲面
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
public
int GenInterpolatedNurbsC1(NURBSC *Nurbs,Coord *P,int PNum,int N)
- <説明>
- 与えられた点列を補間する最高4階のNURBS曲線を生成する(端末条件を与えない)。
- <引数>
- *Nurbs:生成されるNURBS曲線
*P:点列
PNum:点列の数
M:階数
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
public
int GenInterpolatedNurbsC2(NURBSC *Nurbs,Coord *P_,int PNum,int N)
- <説明>
- 与えられた点列を補間する最高4階のNURBS曲線を生成する(端末条件:始点とC2で一致)。
- <引数>
- *Nurbs:生成されるNURBS曲線
*P_:通過点列
PNum:通過点列の数
M:階数
- <戻り値>
- 正常終了:KOD_TRUE
始点と終点の不一致:KOD_FALSE
点列の数が1個未満:KOD_ERR
public
int GenApproximationNurbsC(NURBSC *Nurbs,Coord *P,int PNum,int M)
- <説明>
- 与えられた点列を近似するn階のNURBS曲線を生成する。
- <引数>
- *Nurbs:生成されるNURBS曲線
*P:点列
Pnum:点列の数
M:階数
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
public
int GenPolygonalLine(NURBSC *Nurbs,Coord *P,int PNum)
- <説明>
- 折れ線を生成する。
- <引数>
- *Nurbs:生成されるNURBS曲線
*P:コントロールポイント
PNum:コントロールポイントの数
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
public
int GenInterpolatedNurbsS1(NURBSS *Nurbs,Coord **P,int PNum_u,int PNum_v,int Mu,int Mv)
- <説明>
- 与えられた点列を補間する最高4階のNURBS曲面を生成する。
- <引数>
- *Nurbs:生成されるNURBS曲面
**P:与えられた点列
PNum_u/PNum_v:点の数
Mu/Mv:階数
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
public
int GenPolygonalSurface(NURBSS *Nurbs,Coord **P,int PNum_u,int PNum_v)
- <説明>
- 折れ面を生成する。
- <引数>
- *Nurbs:生成されるNURBS曲面
**P:コントロールポイント
PNum_u/PNum_v:コントロールポイントの数
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
public
int DetermPtOnTRMSurf(TRMS *Trim,double u,double v)
- <説明>
- 注目中のNURBS曲面上の1点(u,v)がトリミング領域内にあるのかを判定する。
- <引数>
- *Trim:トリム曲面へのポインタ
u:注目中のuパラメータ
v:注目中のvパラメータ
- <戻り値>
- 面上(エッジ上含む):KOD_TRUE
面外:KOD_FALSE
エラー:KOD_ERR
public
void RotNurbsC(NURBSC *nurbs,Coord axis,double deg)
void RotNurbsS(NURBSS *nurbs,Coord axis,double deg)
- <説明>
- NURBS曲線/曲面をDベクトル回りにdeg(°)だけ回転させる。
- <引数>
- *nurbs:回転させるNURBS曲線/曲面
axis:回転軸の単位ベクトル
deg:角度(degree)
- <戻り値>
- なし
public
int DetectInterfereNurbsS(NURBSS *nurbR,NURBSS *nurbS,int divnum)
int DetectInterfereTrmS(TRIMD_NURBSS *tNurbR,TRIMD_NURBSS *tNurbS,int divnum)
- <説明>
- NURBS/トリム曲面S(u,v)とNURBS/トリム曲面R(w,t)の干渉を検出する。
- <引数>
- *nurbsR/tNurbsR:NURBS/トリム曲面R(w,t)
*nurbsS/tNurbsS:NURBS/トリム曲面S(u,v)
divnum:パラメータ分割数
- <戻り値>
- 干渉の有無(干渉あり:TRUE 干渉無し:FALSE)
public
double CalcNurbsCLength(NURBSC *Nurb)
- <説明>
- NURBS曲線の線分長を微小線分近似により求める。
- <引数>
- *Nurb:対象となるNURBS曲線
- <戻り値>
- 線分長
public
int CalcDeltaPtsOnNurbsC(NURBSC *Nurb,double D,Coord *Pts)
- <説明>
- 指定した間隔でNURBS曲線上の座標値を出力する。
- <引数>
- *Nurb:対象となるNURBS曲線
D:間隔
*Pts:出力される座標値を格納
- <戻り値>
- 点数
private
int GetNurbsCCoef(NURBSC *nurb,double **coef,int i,Coord *P,double *Q)
- <説明>
- NURBS曲線の係数を求める(最高3次)。
- <引数>
- *nurb:対象となるNURBS曲線
coef:Bスプライン基底関数の係数
i:曲線の番号
*P/*Q:NURBS曲線の係数(P,Q)
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
private
int CalcEquation(double *a,double *t,int M)
- <説明>
- 3次方程式まで解く。
- <引数>
- *a:係数
*t:解
M:次数
- <戻り値>
- 成功:KOD_TRUE
失敗:KOD_ERR
private
void GetNurbsSCoef(int M,double **coef,double *a,Coord *b,int i,Coord *P,double *Q)
- <説明>
- NURBS曲線C(u) or C(v)の係数を求める。
- <引数>
- M:階数
coef:Bスプライン基底関数の係数
*a/*b:u/vを固定した時のNURBS曲線C(v)/C(u)の分母/分子の係数
i:曲線の番号
*P/*Q:固定されたパラメータにおけるNURBS曲面の係数(P,Q)
- <戻り値>
- なし
private
void GetIntersecEquation(int M,Coord *P,double *Q,Coord pt,Coord nvec,double *a)
- <説明>
- NURBS曲線と平面の交線導出用方程式を得る。
- <引数>
- M:階数
*P/*Q:NURBS曲線の係数(P,Q)
pt:平面上の一点
nvec:平面の法線ベクトル
*a:結果
- <戻り値>
- なし
private
int SearchIntersectPt(NURBSS *nurb,Coord pt,Coord nvec,double ds,double *u,double *v,int direction)
int SearchIntersectPt_RKM(NURBSS *S,Coord pt,Coord n,double delta,double *u,double *v,int direction)
- <説明>
- ニュートン法により交点を真値に収束させる
- <引数>
- *nurb/nurbR:1つ目の対象となるNURBS曲面
pt,nvec/nurbS:2つ目の対象となる平面/NURBS曲面
ds:粗さ
*u,*v,*w,*t:パラメータ
direction:追跡方向を表すフラグ
- <戻り値>
- 収束した場合:KOD_TRUE
パラメータ範囲外:KOD_FALSE
失敗:KOD_ERR
private
int DetermPtOnTRMSurf_sub(CONPS *Conps,double u,double v)
- <説明>
- 面上線のタイプが複合曲線の場合のトリミング領域内外判定
- <引数>
- *Conps:面上線へのポインタ
u/v:パラメータ
- <戻り値>
- 内外判定(失敗:KOD_ERR)
private
void GetKnot(Vector T_,int N,int K,int M,Vector T)
- <説明>
- 面上線のタイプが複合曲線の場合のトリミング領域内外判定
- <引数>
- T_:曲線パラメータ列
N:ノットベクトルの数
M:階数
T:格納するノットベクトル列
- <戻り値>
- なし
private
void GetKnotParam1(Coord *P,int PNum,Vector T_)
- <説明>
- 各通過点の曲線パラメータを算出(コード長の比から算出)
- <引数>
- *P:通過点列
PNum:通過点列の数
T_:曲線パラメータを格納
- <戻り値>
- なし
private
void GetKnotParam2(Coord *P,int PNum,Vector T_)
- <説明>
- 各通過点の曲線パラメータを算出(コード長の平方根の比から算出)
- <引数>
- *P:通過点列
PNum:通過点列の数
T_:曲線パラメータを格納
- <戻り値>
- なし