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           内周トリミング領域
#define RUNGE_KUTTA         0           Runge-Kutta法のシンボル
#define BULIRSH_STOER       1           Bulirsch-Stoer法のシンボル



■インクルードライブラリ

"BODY.h" "Quaternion.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);
Coord CalcDiffNNurbsS(NURBSS *NurbsS,int k,int l,double div_u,double div_v);

<説明>
指定したパラメータにおけるNURBS曲面のu/v方向の1階/N階微分係数を求める.
<引数>
*NurbsS:NURBS曲面へのポインタ
div_u:uパラメータ
div_v:vパラメータ
k:u方向微分階数 l:v方向微分階数
<戻り値>
微分係数


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 GenIsoparamCurveU(NURBSS *P,double u,NURBSC *C)

<説明>
NURBS曲面上のu方向パラメータ値を固定したときのアイソパラメトリックNURBS曲線を生成する.
<引数>
*NurbsS:アイソパラメトリック曲線生成元のNURBS曲面
u:u方向の固定パラメータ
*C:生成されたアイソパラメトリック曲線
<戻り値>
成功:KOD_TRUE
失敗:KOD_ERR (引数uが*Pのuパラメータ範囲外)


public
int GenIsoparamCurveV(NURBSS *P,double v,NURBSC *C)

<説明>
NURBS曲面上のv方向パラメータ値を固定したときのアイソパラメトリックNURBS曲線を生成する.
<引数>
*NurbsS:アイソパラメトリック曲線生成元のNURBS曲面
v:v方向の固定パラメータ
*C:生成されたアイソパラメトリック曲線
<戻り値>
成功:KOD_TRUE
失敗:KOD_ERR (引数vが*Pのvパラメータ範囲外)


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 CalcDiffNNurbsC(NURBSC *NurbsC,int r,double t)

<説明>
NURBS曲線のN階微分係数を求める.
<引数>
*NurbsC:NURBS曲線へのポインタ
r:微分階数 t:ノット
<戻り値>
NURBS曲線の微分係数


public
Coord CalcNormVecOnNurbsS(NURBSS *nurb,double u,double v)

<説明>
NURBS曲面上の(u,v)における法線ベクトルを求める.
<引数>
*nurb:NURBS曲面へのポインタ
u:uパラメータ
v:vパラメータ
<戻り値>
単位法線ベクトル


public
Coord CalcDiffuNormVecOnNurbsS(NURBSS *nurb,double u,double v)
Coord CalcDiffvNormVecOnNurbsS(NURBSS *nurb,double u,double v)

<説明>
NURBS曲面上の(u,v)における法線ベクトルのu/v方向1階微分を求める.
<引数>
*nurb:NURBS曲面へのポインタ
u:uパラメータ
v:vパラメータ
<戻り値>
計算結果


public
double CalcMeanCurvature(NURBSS *nurb,double u,double v)
double CalcMeanCurvature(SFQuant q)

<説明>
NURBS曲面上の(u,v)における平均曲率を求める.
<引数>
*nurb:NURBS曲面へのポインタ
u:uパラメータ
v:vパラメータ
q:曲面の基本量
<戻り値>
平均曲率


public
Coord CalcMeanCurvatureNormVec(NURBSS *nurb,double u,double v)

<説明>
NURBS曲面上の(u,v)における平均曲率法線ベクトルを求める.
<引数>
*nurb:NURBS曲面へのポインタ
u:uパラメータ
v:vパラメータ
<戻り値>
平均曲率法線ベクトル


public
double CalcGaussCurvature(NURBSS *nurb,double u,double v)
double CalcGaussCurvature(SFQuant q)

<説明>
NURBS曲面上の(u,v)におけるガウス曲率を求める.
<引数>
*nurb:NURBS曲面へのポインタ
u:uパラメータ
v:vパラメータ
q:曲面の基本量
<戻り値>
ガウス曲率


