Kodatuno Logo
Kodatuno User's Guide
Prev Index Next


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_:曲線パラメータを格納
<戻り値>
なし



Document Release 1.0 for Kodatuno R1.1, Mar. 2011


Prev index Next

Copyright(C) Kodatuno Development Team, 2011 Last modified: Mar. 3, 2011