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