public
Coord CalcGaussCurvatureNormVec(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 CalcIntersecPtNurbsPt(NURBSS *S,Coord P,int Divnum,double Stepsize,Coord *Q)

<説明>
NURBS曲面S上における空間上の1点Pからの最近傍点Qをニュートン法により求める.
<引数>
*Nurb:NURBS曲面へのポインタ
P:空間上の任意点 Divnum:ニュートン法初期値指定用の曲面分割数
Stepsize:ニュートンパラメータ更新時のステップサイズ(1 <= Stepsize < 0)
*Q:交点のu,vパラメータ
<戻り値>
KOD_FALSE:収束しなかった
KOD_TRUE:収束した


public
int CalcIntersecCurve(NURBSC *nurb,Coord pt,Coord nvec,int Divnum,double *ans,int ans_size)

<説明>
NURBS曲線と平面との交点をニュートン法により求める.
<引数>
*nurb:NURBS曲面へのポインタ
pt:平面上の一点
nvec:平面の法線ベクトル
Divnum:NURBS曲線のパラメータ分割数(初期点探索用) *ans:算出された交点のtパラメータ値
ans_size:ansの配列長
<戻り値>
交点の個数
交点は最大で(M-1)*(K-M+1)点得られる. よって引数*ansは(M-1)*(K-M+1)個の配列を用意することが望ましい.


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 CalcIntersecPtsPlaneSearch(NURBSS *nurb,Coord pt,Coord nvec,double ds,int initdivnum,Coord *ans,int ans_size,int method)

<説明>
NURBS曲面と平面との交点群を交線追跡法にて求める.
<引数>
*nurb:NURBS曲面へのポインタ
pt:平面上の一点
nvec:平面の法線ベクトル
ds:交線(交点群)の粗さ(密0.1〜2疎)
*ans:算出された交点のu,vパラメータ値
ans_size:ansの配列長
method : 交点算出時の数値計算法の選択(RUNGE_KUTTA:ルンゲクッタ法, BULIRSH_STOER:Bulirsh-Stoer法)
<戻り値>
交点の個数(NURBS曲面と平面が交差していない:KOD_FALSE,交点の数がans_sizeを超えた:KOD_ERR)


public
int CalcIntersecPtsNurbsSNurbsC(NURBSS *NurbsS,NURBSC *NurbsC,int Divnum,Coord *ans,int ans_size)

<説明>
NURBS曲面とNURBS曲線との交点群を交線追跡法で求める.
<引数>
*NurbsS:NURBS曲面へのポインタ
*NurbsC:NURBS曲線へのポインタ
Divnum:初期点サーチ時の曲線分割数 *ans:解を格納 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 CalcIntersecPtsNurbsCNurbsCParam(NURBSC *NurbA,NURBSC *NurbB,int Divnum,Coord *ans,int ans_size)

<説明>
NURBS曲線同士の交点を求めるをニュートン法にて求める.
<引数>
*NurbA,NurbB:2つのNURBS曲線へのポインタ
DivNum:初期点サーチ時の曲線分割数
*ans:解を格納
ans_size:ans配列の配列長
<戻り値>
交点の数(交点の数がans_sizeを超えた: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 GenNurbsCfromCP(NURBSC *Nurbs,Coord *P,int PNum,int M)

<説明>
コントロールポイントから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 GenApproximationNurbsS(NURBSS *Nurbs,Coord **P,int PNum_u,int PNum_v,int Mu,int Mv)

<説明>
与えられた点列を近似するn階のNURBS曲面を生成する.
<引数>
*Nurbs:生成されるNURBS曲面
**P:与えられた点列
PNum_u/PNum_v:点の数
Mu,Mv:u方向,v方向の階数
<戻り値>
成功:KOD_TRUE
失敗:KOD_ERR


public
int GenNurbsSfromCP(NURBSS *Nurbs,Coord **P,int PNum_u,int PNum_v,int Mu,int Mv)

<説明>
与えられたコントロールポイントからn階のNURBS曲面を生成する.
<引数>
*Nurbs:生成されるNURBS曲面
**P:与えられたコントロールポイント列
PNum_u/PNum_v:点の数
Mu,Mv:u方向,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 CalcIntersecPtsPlaneGeom(NURBSS *nurb,Coord pt,Coord nf,int u_divnum,int v_divnum,Coord *ans,int ans_size)

<説明>
NURBS曲面と平面との交点群を幾何学的に求める(補助平面を用いた解法).
<引数>
*Nurb:NURBS曲面
pt:平面上の一点 nf:平面の法線ベクトル u_divnum:初期点サーチ時のuパラメータ分割数 v_divnum:初期点サーチ時のvパラメータ分割数 *ans:算出された交点のu,vパラメータ値をそれぞれans.x,ans.yに格納 ans_size:ansの配列長
<戻り値>
交点の個数(交点の数がans_sizeを超えた:KOD_ERR)


public
double CalcNurbsCLength(NURBSC *Nurb)

<説明>
NURBS曲線の線分長を微小線分近似により求める.
<引数>
*Nurb:対象となるNURBS曲線
<戻り値>
線分長


public
int CalcDeltaPtsOnNurbsC(NURBSC *Nurb,double D,Coord *Pts)

<説明>
指定した間隔でNURBS曲線上の座標値を出力する.
<引数>
*Nurb:対象となるNURBS曲線
D:間隔
*Pts:出力される座標値を格納
<戻り値>
点数


public
int CalcExtremumNurbsC(NURBSC *C,Coord nf,double *pt,int ptnum)

<説明>
NURBS曲線の指定した方向における極値の座標値を得る.
<引数>
*C:極値座標を求めたいNURBS曲線へのポインタ
nf:方向ベクトル
*pt:得られた極値のNurbs曲線パラメータ値列
ptnum:*ptの配列長
<戻り値>
得られた極値パラメータの数 (KOD_FALSE:得られなかった KOD_ERR:極値パラメータの数がptnumを超えた)


public
int New_NurbsC(NURBSC *nurb,int K, int N)

<説明>
Nurbs曲線のメモリー確保.
<引数>
*nurb:極値座標を求めたいNURBS曲線へのポインタ
K:コントロールポイントの数
N:ノットベクトルの数
<戻り値>
KOD_TURE:メモリー確保に成功 KOD_ERR:メモリー確保に失敗


public
void Free_NurbsC_1DArray(NURBSC *a,int num)

<説明>
NURBS曲線配列のメモリー解放.
<引数>
*a:NURBS曲線配列へのポインタ
num:配列長
<戻り値>
なし


public
void Free_NurbsC(NURBSC *a)

<説明>
NURBS曲線のメモリー解放.
<引数>
*a:NURBS曲線へのポインタ
<戻り値>
なし


public
int New_NurbsS(NURBSS *nurb,int K[2],int N[2])

<説明>
NURBS曲面のメモリー確保.
<引数>
*nurb:メモリー確保するNurbs曲面へのポインタ
K[2]:u,vコントロールポイントの数
N[2]:u,vノットベクトルの数
<戻り値>
KOD_TURE:メモリー確保に成功 KOD_ERR:メモリー確保に失敗


public
void Free_NurbsS_1DArray(NURBSC *a,int num)

<説明>
NURBS曲面配列のメモリー解放.
<引数>
*a:NURBS曲面へのポインタ
num:配列長
<戻り値>
なし


public
void Free_NurbsS(NURBSC *a)

<説明>
NURBS曲面のメモリー解放.
<引数>
*a:NURBS曲面へのポインタ
<戻り値>
なし


public
int New_TrmS(TRMS *trms,int num)

<説明>
トリム面のメモリー確保.
<引数>
*trms:メモリー確保するトリム面へのポインタ
num:トリム面の数
<戻り値>
KOD_TURE:メモリー確保に成功 KOD_ERR:メモリー確保に失敗


public
void Free_TrmS_1DArray(TRMS *a,int num)

<説明>
トリム面配列のメモリー解放.
<引数>
*a:トリム面配列へのポインタ
num:配列長
<戻り値>
なし


public
void Free_TrmS(TRMS *a)

<説明>
トリム面のメモリー解放.
<引数>
*a:トリム面へのポインタ
<戻り値>
なし


public
int New_CompC(COMPC *compc,int num)

<説明>
複合曲線のメモリー確保.
<引数>
*compc:メモリー確保する複合曲線へのポインタ
num:複合曲線の数
<戻り値>
KOD_TURE:メモリー確保に成功 KOD_ERR:メモリー確保に失敗


public
void Free_CompC_1DArray(COMPC *a,int num)

<説明>
複合曲線配列のメモリー解放.
<引数>
*a:複合曲線配列へのポインタ
num:配列長
<戻り値>
なし


public
void Free_CompC(COMPC *a)

<説明>
複合曲線のメモリー解放.
<引数>
*a:複合曲線へのポインタ
<戻り値>
なし


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 GetCurveKnotParam1(Coord *P,int PNum,Vector T_)

<説明>
各通過点の曲線パラメータを算出(コード長の比から算出)
<引数>
*P:通過点列
PNum:通過点列の数
T_:曲線パラメータを格納
<戻り値>
なし


private
void GetCurveKnotParam2(Coord *P,int PNum,Vector T_)

<説明>
各通過点の曲線パラメータを算出(コード長の平方根の比から算出)
<引数>
*P:通過点列
PNum:通過点列の数
T_:曲線パラメータを格納
<戻り値>
なし


private
void GetSurfaceKnotParam(Vector S,Vector T,Coord **P,int uNum,int vNum)

<説明>
補間曲面用u,vパラメータを得る
<引数>
S:u方向曲線パラメータ
T:v方向曲線パラメータ
**P:与えられた点列
uNum:u方向の点列数 vNum:v方向の点列数
<戻り値>
なし


private
void GetEqIntervalKont(int K,int M,Vector T)

<説明>
曲線/曲面パラメータから等間隔なノットベクトルを算出
<引数>
K:コントロールポイントの数
M:階数
T:格納するノットベクトル列
<戻り値>
なし


private
void GetInterpolatedKnot(Vector T_,int N,int K,int M,Vector T)

<説明>
曲線/曲面パラメータから補間用ノットベクトルを算出
<引数>
T_:曲線パラメータ列
N:ノットベクトルの数
K:コントロールポイントの数
M:階数
T:格納するノットベクトル列
<戻り値>
なし


private
void GetApproximatedKnot(Vector T_,int N,int M,int K,Vector T)

<説明>
曲線/曲面パラメータから近似用ノットベクトルを算出
<引数>
T_:曲線パラメータ列
N:ノットベクトルの数
K:コントロールポイントの数
M:階数
T:格納するノットベクトル列
<戻り値>
なし


private
void CalcApproximationCP_LSM(Coord *P,Vector T_,Vector T,int Pnum,int Nnum,int M,int K,Coord *Q)

<説明>
最小2乗法で近似コントロールポイントを求め
<引数>
*P:通過点列
T_:曲線パラメータ列
T:ノットベクトル Pnum:曲線パラメータの数 Nnum:ノットベクトルの数
K:コントロールポイントの数
M:階数
*Q:算出されたコントロールポイント列
<戻り値>
なし


private
int SetApproximationCPnum(int PNum)

<説明>
点列数から生成するコントロールポイント数を算定する
<引数>
PNum:点列数
<戻り値>
コントロールポイント数


private
int CheckTheSamePoints(Coord *P,int N)
int CheckTheSamePoints(double *P,int N)
int CheckTheSamePoints2D(Coord *P,int)

<説明>
同一点を除去する
<引数>
*P:点列
PNum:点列数
<戻り値>
残った点数


private
double CalcDiffNurbsSDenom(NURBSS *S,int k,int l,double u,double v)
double CalcDiffNurbsSNumer(NURBSS *S,int k,int l,double u,double v)

<説明>
NURBS曲面分母の各方向を任意階微分したときの微分係数を求めるSub関数
<引数>
*S:NURBS曲面へのポインタ
k:u方向の微分階数
l:v方向の微分階数
u,v:u方向v方向それぞれのパラメータ
<戻り値>
係数


private
Coord TrimNurbsSPlaneSub1(double a,double b,double x0,double y0,double x1,double y1)

<説明>
TrimNurbsSPlaneのサブ関数(2D上の2直線の交点をもとめる)
<引数>
a,b:1つ目の直線の係数
x0,y0,x1,y1:2つ目の直線が通る2点
<戻り値>
交点の2D座標


private
int GetMinDist(NURBSS *S,Coord P,Coord *Q,int N,Coord *Ans)

<説明>
CalcIntersecPtNurbsPtのサブ関数(空間上の1点とNURBS曲面上にあるいくつかの点との距離で最小のものを調べる)
<引数>
*S:NURBS曲面へのポインタ
P:空間上の1点 *Q:曲面上の点群(u,vパラメータで指定) N:点数 *Ans:最小距離を持つ曲面上の点
<戻り値>
成功:KOD_TRUE
失敗:KOD_FALSE



Document Release 2.0 for Kodatuno R2.0, Nov. 2011


Prev index Next

Copyright(C) Kodatuno Development Team, 2011 Last modified: Nov. 11, 2011