NURBS_Func.cpp

Summary
NURBS_Func.cpp
Functions
New_NurbsCNurbs曲線のメモリー確保
Free_NurbsC_1DArrayNURBS曲線配列のメモリー解放
Free_NurbsC1本のNURBS曲線のメモリー解放
New_NurbsSNURBS曲面のメモリー確保
Free_NurbsS_1DArrayNURBS曲面配列のメモリー解放
Free_NurbsS1つのNURBS曲面のメモリー解放
New_TrmSトリム面のメモリー確保
Free_TrmS_1DArrayトリム面配列のメモリー解放
Free_TrmSトリム面のメモリー解放
New_CompC複合曲線のメモリー確保
Free_CompC_1DArray複合曲線配列のメモリー解放
Free_CompC複合曲線のメモリー解放
GenNurbsC1つのNurbs曲線を生成する
GenNurbsC1つのNurbs曲線を生成する(NURBS曲線のコピー)(オーバーロード)
DelNurbsCGenNurbsC()によって生成されたNURBS曲線を削除する
GenNurbsS1つのNURBS曲面を生成する
GenNurbsS1つのNurbs曲面を生成する(NURBS曲面のコピー)
GenRotNurbsSNurbsCを原点を通るAxis回りにdegだけ回転させた回転サーフェスNurbsSを生成する
GenSweepNurbsS1つのNURBS曲線からある軸方向にある距離だけスイープさせたスイープサーフェスを生成する
GenIsoparamCurveUNURBS曲面上のu方向パラメータ値を固定したときのアイソパラメトリックNURBS曲線を生成
GenIsoparamCurveVNURBS曲面上のv方向パラメータ値を固定したときのアイソパラメトリックNURBS曲線を生成
DelNurbsSGenNurbsS()によって生成されたNURBS曲面を削除する
GenTrimdNurbsSトリム面を有するNURBS曲面をコピーする
DelTrimdNurbsSGenTrimdNurbsS()によって生成されたトリム面を削除する
CalcNurbsCCoord指定したノットtでのNURBS曲線の座標値を求める
CalcNurbsCCoords指定したノットt群でのNURBS曲線の座標値を求める
CalcNurbsSCoord指定したノットu,vでのNURBS曲面の座標値を求める
CalcNurbsSCoords指定したノットu,v群でのNURBS曲面の座標値群を求める
CalcBSbasisBスプライン基底関数を計算し、計算結果を返す
CalcDiffBSbasisBスプライン基底関数の1階微分係数を求める
CalcDiffBSbasisNBスプライン基底関数のN階微分係数を求める
CalcDiff2NurbsCNURBS曲線の2階微分係数を求める
CalcDiffNNurbsCNURBS曲線のr階微分係数を求める
CalcDiffuNurbsSNURBS曲面のu方向の1階微分係数を得る
CalcDiffvNurbsSNURBS曲面のv方向の1階微分係数を得る
CalcDiffNNurbsSNURBS曲面の各方向を任意階微分したときの微分係数を求める
CalcDiffNurbsSDenom(private)NURBS曲面分母の各方向を任意階微分したときの微分係数を求める
CalcDiffNurbsSNumer(private)NURBS曲面分子の各方向を任意階微分したときの微分係数を求める
CalcNormVecOnNurbsSNURBS曲面上の(u,v)における法線ベクトルをもとめる
CalcTanVecOnNurbsCNURBS曲線上のtにおける単位接ベクトルをもとめる
CalcDiffuNormVecOnNurbsSNURBS曲面上の(u,v)における法線ベクトルのu方向1階微分をもとめる Nu = Suu×Sv + Su×Suv
CalcDiffvNormVecOnNurbsSNURBS曲面上の(u,v)における法線ベクトルのv方向1階微分をもとめる Nv = Suv×Sv + Su×Svv
CalcMeanCurvatureNURBS曲面上の(u,v)における平均曲率を求める
CalcMeanCurvatureNURBS曲面上の(u,v)における平均曲率を求める(オーバーロード)
CalcMeanCurvatureNormVecNURBS曲面上の(u,v)における平均曲率法線ベクトルをもとめる
CalcGaussCurvatureNURBS曲面上の(u,v)におけるガウス曲率を求める
CalcGaussCurvatureNURBS曲面上の(u,v)におけるガウス曲率を求める(オーバーロード)
CalcGaussCurvatureNormVecNURBS曲面上の(u,v)におけるガウス曲率法線ベクトルをもとめる
CalcCurvatureNurbsCNURBS曲線の曲率を求める
DetectInterfereNurbsSNURBS曲面S(u,v)とNURBS曲面R(w,t)の干渉を検出する(トリム無)
DetectInterfereTrmSNURBS曲面S(u,v)とNURBS曲面R(w,t)の干渉を検出する(トリム有)
CalcIntersecPtsPlaneV33次以下のNURBS曲面と平面との交点群を代数解法にて求める(vパラメータ分割)
CalcIntersecPtsPlaneU33次以下のNURBS曲面と平面との交点群を代数解法にて求める(uパラメータ分割)
CalcIntersecPtsPlaneVV方向のアイソパラ曲線を指定した分割数で生成し,各曲線とNURBS曲面との交点を算出する
CalcIntersecPtsPlaneUU方向のアイソパラ曲線を指定した分割数で生成し,各曲線とNURBS曲面との交点を算出する
CalcIntersecPtsOffsetPlaneSearchオフセットNURBS曲面と平面との交点群を交点追跡法にて求める
CalcIntersecPtsPlaneSearchNURBS曲面と平面との交点群を交点追跡法にて求める
CheckClossedPoints(private)指定した点が他の2点を対角とする立方体の中に存在するかを調べる
CalcIntersecPtsPlaneSearch_Sub(private)平面とNURBS曲面との交点群を求める関数CalcIntersecPtsPlaneSearch()のサブ関数. 面から飛び出した(u,v)を参考に面のエッジ部における交点(new_u,new_v)を得る
SearchIntersectPt_BS(private)Bulirsch-Stoer法により交点を収束させる(NURBS曲面と平面)
GetSIPParam1(private)SearchIntersectPt_BS()のサブ関数.曲面と平面の交点を表す微分方程式の右辺の値を得る
SearchIntersectPt_RKM(private)4次のルンゲクッタ法により交点を導出(NURBS曲面と平面)
SearchIntersectPt_OS(private)4次のルンゲクッタ法により交点を導出(オフセットNURBS曲面と平面)
SearchIntersectPt(private)ニュートン法により交点を真値に収束させる(NURBS曲面と平面)
CalcIntersecPtsNurbsSNurbsCNURBS曲面とNURBS曲線との交点群を交線追跡法で求める
CalcIntersecPtsNurbsSSearchNURBS曲面S(u,v)とNURBS曲面R(w,t)の交線(交点群)を交点追跡法にて求める
CalcIntersecPtsNurbsSGeomNURBS曲面S(u,v)とNURBS曲面R(w,t)の交線(交点群)を幾何学的に求める(補助平面を用いた解法)
SearchIntersectPt(private)ニュートン法により交点を真値に収束させる(NURBS曲面同士)
GetNurbsSCoef(private)CalcIntersecPtsPlaneU/V3()のサブ関数.NURBS曲線C(u) or C(v)の係数を求める
CalcIntersecPtsNurbsCNurbsCParam(x,y)平面上のNURBS曲線同士の交点を求める(ニュートン法)
ClacIntersecPtsNurbsCLine2次元NURBS曲線と直線との交点を求める
ClacIntersecPtsNurbsCLineSeg2次元NURBS曲線と線分との交点を求める
CalcIntersecCurveNURBS曲線と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める. 交点は最大で(M-1)*(K-M+1)点得られる.
CalcIntersecIsparaCurveUNURBS曲面のU方向アイソパラ曲線(Vパラメータを固定)と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める 交点は最大で(M-1)*(K-M+1)点得られる.
CalcIntersecIsparaCurveVNURBS曲面のV方向アイソパラ曲線(Uパラメータを固定)と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める 交点は最大で(M-1)*(K-M+1)点得られる.
CalcIntersecCurve3NURBS曲線と平面との交点を求める(3次まで対応) 交点は最大で(M-1)*(K-M+1)点得られる.
CalcEquation(private)CalcIntersecCurve3(), CalcIntersecPtsPlaneU/V3()のサブ関数.3次方程式までを解く
GetIntersecEquation(private)CalcIntersecCurve3(), CalcIntersecPtsPlaneU/V3()のサブ関数.NURBS曲線と平面の交線導出用方程式を得る
GetNurbsCCoef(private)CalcIntersecCurve3()のサブ関数.NURBS曲線の係数を求める(最高3次)
GetBSplCoef33次のBスプライン曲線の各係数を求める.
GetBSplCoef22次のBスプライン曲線の各係数を求める
GetBSplCoef11次のBスプライン曲線の各係数を求める
ShiftNurbsSNURBS曲面のシフト
ShiftNurbsCNURBS曲線のシフト
RotNurbsSNURBS曲面をDベクトル回りにdeg(°)だけ回転させる
RotNurbsCNURBS曲面をDベクトル回りにdeg(°)だけ回転させる
ChRatioNurbsSNURBS曲面の倍率を変更する
ChRatioNurbsCNURBS曲線の倍率を変更する
SetCPNurbsSNURBS曲面nurbsのコントロールポイントを,NURBS曲面Nurbsのコントロールポイントに置き換える
GenInterpolatedNurbsC1与えられた点列を補間するn階のNURBS曲線を生成する.
GenInterpolatedNurbsC2与えられた点列を補間するn階のNURBS曲線を生成する. 端末条件:始点とC2で一致
GenApproximationNurbsC与えられた点列を近似するn階のNURBS曲線を生成する
GenNurbsCfromCPコントロールポイントからNURBS曲線を生成する
GenPolygonalLine折れ線(NURBS曲線)を生成する
GenInterpolatedNurbsS1与えられた点列を補間するn階NURBS曲面を生成する. 端末条件を与えないバージョン
GenApproximationNurbsS与えられた点列を近似するn階のNURBS曲面を生成する
GenNurbsSfromCP与えられたコントロールポイントからn階のNURBS曲面を生成する
ConnectNurbsSU2枚のNURBS曲面を連結する(U方向に長くなる)(S1_U1とS2_U0を連結)
ConnectNurbsSV2枚のNURBS曲面を連結する(V方向に長くなる)(S1_V1とS2_V0を連結)
SetCPSU_ConnectS(private)ConnectNurbsSU()のサブ関数.S_のu方向コントロールポイントとウェイトを指定
SetKnotVecSU_ConnectS(private)ConnectNurbsSU()のサブ関数.S_のu方向ノット定義域を指定
SetCPSV_ConnectS(private)ConnectNurbsSV()のサブ関数.S_のv方向コントロールポイントとウェイトを指定
SetKnotVecSV_ConnectS(private)ConnectNurbsSV()のサブ関数.S_のv方向ノット定義域を指定
CalcuIntersecPtNurbsLineNURBS曲面と直線の交点を算出
CalcIntersecPtNurbsPt空間上の1点PからNURBS曲面S上の最近傍点Qを求める(ニュートン法)
CalcIntersecPtNurbsPt空間上の1点PからNURBS曲線C上の最近傍点Q(曲線パラメータ)を求める(ニュートン法)
GetMinDist(private)CalcIntersecPtNurbsPt()のサブ関数.最小距離を調べる
DetermPtOnTRMSurf注目中のNURBS曲面上の1点(u,v)がトリミング領域内にあるのかを判定する
DetermPtOnTRMSurf_sub(private)DetermPtOnTRMSurf()のサブ関数.面上線のタイプが複合曲線の場合のトリミング領域内外判定
GetPtsOnOuterTRMSurf外周トリム面内の点のみ残す
GetPtsOnInnerTRMSurf内周トリム面外の点のみ残す
GetPtsOnInnerOuterTRMSurf内外周トリム面内の点のみ残す
ApproxTrimBorder(private)トリム境界線を点群で近似する
CalcDeltaPtsOnNurbsC指定した分割数でNURBS曲線上の座標値を出力する
CalcDeltaPtsOnNurbsC指定した間隔でNURBS曲線上の座標値を出力する
CalcParamLengthOnNurbsCNURBS曲線において一端からの指定距離におけるパラメータ値を返す
CalcDeltaPtsOnNurbsS指定した分割数でNURBS曲面上の座標値を求める
CalcExtremumNurbsCNURBS曲線の指定した方向における極値の座標値を得る
CalcExtSearchCurve(準備中)極値探索線を得る
CalcExtGradCurve(準備中)極値傾斜線を得る
SearchExtremum_BSBulirsch-Stoer法により極地探索を行う(微分方程式:du(s)/ds = fu(u,v) と、dv(s)/ds = fv(u,v)の解探索)
GetSECParam1(private)極値探索線Sub関数1
TrimNurbsSPlaneSub1(private)TrimNurbsSPlaneのサブ関数(2D上の2直線の交点をもとめる)
GetCurveKnotParam1(private)各通過点の曲線パラメータを算出(コード長の比から算出)
GetCurveKnotParam2(private)各通過点の曲線パラメータを算出(コード長の平方根の比から算出)
GetEqIntervalKont(private)曲線/曲面パラメータから等間隔なノットベクトルを算出
GetInterpolatedKnot(private)曲線/曲面パラメータから補間用ノットベクトルを算出
GetApproximatedKnot(private)曲線/曲面パラメータから近似用ノットベクトルを算出
ChangeKnotVecRange(private)曲線/曲面パラメータの定義域を変更する
ChangeKnotVecRange(private)最小2乗法で近似コントロールポイントを求める
SetApproximationCPnum(private)点列数から生成するコントロールポイント数を算定する(勘です。)
DebugForNurbsCNURBS曲線情報をデバッグプリント
DebugForNurbsSNURBS曲面情報をデバッグプリント
CalcNurbsCLengthNURBS曲線C(t)の指定パラメータ区間[a,b]の線分長Lを求める
CalcNurbsCLengthNURBS曲線C(t)の全区間の線分長Lを求める
GetMinDistance(private)最小距離を持つ座標値を返す
DivNurbsCNURBS曲線を指定した位置(端からの弧長)で分割する
DivNurbsCParamNURBS曲線を指定したパラメータ値で分割する
ConnectNurbsC2本のNURBS曲線を連結する
ReverseNurbsCNURBS曲線のノットベクトル向きを反転する
SetKnotVecC_ConnectC(private)2本の曲線を繋げたときのノットベクトルを設定する
SetCPC_ConnectC(private)2本の曲線を繋げたときのコントロールポイントとウェイトを設定する
InsertNewKnotOnNurbsC(private)NURBS曲線に新たなノットを挿入する

Functions

New_NurbsC

int NURBS_Func::New_NurbsC(NURBSC *nurb,
int K,
int N)

Nurbs曲線のメモリー確保

Parameters

*nurbメモリー確保するNurbs曲線へのポインタ
Kコントロールポイントの数
Nノットベクトルの数

Return

成功:KOD_TRUE, 失敗:KOD_ERR

Free_NurbsC_1DArray

void NURBS_Func::Free_NurbsC_1DArray(NURBSC *a,
int num)

NURBS曲線配列のメモリー解放

Parameters

*aメモリーを解放するNurbs曲線へのポインタ
numメモリーを解放するNURBS曲線の数

Free_NurbsC

void NURBS_Func::Free_NurbsC(NURBSC *a)

1本のNURBS曲線のメモリー解放

Parameters

*aメモリーを解放するNurbs曲線へのポインタ

New_NurbsS

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

NURBS曲面のメモリー確保

Parameters

*nurbメモリー確保するNurbs曲面へのポインタ
K[2]u,vコントロールポイントの数
N[2]u,vノットベクトルの数

Return

成功:KOD_TRUE, 失敗:KOD_ERR

Free_NurbsS_1DArray

void NURBS_Func::Free_NurbsS_1DArray(NURBSS *a,
int num)

NURBS曲面配列のメモリー解放

Parameters

*aメモリーを解放するNurbs曲面へのポインタ
numメモリーを解放するNURBS曲面の数

Free_NurbsS

void NURBS_Func::Free_NurbsS(NURBSS *a)

1つのNURBS曲面のメモリー解放

Parameters

*aメモリーを解放するNurbs曲面へのポインタ

New_TrmS

int NURBS_Func::New_TrmS(TRMS *trms,
int num)

トリム面のメモリー確保

Parameters

*trmsメモリー確保するトリム面へのポインタ
numメモリー確保するトリム面の数

return

成功:KOD_TRUE, 失敗:KOD_ERR

Free_TrmS_1DArray

void NURBS_Func::Free_TrmS_1DArray(TRMS *a,
int num)

トリム面配列のメモリー解放

Parameters

*aメモリーを解放するトリム面配列へのポインタ
numメモリーを解放するトリム面の数

Free_TrmS

void NURBS_Func::Free_TrmS(TRMS *a)

トリム面のメモリー解放

Parameters

*aメモリーを解放するトリム面へのポインタ

New_CompC

int NURBS_Func::New_CompC(COMPC *compc,
int num)

複合曲線のメモリー確保

Parameters

*compcメモリー確保する複合曲線へのポインタ
numメモリー確保する複合曲線の数

return

成功:KOD_TRUE, 失敗:KOD_ERR

Free_CompC_1DArray

void NURBS_Func::Free_CompC_1DArray(COMPC *a,
int num)

複合曲線配列のメモリー解放

Parameters

*aメモリーを解放する複合曲線配列へのポインタ
numメモリーを解放する複合曲線の数

Free_CompC

void NURBS_Func::Free_CompC(COMPC *a)

複合曲線のメモリー解放

Parameters

*aメモリーを解放する複合曲線へのポインタ

GenNurbsC

int NURBS_Func::GenNurbsC(NURBSC *Nurbs,
int K,
int M,
int N,
double T[],
double W[],
Coord cp[],
double V[],
int prop[],
int euflag)

1つのNurbs曲線を生成する

Parameters

*Nurbs生成するNURBS曲線へのポインタ
Kコントロールポイントの数
M階数
Nノットベクトルの数
T[]ノットベクトル列
W[]ウェイト列
cp[]コントロールポイント列
V[2]ノットベクトルの範囲
prop[4]プロパティ(BODY.h参照)
euflagディレクトリ部 Entity Use Flag の値(0:幾何要素 5:2Dパラメトリック要素)

return

KOD_TRUE

GenNurbsC

int NURBS_Func::GenNurbsC(NURBSC *Nurbs,
NURBSC nurb)

1つのNurbs曲線を生成する(NURBS曲線のコピー)(オーバーロード)

Parameters

*Nurbs新たに生成するNURBS曲線
nurb代入元

return

KOD_TRUE

DelNurbsC

void NURBS_Func::DelNurbsC(NURBSC *Nurbs)

GenNurbsC()によって生成されたNURBS曲線を削除する

Parameters

*Nurbs新たに生成するNURBS曲線へのポインタ

GenNurbsS

int NURBS_Func::GenNurbsS(NURBSS *Nurbs,
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)

1つのNURBS曲面を生成する

Parameters

Mu,Mv階数
Ku,Kvコントロールポイントの数
*S,*Tu,v方向ノットベクトル列
**Wウエイト
**Cpコントロールポイント
U_s,U_e,V_s,V_eu方向ノットベクトルの開始値,終了値

return

成功:KOD_TRUE, 失敗:KOD_ERR

GenNurbsS

int NURBS_Func::GenNurbsS(NURBSS *Nurbs,
NURBSS nurb)

1つのNurbs曲面を生成する(NURBS曲面のコピー)

Parameters

*Nurbs新たに生成するNURBS曲面へのポインタ
nurb代入元

return

成功:KOD_TRUE, 失敗:KOD_ERR

GenRotNurbsS

int NURBS_Func::GenRotNurbsS(NURBSS *NurbsS,
NURBSC NurbsC,
Coord Axis,
double deg)

NurbsCを原点を通るAxis回りにdegだけ回転させた回転サーフェスNurbsSを生成する

Parameter

*NurbsS生成される回転サーフェス(NURBS曲面)へのポインタ
NurbsC基線となるNURBS曲線
Axis回転軸ベクトル
deg回転角度(deg)

Return

成功:KOD_TRUE, 失敗:KOD_ERR

GenSweepNurbsS

int NURBS_Func::GenSweepNurbsS(NURBSS *NurbsS,
NURBSC NurbsC,
Coord Axis,
double Len)

1つのNURBS曲線からある軸方向にある距離だけスイープさせたスイープサーフェスを生成する

Parameters

*NurbsS生成されるスイープサーフェス(NURBS曲面)へのポインタ
NurbsC基線となるNURBS曲線
Axisスイープ方向ベクトル
Lenスイープ距離

Return

成功:KOD_TRUE, 失敗:KOD_ERR

GenIsoparamCurveU

int NURBS_Func::GenIsoparamCurveU(NURBSS *P,
double u,
NURBSC *C)

NURBS曲面上のu方向パラメータ値を固定したときのアイソパラメトリックNURBS曲線を生成

Parameters

*Pアイソパラメトリック曲線生成元のNURBS曲面
uu方向の固定パラメータ
*C生成されたアイソパラメトリック曲線

Return

成功:KOD_TRUE, 失敗:KOD_ERR(引数uが*Pのuパラメータ範囲外)

GenIsoparamCurveV

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

NURBS曲面上のv方向パラメータ値を固定したときのアイソパラメトリックNURBS曲線を生成

Parameters

*Sアイソパラメトリック曲線生成元のNURBS曲面
vv方向の固定パラメータ
*C生成されたアイソパラメトリック曲線

Return

成功:KOD_TRUE, 失敗:KOD_ERR(引数vが*Pのuパラメータ範囲外)

DelNurbsS

void NURBS_Func::DelNurbsS(NURBSS *Nurbs)

GenNurbsS()によって生成されたNURBS曲面を削除する

Parameters

*Nurbs削除するNURBS曲面へのポインタ

GenTrimdNurbsS

int NURBS_Func::GenTrimdNurbsS(TRIMD_NURBSS *TNurbs,
TRIMD_NURBSS tnurb)

トリム面を有するNURBS曲面をコピーする

Parameters

*TNurbs生成されるトリム面へのポインタ
tnurbコピー元のトリム面

Return

KOD_TRUE

DelTrimdNurbsS

int NURBS_Func::DelTrimdNurbsS(TRIMD_NURBSS *TNurbs)

GenTrimdNurbsS()によって生成されたトリム面を削除する

Parameters

*TNurbs削除するトリム面へのポインタ

Return

KOD_TRUE

CalcNurbsCCoord

Coord NURBS_Func::CalcNurbsCCoord(NURBSC *NurbsC,
double t)

指定したノットtでのNURBS曲線の座標値を求める

Parameters

*NurbsC対象とするNURBS曲線へのポインタ
tノット値

Return

座標値

CalcNurbsCCoords

void NURBS_Func::CalcNurbsCCoords(NURBSC *NurbsC,
int Ptnum,
double *T,
Coord *Pt)

指定したノットt群でのNURBS曲線の座標値を求める

Parameters

*NurbsSNURBS曲面へのポインタ
Ptnum求める点群の数
*Ttパラメータ群を格納した配列
*Pt実座標値を格納

CalcNurbsSCoord

Coord NURBS_Func::CalcNurbsSCoord(NURBSS *NurbsS,
double div_u,
double div_v)

指定したノットu,vでのNURBS曲面の座標値を求める

Parameters

*NurbsS対象とするNURBS曲面へのポインタ
div_uu方向ノット値
div_vv方向ノット値

Return

座標値

CalcNurbsSCoords

void NURBS_Func::CalcNurbsSCoords(NURBSS *NurbsS,
int Ptnum,
Coord *UV,
Coord *Pt)

指定したノットu,v群でのNURBS曲面の座標値群を求める

Parameters

*NurbsSNURBS曲面へのポインタ
Ptnum求める点群の数
*UVu,vパラメータ群を格納したCoord型配列(UV[].xにu方向、UV[].yにV方向のパラメータを格納しておくこと)
*Pt実座標値を格納

CalcBSbasis

double NURBS_Func::CalcBSbasis(double t,
double knot[],
int N,
int I,
int M)

Bスプライン基底関数を計算し、計算結果を返す

Parameters

tノット 
knot[]ノットベクトル
Nノットベクトルの数
IBspl基底関数下添字の1つ目(0~)
M階数(Bspl基底関数下添字の2つ目)

Return

計算結果

CalcDiffBSbasis

double NURBS_Func::CalcDiffBSbasis(double t,
double knot[],
int N,
int I,
int M)

Bスプライン基底関数の1階微分係数を求める

Parameters

tノット 
knot[]ノットベクトル
Nノットベクトルの数
I注目中のコントロールポイント
M階数

Return

計算結果

CalcDiffBSbasisN

double NURBS_Func::CalcDiffBSbasisN(double t,
double knot[],
int N,
int I,
int M,
int Dn)

Bスプライン基底関数のN階微分係数を求める

Parameters

tノット 
knot[]ノットベクトル
Nノットベクトルの数
I注目中のコントロールポイント
M階数
Dn微分階数

Return

計算結果

CalcDiff2NurbsC

Coord NURBS_Func::CalcDiff2NurbsC(NURBSC *NurbsC,
double t)

NURBS曲線の2階微分係数を求める

Paramters

*NurbsCNURBS曲線へのポインタ
tノット値

Return

計算結果

CalcDiffNNurbsC

Coord NURBS_Func::CalcDiffNNurbsC(NURBSC *NurbsC,
int r,
double t)

NURBS曲線のr階微分係数を求める

Paramters

*NurbsCNURBS曲線へのポインタ
r微分階数
tノット値

Return

計算結果

CalcDiffuNurbsS

Coord NURBS_Func::CalcDiffuNurbsS(NURBSS *NurbsS,
double div_u,
double div_v)

NURBS曲面のu方向の1階微分係数を得る

Parameters

*NurbsSNURBS曲面へのポインタ
div_uu方向ノット値
div_vv方向ノット値

Return

計算結果

CalcDiffvNurbsS

Coord NURBS_Func::CalcDiffvNurbsS(NURBSS *NurbsS,
double div_u,
double div_v)

NURBS曲面のv方向の1階微分係数を得る

Parameters

*NurbsSNURBS曲面へのポインタ
div_uu方向ノット値
div_vv方向ノット値

Return

計算結果

CalcDiffNNurbsS

Coord NURBS_Func::CalcDiffNNurbsS(NURBSS *S,
int k,
int l,
double u,
double v)

NURBS曲面の各方向を任意階微分したときの微分係数を求める

Parameters

*SNURBS曲面へのポインタ
ku方向の微分階数
lv方向の微分階数
u,vu方向v方向それぞれのパラメータ

Return

計算結果

CalcDiffNurbsSDenom

double NURBS_Func::CalcDiffNurbsSDenom(NURBSS *S,
int k,
int l,
double u,
double v)

(private)NURBS曲面分母の各方向を任意階微分したときの微分係数を求める

Parameters

*SNURBS曲面へのポインタ
ku方向の微分階数
lv方向の微分階数
u,vu方向v方向それぞれのパラメータ

Return

計算結果

CalcDiffNurbsSNumer

Coord NURBS_Func::CalcDiffNurbsSNumer(NURBSS *S,
int k,
int l,
double u,
double v)

(private)NURBS曲面分子の各方向を任意階微分したときの微分係数を求める

Parameters

*SNURBS曲面へのポインタ
ku方向の微分階数
lv方向の微分階数
u,vu方向v方向それぞれのパラメータ

Return

計算結果

CalcNormVecOnNurbsS

Coord NURBS_Func::CalcNormVecOnNurbsS(NURBSS *nurb,
double u,
double v)

NURBS曲面上の(u,v)における法線ベクトルをもとめる

Parameters

*nurbNURBS曲面へのポインタ
uu方向ノット値
vv方向ノット値

Retrurn

計算結果

CalcTanVecOnNurbsC

Coord NURBS_Func::CalcTanVecOnNurbsC(NURBSC *C,
double t)

NURBS曲線上のtにおける単位接ベクトルをもとめる

Parameters

*CNURBS曲線へのポインタ
tノット値

Retrurn

計算結果

CalcDiffuNormVecOnNurbsS

Coord NURBS_Func::CalcDiffuNormVecOnNurbsS(NURBSS *nurb,
double u,
double v)

NURBS曲面上の(u,v)における法線ベクトルのu方向1階微分をもとめる Nu = Suu×Sv + Su×Suv

Parameters

*nurbNURBS曲面へのポインタ
uu方向ノット値
vv方向ノット値

Retrurn

計算結果

CalcDiffvNormVecOnNurbsS

Coord NURBS_Func::CalcDiffvNormVecOnNurbsS(NURBSS *nurb,
double u,
double v)

NURBS曲面上の(u,v)における法線ベクトルのv方向1階微分をもとめる Nv = Suv×Sv + Su×Svv

Parameters

*nurbNURBS曲面へのポインタ
uu方向ノット値
vv方向ノット値

Retrurn

計算結果

CalcMeanCurvature

double NURBS_Func::CalcMeanCurvature(NURBSS *nurb,
double u,
double v)

NURBS曲面上の(u,v)における平均曲率を求める

Parameters

*nurbNURBS曲面へのポインタ
uu方向ノット値
vv方向ノット値

Retrurn

計算結果

CalcMeanCurvature

double NURBS_Func::CalcMeanCurvature(SFQuant q)

NURBS曲面上の(u,v)における平均曲率を求める(オーバーロード)

Parameters

q曲面の基本量をセットにした構造体

Retrurn

計算結果

CalcMeanCurvatureNormVec

Coord NURBS_Func::CalcMeanCurvatureNormVec(NURBSS *nurb,
double u,
double v)

NURBS曲面上の(u,v)における平均曲率法線ベクトルをもとめる

Parameters

*nurbNURBS曲面へのポインタ
uu方向ノット値
vv方向ノット値

Retrurn

計算結果

CalcGaussCurvature

double NURBS_Func::CalcGaussCurvature(NURBSS *nurb,
double u,
double v)

NURBS曲面上の(u,v)におけるガウス曲率を求める

Parameters

*nurbNURBS曲面へのポインタ
uu方向ノット値
vv方向ノット値

Retrurn

計算結果

CalcGaussCurvature

double NURBS_Func::CalcGaussCurvature(SFQuant q)

NURBS曲面上の(u,v)におけるガウス曲率を求める(オーバーロード)

Parameters

q曲面の基本量をセットにした構造体

Retrurn

計算結果

CalcGaussCurvatureNormVec

Coord NURBS_Func::CalcGaussCurvatureNormVec(NURBSS *nurb,
double u,
double v)

NURBS曲面上の(u,v)におけるガウス曲率法線ベクトルをもとめる

Parameters

*nurbNURBS曲面へのポインタ
uu方向ノット値
vv方向ノット値

Retrurn

計算結果

CalcCurvatureNurbsC

double NURBS_Func::CalcCurvatureNurbsC(NURBSC *C,
double t)

NURBS曲線の曲率を求める

Parameters

*CNURBS曲線へのポインタ
tノット値

Retrurn

計算結果

DetectInterfereNurbsS

int NURBS_Func::DetectInterfereNurbsS(NURBSS *nurbR,
NURBSS *nurbS,
int divnum)

NURBS曲面S(u,v)とNURBS曲面R(w,t)の干渉を検出する(トリム無)

Parameters

*nurbSNURBS曲面S(u,v)
*nurbRNURBS曲面R(w,t)
divnumパラメータ分割数(初期点の数)

Return

干渉有:KOD_TRUE, 干渉無:KOD_FALSE

DetectInterfereTrmS

int NURBS_Func::DetectInterfereTrmS(TRIMD_NURBSS *tNurbR,
TRIMD_NURBSS *tNurbS,
int divnum)

NURBS曲面S(u,v)とNURBS曲面R(w,t)の干渉を検出する(トリム有)

Parameters

*tNurbSNURBS曲面S(u,v)(トリム有)
*tNurbRNURBS曲面R(w,t)(トリム有)
divnumパラメータ分割数(初期点の数)

Return

干渉有:KOD_TRUE, 干渉無:KOD_FALSE

CalcIntersecPtsPlaneV3

int NURBS_Func::CalcIntersecPtsPlaneV3(NURBSS *nurb,
Coord pt,
Coord nvec,
int v_divnum,
Coord *ans,
int ans_size)

3次以下のNURBS曲面と平面との交点群を代数解法にて求める(vパラメータ分割)

Parameters

*nurbNURBS曲面
pt平面上の一点
nvec平面の法線ベクトル
v_divnumvパラメータ分割数
*ans算出された交点のu,vパラメータ値をそれぞれans.x,ans.yに格納
ans_sizeansの配列長

Return

交点の個数(交点の数がans_sizeを超えた場合:KOD_ERR)

CalcIntersecPtsPlaneU3

int NURBS_Func::CalcIntersecPtsPlaneU3(NURBSS *nurb,
Coord pt,
Coord nvec,
int u_divnum,
Coord *ans,
int ans_size)

3次以下のNURBS曲面と平面との交点群を代数解法にて求める(uパラメータ分割)

Parameters

*nurbNURBS曲面
pt平面上の一点
nvec平面の法線ベクトル
u_divnumuパラメータ分割数
*ans算出された交点のu,vパラメータ値ををそれぞれans.x,ans.yに格納
ans_sizeansの配列長

Return

交点の個数(交点の数がans_sizeを超えた:KOD_ERR)

CalcIntersecPtsPlaneV

int NURBS_Func::CalcIntersecPtsPlaneV(NURBSS *nurbss,
Coord pt,
Coord nvec,
int v_divnum,
Coord *ans,
int ans_size)

V方向のアイソパラ曲線を指定した分割数で生成し,各曲線とNURBS曲面との交点を算出する

Parameters

*nurbNURBS曲面
pt平面上の一点
nvec平面の法線ベクトル
v_divnumvパラメータ分割数
*ans算出された交点のu,vパラメータ値をそれぞれans.x,ans.yに格納
ans_sizeansの配列長

Return

交点の個数(交点の数がans_sizeを超えた:KOD_ERR)

CalcIntersecPtsPlaneU

int NURBS_Func::CalcIntersecPtsPlaneU(NURBSS *nurbss,
Coord pt,
Coord nvec,
int u_divnum,
Coord *ans,
int ans_size)

U方向のアイソパラ曲線を指定した分割数で生成し,各曲線とNURBS曲面との交点を算出する

Parameters

*nurbNURBS曲面
pt平面上の一点
nvec平面の法線ベクトル
u_divnumuパラメータ分割数
*ans算出された交点のu,vパラメータ値をそれぞれans.x,ans.yに格納
ans_sizeansの配列長

Return

交点の個数(交点の数がans_sizeを超えた:KOD_ERR)

CalcIntersecPtsOffsetPlaneSearch

int NURBS_Func::CalcIntersecPtsOffsetPlaneSearch(NURBSS *nurb,
double os,
Coord pt,
Coord nvec,
double ds,
int initdivnum,
Coord *ans,
int ans_size)

オフセットNURBS曲面と平面との交点群を交点追跡法にて求める

Parameters

*nurbNURBS曲面
osオフセット量
pt平面上の1点
nvec平面の法線ベクトル
ds交線(交点群)の粗さ(密0.1~2疎)
initdivnum初期点探索の荒さ(密10~1疎)
*ans解格納用配列
ans_size解の数(ansの配列長)

Return

KOD_FALSE:NURBS曲面と平面が交差していない KOD_ERR:特異点または発散により処理を中断

CalcIntersecPtsPlaneSearch

int NURBS_Func::CalcIntersecPtsPlaneSearch(NURBSS *nurb,
Coord pt,
Coord nvec,
double ds,
int initdivnum,
Coord *ans,
int ans_size,
int method)

NURBS曲面と平面との交点群を交点追跡法にて求める

Parameters

*nurbNURBS曲面
pt平面上の1点
nvec平面の法線ベクトル
ds交線(交点群)の粗さ(密0.1~2疎)
initdivnum初期点探索の荒さ(密10~1疎)
*ans解格納用配列
ans_size解の数(ansの配列長) method:交点算出時の数値解析法の選択(RUNGE_KUTTA or BULIRSH_STOER)

Return

返値 KOD_FALSE:NURBS曲面と平面が交差していない KOD_ERR:特異点または発散により処理を中断

CheckClossedPoints

int NURBS_Func::CheckClossedPoints(Coord A,
Coord B,
Coord P)

(private)指定した点が他の2点を対角とする立方体の中に存在するかを調べる

Parameters

A対角上の1点
B対角上の1点
P指定点

Return

存在する:KOD_TRUE, 存在しない:KOD_FALSE

CalcIntersecPtsPlaneSearch_Sub

Coord NURBS_Func::CalcIntersecPtsPlaneSearch_Sub(NURBSS *nurb,
double u,
double v,
Coord pt,
Coord nvec)

(private)平面とNURBS曲面との交点群を求める関数CalcIntersecPtsPlaneSearch()のサブ関数. 面から飛び出した(u,v)を参考に面のエッジ部における交点(new_u,new_v)を得る

Parameters

*nurbNURBS曲面へのポインタ
u,v曲面存在領域外の(u, v)値
pt平面上の1点
nvec平面の法線ベクトル

Return

エッジ部上の交点の(u, v)座標値(Coord.xにu,Coord.yにvがそれぞれ格納される)

SearchIntersectPt_BS

int NURBS_Func::SearchIntersectPt_BS(NURBSS *S,
Coord pt,
Coord nvec,
double H,
double *u0,
double *v0,
int direction)

(private)Bulirsch-Stoer法により交点を収束させる(NURBS曲面と平面)

Parameters

*S1つ目の対象となるNURBS曲面
pt平面上の1点
nvec平面の法線ベクトル
HBS法のデフォルトの刻み幅
*u0得られた交点のuパラメータ
*v0得られた交点のvパラメータ
direction追跡方向を表すフラグ(FORWARD or INVERSE)

Return

収束した:KOD_TRUE, パラメータ範囲外:KOD_FALSE,失敗:KOD_ERR

GetSIPParam1

int NURBS_Func::GetSIPParam1(NURBSS *S,
double u,
double v,
Coord pt,
Coord nvec,
int direction,
Coord *f)

(private)SearchIntersectPt_BS()のサブ関数.曲面と平面の交点を表す微分方程式の右辺の値を得る

Parameters

*SNURBS曲面へのポインタ
u,v注目中のNURBS曲面パラメータ
pt平面上の一点
nvec平面の法線ベクトル
direction追跡方向を表すフラグ(FORWARD or INVERSE)
*f計算結果

Return

成功:KOD_TRUE, 失敗:KOD_ERR

SearchIntersectPt_RKM

int NURBS_Func::SearchIntersectPt_RKM(NURBSS *S,
Coord pt,
Coord n,
double delta,
double *u,
double *v,
int direction)

(private)4次のルンゲクッタ法により交点を導出(NURBS曲面と平面)

du(s)/ds = g(u,v),   dv(s)/ds = h(u,v)
u(s+delta) = u(s) + (p1+2p2+2p3+p4)/6
v(s+delta) = v(s) + (q1+2q2+2q3+q4)/6
p1 = delta*g(u,v),   q1 = delta*h(u,v)
p2 = delta*g(u+p1/2,v+q1/2),   q2 = delta*h(u+p1/2,v+q1/2)
p3 = delta*g(u+p2/2,v+q2/2),   q3 = delta*h(u+p2/2,v+q2/2)
p4 = delta*g(u+p3,v+q3),   q4 = delta*h(u+p3,v+q3)

Parameters

*SNURBS曲面へのポインタ
pt平面上の一点
n平面の法線ベクトル
delta解追跡の刻み幅
*u,*v
direction追跡方向を表すフラグ(FORWARD or INVERSE)

Return

成功:KOD_TRUE, 失敗:KOD_ERR

SearchIntersectPt_OS

int NURBS_Func::SearchIntersectPt_OS(NURBSS *S,
Coord pt,
Coord n,
double delta,
double *u,
double *v,
int direction)

(private)4次のルンゲクッタ法により交点を導出(オフセットNURBS曲面と平面)

du(s)/ds = g(u,v),   dv(s)/ds = h(u,v)
u(s+delta) = u(s) + (p1+2p2+2p3+p4)/6
v(s+delta) = v(s) + (q1+2q2+2q3+q4)/6
p1 = delta*g(u,v),   q1 = delta*h(u,v)
p2 = delta*g(u+p1/2,v+q1/2),   q2 = delta*h(u+p1/2,v+q1/2)
p3 = delta*g(u+p2/2,v+q2/2),   q3 = delta*h(u+p2/2,v+q2/2)
p4 = delta*g(u+p3,v+q3),   q4 = delta*h(u+p3,v+q3)

Parameters

*SNURBS曲面へのポインタ
pt平面上の一点
n平面の法線ベクトル
delta解追跡の刻み幅
*u,*v
direction追跡方向を表すフラグ(FORWARD or INVERSE)

Return

成功:KOD_TRUE, パラメータ範囲外:KOD_FALSE, 失敗:KOD_ERR

SearchIntersectPt

int NURBS_Func::SearchIntersectPt(NURBSS *nurb,
Coord pt,
Coord nvec,
double ds,
double *u,
double *v,
int direction)

(private)ニュートン法により交点を真値に収束させる(NURBS曲面と平面)

Parameters

*nurbNURBS曲面へのポインタ
pt平面上の一点
nvec平面の法線ベクトル
ds解追跡の刻み幅
*u,*v
direction追跡方向を表すフラグ(FORWARD or INVERSE)

Return

成功:KOD_TURE, パラメータ範囲外:KOD_FALSE, 失敗(特異点につきゼロ割):KOD_ERR

CalcIntersecPtsNurbsSNurbsC

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

NURBS曲面とNURBS曲線との交点群を交線追跡法で求める

Parameters

*NurbsS, *NurbsCNURBS曲面とNURBS曲線へのポインタ
Divnum初期点サーチ時の曲線分割数
*ans
ans_sizeans配列の配列長

Return

交点の数(解の数がansのサイズを超えた場合:KOD_ERR)

CalcIntersecPtsNurbsSSearch

int NURBS_Func::CalcIntersecPtsNurbsSSearch(NURBSS *nurbR,
NURBSS *nurbS,
int div,
double ds,
Coord *ansR,
Coord *ansS,
int ans_size)

NURBS曲面S(u,v)とNURBS曲面R(w,t)の交線(交点群)を交点追跡法にて求める

Parameters

nurbsSNURBS曲面S(u,v)
nurbsRNURBS曲面R(w,t)
div初期点サーチ時の曲面分割数
ds交線(交点群)の粗さ(密0.1~2疎)
ans
ans_sizeans配列の配列長

Return

交点の数(NURBS曲面同士が交差していない:KOD_FALSE,特異点または発散により処理を中断:KOD_ERR)

CalcIntersecPtsNurbsSGeom

int NURBS_Func::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)の交線(交点群)を幾何学的に求める(補助平面を用いた解法)

Parameters

*nurbSNURBS曲面S(u,v)
*nurbRNURBS曲面R(w,t)
u_divnumuパラメータ分割数 
v_divnumvパラメータ分割数
*ans算出された交点のu,vパラメータ値をそれぞれans.x,ans.yに格納
ans_sizeansの配列長

Return

交点の個数

SearchIntersectPt

int NURBS_Func::SearchIntersectPt(NURBSS *nurbR,
NURBSS *nurbS,
double ds,
double *w,
double *t,
double *u,
double *v,
int direction)

(private)ニュートン法により交点を真値に収束させる(NURBS曲面同士)

Parameters

*nurbRNURBS曲面S(u,v)
*nurbSNURBS曲面R(w,t)
ds解追跡時の刻み幅
*w,*t,*u,*v
direction追跡方向を表すフラグ(FORWARD or INVERSE)

Return

収束した:KOD_TRUE, パラメータ範囲外:KOD_FALSE, 特異点検出:KOD_ERR

GetNurbsSCoef

void NURBS_Func::GetNurbsSCoef(int M,
double **coef,
double *a,
Coord *b,
int i,
Coord *P,
double *Q)

(private)CalcIntersecPtsPlaneU/V3()のサブ関数.NURBS曲線C(u) or C(v)の係数を求める

Parameters

M階数
**coefBスプライン基底関数の係数
*a,*bu/vを固定した時のNURBS曲線C(v)/C(u)の分母/分子の係数
i曲線の番号
*P, *Q固定されたパラメータにおけるNURBS曲面の係数(P,Q)

CalcIntersecPtsNurbsCNurbsCParam

int NURBS_Func::CalcIntersecPtsNurbsCNurbsCParam(NURBSC *NurbA,
NURBSC *NurbB,
int Divnum,
Coord *ans,
int ans_size)

(x,y)平面上のNURBS曲線同士の交点を求める(ニュートン法)

Parameters

*NurbA, *NurbBNURBS曲線
Divnum初期値設定用の分割数
*ans交点格納用配列
ans_sizeansの配列長

Return

解の個数(ans_sizeを超えたら,KOD_ERR)

ClacIntersecPtsNurbsCLine

int NURBS_Func::ClacIntersecPtsNurbsCLine(NURBSC *C,
Coord P,
Coord r,
double *t1,
double *t2)

2次元NURBS曲線と直線との交点を求める

Parameters

*CNURBS曲線
P直線上の1点
r直線の方向ベクトル
*t1交点におけるNURBS曲線パラメータ
*t2交点における直線パラメータ

return

交点の有無(KOD_TRUE:交点あり, KOD_FALSE:交点なし)

ClacIntersecPtsNurbsCLineSeg

int NURBS_Func::ClacIntersecPtsNurbsCLineSeg(NURBSC *C,
Coord P,
Coord r,
double ts,
double te,
double *t1,
double *t2)

2次元NURBS曲線と線分との交点を求める

Parameters

*CNURBS曲線
P線分上の1点
r線分の方向ベクトル
ts線分の始点パラメータ
te線分の終点パラメータ
*t1交点におけるNURBS曲線パラメータ
*t2交点における直線パラメータ

return

交点の有無(KOD_TRUE:交点あり, KOD_FALSE:交点なし)

CalcIntersecCurve

int NURBS_Func::CalcIntersecCurve(NURBSC *nurb,
Coord pt,
Coord nvec,
int Divnum,
double *ans,
int ans_size,
int LoD)

NURBS曲線と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める. 交点は最大で(M-1)*(K-M+1)点得られる.  (例:4階でコントロールポイントの数8個の場合、(4-1)*(8-4+1)=15点). よって引数*ansは(M-1)*(K-M+1)個の配列を用意することが望ましい.

Parameters

*nurbNURBS曲線
pt平面上の一点
nvec平面の法線ベクトル
DivnumNURBS曲線のパラメータ分割数
*ans算出された交点のtパラメータ値を格納
ans_sizeansの配列長
LoD詳細度(ニュートン法の更新パラメータを足しこむときに,LoDで割ることで,急激なパラメータ変更を避ける.通常は1でよいが,解が得られない場合は値を大きくする.2とか3とか)

Return

交点の個数(KOD_ERR:交点の数がans_sizeを超えた)

CalcIntersecIsparaCurveU

int NURBS_Func::CalcIntersecIsparaCurveU(NURBSS *nurb,
double V,
Coord pt,
Coord nvec,
int Divnum,
double *ans,
int ans_size)

NURBS曲面のU方向アイソパラ曲線(Vパラメータを固定)と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める 交点は最大で(M-1)*(K-M+1)点得られる.  (例:4階でコントロールポイントの数8個の場合、(4-1)*(8-4+1)=15点) よって引数*ansは(M-1)*(K-M+1)個の配列を用意することが望ましい.

Parameters

*nurbNURBS曲面
Vvの固定値
pt平面上の一点
nvec平面の法線ベクトル
DivnumNURBS曲線のパラメータ分割数
*ans算出された交点のtパラメータ値を格納
ans_sizeansの配列長

Return

交点の個数(KOD_ERR:交点の数がans_sizeを超えた)

CalcIntersecIsparaCurveV

int NURBS_Func::CalcIntersecIsparaCurveV(NURBSS *nurb,
double U,
Coord pt,
Coord nvec,
int Divnum,
double *ans,
int ans_size)

NURBS曲面のV方向アイソパラ曲線(Uパラメータを固定)と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める 交点は最大で(M-1)*(K-M+1)点得られる.  (例:4階でコントロールポイントの数8個の場合、(4-1)*(8-4+1)=15点) よって引数*ansは(M-1)*(K-M+1)個の配列を用意することが望ましい.

Parameters

*nurbNURBS曲面
Uuの固定値
pt平面上の一点
nvec平面の法線ベクトル
DivnumNURBS曲線のパラメータ分割数
*ans算出された交点のtパラメータ値を格納
ans_sizeansの配列長

Return

交点の個数(KOD_ERR:交点の数がans_sizeを超えた)

CalcIntersecCurve3

int NURBS_Func::CalcIntersecCurve3(NURBSC *nurb,
Coord pt,
Coord nvec,
double *ans,
int ans_size)

NURBS曲線と平面との交点を求める(3次まで対応) 交点は最大で(M-1)*(K-M+1)点得られる.  (例:4階でコントロールポイントの数8個の場合、(4-1)*(8-4+1)=15点) よって引数*ansは(M-1)*(K-M+1)個の配列を用意することが望ましい.

Parameters

*nurbNURBS曲線
pt平面上の一点
nvec平面の法線ベクトル
*ans算出された交点のtパラメータ値を格納
ans_sizeansの配列長

Return

交点の個数(曲線次数が3次以上:KOD_ERR)

CalcEquation

int NURBS_Func::CalcEquation(double *a,
double *t,
int M)

(private)CalcIntersecCurve3(), CalcIntersecPtsPlaneU/V3()のサブ関数.3次方程式までを解く

Parameters

*a係数行列
*t
M次数

Return

解の個数(解がなかった場合 or 次数が3,2,1のいずれかでない:KOD_ERR)

GetIntersecEquation

void NURBS_Func::GetIntersecEquation(int M,
Coord *P,
double *Q,
Coord pt,
Coord nvec,
double *a)

(private)CalcIntersecCurve3(), CalcIntersecPtsPlaneU/V3()のサブ関数.NURBS曲線と平面の交線導出用方程式を得る

Parameters

M階数
*P, *QNURBS曲線の係数(P,Q)
pt平面上の一点
nvec平面の法線ベクトル
*a結果

GetNurbsCCoef

int NURBS_Func::GetNurbsCCoef(NURBSC *nurb,
double **coef,
int i,
Coord *P,
double *Q)

(private)CalcIntersecCurve3()のサブ関数.NURBS曲線の係数を求める(最高3次)

Parameters

*nurb対象となるNURBS曲線
**coefBスプライン基底関数の係数
i曲線の番号
*P, *QNURBS曲線の係数(P,Q)

Return

成功:KOD_TRUE, 失敗:KOD_ERR

GetBSplCoef3

int NURBS_Func::GetBSplCoef3(int M,
int K,
int i,
double *t,
double **coef)

3次のBスプライン曲線の各係数を求める.

coef[j][0]t^3 + coef[j][1]t^2 + coef[j][2]t + coef[j][3] (Nj,4)

Parameters

M階数
Kコントロールポイントの数
i注目中のコントロールポイント
*tノットベクトル列
*coef算出される係数を格納

Return

KOD_TRUE

GetBSplCoef2

int NURBS_Func::GetBSplCoef2(int M,
int K,
int i,
double *t,
double **coef)

2次のBスプライン曲線の各係数を求める

coef[j][0]t^2 + coef[j][1]t + coef[j][2]

Parameters

M階数
Kコントロールポイントの数
i注目中のコントロールポイント
*tノットベクトル列
*coef算出される係数を格納

Return

KOD_TRUE

GetBSplCoef1

int NURBS_Func::GetBSplCoef1(int M,
int K,
int i,
double *t,
double **coef)

1次のBスプライン曲線の各係数を求める

coef[j][0]t + coef[j][1]

Parameters

M階数
Kコントロールポイントの数
i注目中のコントロールポイント
*tノットベクトル列
*coef算出される係数を格納

Return

KOD_TRUE

ShiftNurbsS

void NURBS_Func::ShiftNurbsS(NURBSS *nurbs,
Coord shift)

NURBS曲面のシフト

Parameters

*nurbs変更されるNURBS曲面
shiftシフト量

ShiftNurbsC

void NURBS_Func::ShiftNurbsC(NURBSC *nurbs,
Coord shift)

NURBS曲線のシフト

Parameters

*nurbs変更されるNURBS曲線
shiftシフト量

RotNurbsS

void NURBS_Func::RotNurbsS(NURBSS *nurbs,
Coord axis,
double deg)

NURBS曲面をDベクトル回りにdeg(°)だけ回転させる

Parameters

*nurbs変更されるNURBS曲面 
axis回転軸の単位ベクトル 
deg角度(degree)

RotNurbsC

void NURBS_Func::RotNurbsC(NURBSC *nurbs,
Coord axis,
double deg)

NURBS曲面をDベクトル回りにdeg(°)だけ回転させる

Parameters

*nurbs変更されるNURBS曲線 
axis回転軸の単位ベクトル 
deg角度(degree)

ChRatioNurbsS

void NURBS_Func::ChRatioNurbsS(NURBSS *nurbs,
Coord ratio)

NURBS曲面の倍率を変更する

Parameters

*nurbs変更されるNURBS曲面
ratio倍率

ChRatioNurbsC

void NURBS_Func::ChRatioNurbsC(NURBSC *nurbs,
Coord ratio)

NURBS曲線の倍率を変更する

Parameters

*nurbs変更されるNURBS曲線
ratio倍率

SetCPNurbsS

int NURBS_Func::SetCPNurbsS(NURBSS *nurbs,
NURBSS Nurbs)

NURBS曲面nurbsのコントロールポイントを,NURBS曲面Nurbsのコントロールポイントに置き換える

Parameters

*nurbs置換されるNURBS曲面
Nurbs代入元のNURBS曲面

Return

正常終了:KOD_TRUE, 両曲面のコントロールポイント数が一致していない:KOD_ERR

GenInterpolatedNurbsC1

int NURBS_Func::GenInterpolatedNurbsC1(NURBSC *Nurbs,
Coord *P,
int PNum,
int M)

与えられた点列を補間するn階のNURBS曲線を生成する.  端末条件を与えないバージョン

Parameters

*Nurbs生成されるNURBS曲線のアドレス
*P点列
PNum点列の数
M階数

Return

正常終了:KOD_TRUE, 与えられた点列が1個未満:KOD_ERR, 計算過程でゼロ割が発生:KOD_ERR

GenInterpolatedNurbsC2

int NURBS_Func::GenInterpolatedNurbsC2(NURBSC *Nurbs,
Coord *P_,
int PNum,
int M)

与えられた点列を補間するn階のNURBS曲線を生成する. 端末条件:始点とC2で一致

Parameters

*Nurbs生成されるNURBS曲線のアドレス
*P_通過点列(P_[0]とP_[PNum-1]は一致していること)
PNum通過点列の数
M階数

Return

KOD_TRUE:正常終了, KOD_FALSE:点列の始点と終点が一致していない, KOD_ERR:点列の数が1個未満

GenApproximationNurbsC

int NURBS_Func::GenApproximationNurbsC(NURBSC *Nurbs,
Coord *P,
int PNum,
int M)

与えられた点列を近似するn階のNURBS曲線を生成する

Parameters

*Nurbs生成されるNURBS曲線のアドレス
*P点列
PNum点列の数
M階数

Return

正常終了:KOD_TRUE, 与えられた点が1個未満:KOD_ERR

GenNurbsCfromCP

int NURBS_Func::GenNurbsCfromCP(NURBSC *Nurbs,
Coord *P,
int PNum,
int M)

コントロールポイントからNURBS曲線を生成する

ノットベクトルは等間隔に設定される

重みは全て1とする

Parameters

*Nurbs生成されるNURBS曲線のアドレス
*P点列
PNum点列の数
M階数 正常終了:KOD_TRUE, 与えられた点が1個未満:KOD_ERR

GenPolygonalLine

int NURBS_Func::GenPolygonalLine(NURBSC *Nurbs,
Coord *P,
int PNum)

折れ線(NURBS曲線)を生成する

Parameters

*Nurbs生成されるNURBS曲線のアドレス
*Pコントロールポイント
PNumコントロールポイントの数

Return

正常終了:KOD_TRUE, 与えられた点が1個未満:KOD_ERR

GenInterpolatedNurbsS1

int NURBS_Func::GenInterpolatedNurbsS1(NURBSS *Nurbs,
Coord **P,
int PNum_u,
int PNum_v,
int Mu,
int Mv)

与えられた点列を補間するn階NURBS曲面を生成する. 端末条件を与えないバージョン

Parameters

*Nurbs生成されるNURBS曲面のアドレス
**P与えられた点列
PNum_u,PNum_v点の数 
Mu,Mv階数

Return

正常終了:KOD_TRUE, 与えられた点が1個未満:KOD_ERR

GenApproximationNurbsS

int NURBS_Func::GenApproximationNurbsS(NURBSS *Nurbs,
Coord **P,
int PNum_u,
int PNum_v,
int Mu,
int Mv)

与えられた点列を近似するn階のNURBS曲面を生成する

Parameters

*Nurbs生成されるNURBS曲面のアドレス
**P与えられた点列
PNum_u,PNum_v点の数 
Mu,Mv階数

Return

正常終了:KOD_TRUE, 与えられた点が1個未満:KOD_ERR

GenNurbsSfromCP

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

与えられたコントロールポイントからn階のNURBS曲面を生成する

ノットベクトルは等間隔に設定される

重みは全て1とする

Parameters

*Nurbs生成されるNURBS曲面のアドレス
**P与えられたコントロールポイント列
PNum_u,PNum_v点の数 
Mu,Mv階数

Return

正常終了:KOD_TRUE, 与えられた点が1個未満:KOD_ERR

ConnectNurbsSU

int NURBS_Func::ConnectNurbsSU(NURBSS *S1,
NURBSS *S2,
NURBSS *S_)

2枚のNURBS曲面を連結する(U方向に長くなる)(S1_U1とS2_U0を連結)

Parameters

*S1面1
*S2面2
*S_連結後の面を格納

Return

成功:KOD_TRUE, 失敗:KOD_FALSE

ConnectNurbsSV

int NURBS_Func::ConnectNurbsSV(NURBSS *S1,
NURBSS *S2,
NURBSS *S_)

2枚のNURBS曲面を連結する(V方向に長くなる)(S1_V1とS2_V0を連結)

Parameters

*S1面1
*S2面2
*S_連結後の面を格納

Return

成功:KOD_TRUE, 失敗:KOD_FALSE

SetCPSU_ConnectS

void NURBS_Func::SetCPSU_ConnectS(NURBSS *S1,
NURBSS *S2,
NURBSS *S_)

(private)ConnectNurbsSU()のサブ関数.S_のu方向コントロールポイントとウェイトを指定

Parameters

*S1面1
*S2面2
*S_連結後の面を格納

SetKnotVecSU_ConnectS

void NURBS_Func::SetKnotVecSU_ConnectS(NURBSS *S1,
NURBSS *S2,
NURBSS *S_)

(private)ConnectNurbsSU()のサブ関数.S_のu方向ノット定義域を指定

Parameters

*S1面1
*S2面2
*S_連結後の面を格納

SetCPSV_ConnectS

void NURBS_Func::SetCPSV_ConnectS(NURBSS *S1,
NURBSS *S2,
NURBSS *S_)

(private)ConnectNurbsSV()のサブ関数.S_のv方向コントロールポイントとウェイトを指定

Parameters

*S1面1
*S2面2
*S_連結後の面を格納

SetKnotVecSV_ConnectS

void NURBS_Func::SetKnotVecSV_ConnectS(NURBSS *S1,
NURBSS *S2,
NURBSS *S_)

(private)ConnectNurbsSV()のサブ関数.S_のv方向ノット定義域を指定

Parameters

*S1面1
*S2面2
*S_連結後の面を格納

CalcuIntersecPtNurbsLine

int NURBS_Func::CalcuIntersecPtNurbsLine(NURBSS *Nurb,
Coord r,
Coord p,
int Divnum,
Coord *ans,
int anssize,
int LoD)

NURBS曲面と直線の交点を算出

Parameters

*NurbNURBS曲面S(u,v)へのポインタ
r直線N(t)上の1点
p直線N(t)の方向
DivNumNURBS曲面の分割数
*ans交点のu,v,tパラメータ格納用配列
anssizeansの配列長

Divnumが大きいほど、交点算出の取りこぼしは少なくなる.

anssizeはDivNum*DivNum以上にするのが好ましい.

LoD詳細度(ニュートン法の更新パラメータを足しこむときに,LoDで割ることで,急激なパラメータ変更を避ける.通常は1でよいが,解が得られない場合は値を大きくする.2とか3とか)

Return

交点の数, KOD_ERR:交点の数が指定した配列長を超えた

CalcIntersecPtNurbsPt

int NURBS_Func::CalcIntersecPtNurbsPt(NURBSS *S,
Coord P,
int Divnum,
int LoD,
Coord *Q)

空間上の1点PからNURBS曲面S上の最近傍点Qを求める(ニュートン法)

直線の方程式L(t) = P + tN
NはS上の法線ベクトルと一致するからN=Su×Sv
方程式:S(u,v) = P + tN(u,v)
F(u,v,t) = S(u,v) - P - tN(u,v)   として、ニュートン法を用いる
Fu = Su - tNu   Fv = Sv - tNv   Ft = -N
|Fu.x Fv.x Ft.x||du|    |F.x|
|Fu.y Fv.y Ft.y||dv| = -|F.y|    =>     dF・d = -F     =>     d = -F・dF^-1
|Fu.z Fv.z Ft.z||dt|    |F.z|

Parameters

*SNURBS曲面
P空間上の1点
Divnumニュートン法初期値指定用の曲面分割数
LoDニュートンパラメータ更新時のステップサイズ(1~)
Q解(S上の点をu,v,tパラメータでCoord構造体に格納)

Return

KOD_TRUE:収束した KOD_FALSE:収束しなかった

CalcIntersecPtNurbsPt

int NURBS_Func::CalcIntersecPtNurbsPt(NURBSC *C,
Coord P,
int Divnum,
int LoD,
double *Q)

空間上の1点PからNURBS曲線C上の最近傍点Q(曲線パラメータ)を求める(ニュートン法)

F(t) = (P-C'(t))・C'(t) = 0
F'(t)dt = -F(t)
F'(t) = -|C'(t)|^2 + (P+C(t))・C"(t)

Parameters

*CNURBS曲線
P空間上の1点
Divnumニュートン法初期値指定用の曲線分割数
LoDニュートンパラメータ更新時のステップサイズ(1~)
Q解(C上の点をtパラメータで格納)

Return

KOD_TRUE:収束した KOD_FALSE:収束しなかった

GetMinDist

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

(private)CalcIntersecPtNurbsPt()のサブ関数.最小距離を調べる

Parameters

*SNURBS曲面へのポインタ
P空間上の1点
*Q曲面上の点群(u,vパラメータで指定)
N点数
*Ans最小距離を持つ曲面上の点

Return

成功:KOD_TRUE, 失敗:KOD_ERR

DetermPtOnTRMSurf

int NURBS_Func::DetermPtOnTRMSurf(TRMS *Trim,
double u,
double v)

注目中のNURBS曲面上の1点(u,v)がトリミング領域内にあるのかを判定する

Parameters

*Trimトリム曲面
u,vトリム曲面上の1点(u, v)

Return

KOD_TRUE:面上 KOD_ONEDGE:エッジ上 KOD_FALSE:面外 KOD_ERR:エラー

DetermPtOnTRMSurf_sub

int NURBS_Func::DetermPtOnTRMSurf_sub(CONPS *Conps,
double u,
double v)

(private)DetermPtOnTRMSurf()のサブ関数.面上線のタイプが複合曲線の場合のトリミング領域内外判定

Parameter

*Conps複合曲線
u,vトリム曲面上の1点(u, v)

Return

KOD_TRUE:面上 KOD_ONEDGE:エッジ上 KOD_FALSE:面外 KOD_ERR:エラー

GetPtsOnOuterTRMSurf

int NURBS_Func::GetPtsOnOuterTRMSurf(TRMS *Trm,
Coord *Pt,
int N)

外周トリム面内の点のみ残す

Parameters

*Trmトリム面へのポインタ
*Pt判別対象の(u,v)群
N(u,v)群の数

Return

残った点の数 (外周トリムが存在しない:KOD_FALSE)

GetPtsOnInnerTRMSurf

int NURBS_Func::GetPtsOnInnerTRMSurf(TRMS *Trm,
Coord *Pt,
int N)

内周トリム面外の点のみ残す

Parameters

*Trmトリム面へのポインタ
*Pt判別対象の(u,v)群
N(u,v)群の数

Retrun

残った点の数 (内周トリムが存在しない:KOD_FALSE)

GetPtsOnInnerOuterTRMSurf

int NURBS_Func::GetPtsOnInnerOuterTRMSurf(TRMS *Trm,
Coord *Pt,
int N)

内外周トリム面内の点のみ残す

Parameters

*Trmトリム面へのポインタ
*Pt判別対象の(u,v)群
N(u,v)群の数

Return

残った点の数 (内周トリムが存在しない:KOD_FALSE)

ApproxTrimBorder

int NURBS_Func::ApproxTrimBorder(COMPC *CompC,
Coord *P)

(private)トリム境界線を点群で近似する

Parameters

*CompCトリム境界線を構成する複合曲線へのポインタ
*P近似された点群を格納するためのCoord配列

Return

近似した点群の数(トリム境界線がNURBS曲線以外で構成されていた場合は,KOD_ERR)

CalcDeltaPtsOnNurbsC

int NURBS_Func::CalcDeltaPtsOnNurbsC(NURBSC *Nurb,
int D,
Coord *Pts)

指定した分割数でNURBS曲線上の座標値を出力する

Parameters

*NurbNURBSへのポインタ
D分割数
*Pts出力される座標値を格納

Return

点数

CalcDeltaPtsOnNurbsC

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

指定した間隔でNURBS曲線上の座標値を出力する

Parameters

*NurbNURBS曲線へのポインタ
D間隔
*Pts出力される座標値を格納

Return

点数(Dが0,あるいは指定したNURBS曲線の全長より長かった場合は,KOD_ERR)

CalcParamLengthOnNurbsC

double NURBS_Func::CalcParamLengthOnNurbsC(NURBSC *C,
double L,
double Init_t)

NURBS曲線において一端からの指定距離におけるパラメータ値を返す

Parameters

*CNURBS曲線
L指定距離
Init_t解探索の初期パラメータ

Return

指定距離におけるパラメータ値

CalcDeltaPtsOnNurbsS

int NURBS_Func::CalcDeltaPtsOnNurbsS(NURBSS *S,
int Du,
int Dv,
Coord **Pts)

指定した分割数でNURBS曲面上の座標値を求める

Parameters

*SNURBSSへのポインタ
Du,Dvu方向,v方向の分割数
**Pts出力される座標値を格納

Return

点数

CalcExtremumNurbsC

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

NURBS曲線の指定した方向における極値の座標値を得る

Parameters

*C極値座標を求めたいNURBS曲線へのポインタ
nf方向ベクトル
*pt得られた極値のNurbs曲線パラメータ値列
ptnum*ptの配列長

Return

得られた極値パラメータの数(KOD_FALSE:得られなかった, KOD_ERR:極値パラメータの数がptnumを超えた)

CalcExtSearchCurve

int NURBS_Func::CalcExtSearchCurve(NURBSS *S,
Coord n,
Coord pt,
double ds,
NURBSC *C1,
NURBSC *C2)

(準備中)極値探索線を得る

Parameters

*S対象とするNURBS曲線
n法線ベクトル pt -
ds極値探索線を追跡する際の刻み幅
*C1得られた極値探索線(NURBS曲線)
*C2得られた極値探索線(NURBS曲線)(極地探索線は2つ得られる)

Return

KOD_TRUE

CalcExtGradCurve

int NURBS_Func::CalcExtGradCurve(NURBSS *S,
Coord n,
Coord pt,
double ds,
NURBSC *C1,
NURBSC *C2)

(準備中)極値傾斜線を得る

Parameters

*S対象とするNURBS曲線
n法線ベクトル pt -
ds極値傾斜線を追跡する際の刻み幅
*C1得られた極値傾斜線(NURBS曲線)
*C2得られた極値傾斜線(NURBS曲線)(極値傾斜線は2つ得られる)

Return

KOD_TRUE

SearchExtremum_BS

int NURBS_Func::SearchExtremum_BS(NURBSS *S,
Coord nf,
double u0,
double v0,
double H,
int param,
int direction,
Coord *ans)

Bulirsch-Stoer法により極地探索を行う(微分方程式:du(s)/ds = fu(u,v) と、dv(s)/ds = fv(u,v)の解探索)

Parameters

*S極値探索されるNURBS曲面へのポインタ
nf平面の法線ベクトル
u0,v0開始点
H探索幅
paramu方向の1階微分が0となる極値の探索(PARAM_U) or v方向探索(PARAM_V)の選択
direction順方向探索(FORWARD) or逆方向探索(INVERSE)
*ans更新されたu,vパラメータ(ans.x = u, ans.y = v)

Return

KOD_TRUE:正常終了, KOD_FALSE:特異点により処理を中断, KOD_ERR:パラメータの指定ミスにより処理を中断

GetSECParam1

int NURBS_Func::GetSECParam1(NURBSS *S,
double u,
double v,
Coord nf,
int param,
int direction,
Coord *f)

(private)極値探索線Sub関数1

Parameters

*SNURBS曲面
u, v注目中の(u, v)パラメータ
nf平面の法線ベクトル
paramu方向の1階微分が0となる極値の探索(PARAM_U) or v方向探索(PARAM_V)の選択
direction順方向探索(FORWARD) or逆方向探索(INVERSE)
*ff.x = fu(u,v), f.y = fv(u,v)

Return

成功:KOD_TURE, 特異点につき処理を中断した:KOD_FALSE

TrimNurbsSPlaneSub1

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

(private)TrimNurbsSPlaneのサブ関数(2D上の2直線の交点をもとめる)

Parameters

a,b1つ目の直線の係数
x0, y0, x1, y12つ目の直線が通る2点

Return

交点の2D座標値

GetCurveKnotParam1

void NURBS_Func::GetCurveKnotParam1(Coord *P,
int PNum,
Vector T_)

(private)各通過点の曲線パラメータを算出(コード長の比から算出)

Parameters

*P通過点列
PNum通過点列の数
T_曲線パラメータを格納

GetCurveKnotParam2

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

(private)各通過点の曲線パラメータを算出(コード長の平方根の比から算出)

Parameters

*P通過点列
PNum通過点列の数
T_曲線パラメータを格納

GetEqIntervalKont

void NURBS_Func::GetEqIntervalKont(int K,
int M,
Vector T)

(private)曲線/曲面パラメータから等間隔なノットベクトルを算出

Parameters

Kコントロールポイントの数
M階数
T格納するノットベクトル列

GetInterpolatedKnot

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

(private)曲線/曲面パラメータから補間用ノットベクトルを算出

Parameters

T_曲線パラメータ列
Nノットベクトルの数
Kコントロールポイントの数
M階数
T格納するノットベクトル列

GetApproximatedKnot

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

(private)曲線/曲面パラメータから近似用ノットベクトルを算出

Parameters

T_曲線パラメータ列
N曲線パラメータの数
M階数
Kコントロールポイントの数
T格納するノットベクトル列

ChangeKnotVecRange

void NURBS_Func::ChangeKnotVecRange(Vector T,
int N,
int M,
int K,
double Ts,
double Te)

(private)曲線/曲面パラメータの定義域を変更する

Parameters

T変更したいノットベクトル列
NTの配列長
M階数
Kコントロールポイントの数
Tst開始ノットベクトル
Te終了ノットベクトル

ChangeKnotVecRange

(private)最小2乗法で近似コントロールポイントを求める

Parameters

*P通過点列
T_曲線パラメータ列
Tノットベクトル
Pnum曲線パラメータの数
Nnumノットベクトルの数
M階数
Kコントロールポイントの数
*Q算出されたコントロールポイント列

SetApproximationCPnum

int NURBS_Func::SetApproximationCPnum(int PNum)

(private)点列数から生成するコントロールポイント数を算定する(勘です。)

Parameters

PNum点列数

Return

コントロールポイントの数

DebugForNurbsC

void NURBS_Func::DebugForNurbsC(NURBSC *nurbs)

NURBS曲線情報をデバッグプリント

Parameters

*nurbsデバッグするNURBS曲線

DebugForNurbsS

void NURBS_Func::DebugForNurbsS(NURBSS *nurbs)

NURBS曲面情報をデバッグプリント

Parameters

*nurbsデバッグするNURBS曲面

CalcNurbsCLength

double NURBS_Func::CalcNurbsCLength(NURBSC *Nurb,
double a,
double b)

NURBS曲線C(t)の指定パラメータ区間[a,b]の線分長Lを求める

L = S|C’(t)|dt (Sは積分記号)

積分は数値積分(ガウス-ルジャンドルの80分点)を用いる

Parameters

*Nurb対象となるNURBS曲線
a, b指定パラメータ区間[a,b]

Return

線分長

CalcNurbsCLength

double NURBS_Func::CalcNurbsCLength(NURBSC *Nurb)

NURBS曲線C(t)の全区間の線分長Lを求める

L = S|C’(t)|dt (Sは積分記号)

積分は数値積分(ガウス-ルジャンドルの80分点)を用いる

Parameters

*Nurb対象となるNURBS曲線

Return

線分長

GetMinDistance

Coord NURBS_Func::GetMinDistance(Coord a,
Coord *b,
int n)

(private)最小距離を持つ座標値を返す

Parameters

a対象とする1点
*b探索する点群
n点群の数

Return

最小距離となる点b_min

DivNurbsC

int NURBS_Func::DivNurbsC(NURBSC *C0,
NURBSC *C1,
NURBSC *C2,
double L)

NURBS曲線を指定した位置(端からの弧長)で分割する

Parameters

*C0分割するNURBS曲線へのポインタ
*C1分割されたNURBS曲線へのポインタ
*C2分割されたNURBS曲線へのポインタ
L端からの弧長

Return

成功:KOD_TRUE, 失敗:KOD_FALSE

DivNurbsCParam

int NURBS_Func::DivNurbsCParam(NURBSC *C0,
NURBSC *C1,
NURBSC *C2,
double t)

NURBS曲線を指定したパラメータ値で分割する

Parameters

*C0分割するNURBS曲線へのポインタ
*C1分割されたNURBS曲線へのポインタ
*C2分割されたNURBS曲線へのポインタ
t分割位置を表す曲線パラメータ

Return

成功:KOD_TRUE, 失敗:KOD_FALSE

ConnectNurbsC

int NURBS_Func::ConnectNurbsC(NURBSC *C1,
NURBSC *C2,
NURBSC *C_)

2本のNURBS曲線を連結する

Parameter

*C1曲線1
*C2曲線2
*C_連結後の曲線を格納

Return

成功:KOD_TRUE, 失敗:KOD_FALSE

ReverseNurbsC

void NURBS_Func::ReverseNurbsC(NURBSC *C)

NURBS曲線のノットベクトル向きを反転する

Parameters

*CNURBS曲線

SetKnotVecC_ConnectC

void NURBS_Func::SetKnotVecC_ConnectC(NURBSC *C1,
NURBSC *C2,
NURBSC *C_)

(private)2本の曲線を繋げたときのノットベクトルを設定する

Parameters

*C1, *Cs連結する2つのNURBS曲線
*C_連結後のNURBS曲線

SetCPC_ConnectC

void NURBS_Func::SetCPC_ConnectC(NURBSC *C1,
NURBSC *C2,
NURBSC *C_)

(private)2本の曲線を繋げたときのコントロールポイントとウェイトを設定する

Parameters

*C1, *C2連結する2つのNURBS曲線
*C_連結後のNURBS曲線

InsertNewKnotOnNurbsC

int NURBS_Func::InsertNewKnotOnNurbsC(NURBSC *C,
NURBSC *C_,
double t,
int deg)

(private)NURBS曲線に新たなノットを挿入する

Parameters

*C元のNURBS曲線
*C_挿入対象のNURBS曲線
t挿入するノット
deg多重度

Return

新たなノットベクトル列におけるtの挿入位置

int NURBS_Func::New_NurbsC(NURBSC *nurb,
int K,
int N)
Nurbs曲線のメモリー確保
void NURBS_Func::Free_NurbsC_1DArray(NURBSC *a,
int num)
NURBS曲線配列のメモリー解放
void NURBS_Func::Free_NurbsC(NURBSC *a)
1本のNURBS曲線のメモリー解放
int NURBS_Func::New_NurbsS(NURBSS *nurb,
int K[2],
int N[2])
NURBS曲面のメモリー確保
void NURBS_Func::Free_NurbsS_1DArray(NURBSS *a,
int num)
NURBS曲面配列のメモリー解放
void NURBS_Func::Free_NurbsS(NURBSS *a)
1つのNURBS曲面のメモリー解放
int NURBS_Func::New_TrmS(TRMS *trms,
int num)
トリム面のメモリー確保
void NURBS_Func::Free_TrmS_1DArray(TRMS *a,
int num)
トリム面配列のメモリー解放
void NURBS_Func::Free_TrmS(TRMS *a)
トリム面のメモリー解放
int NURBS_Func::New_CompC(COMPC *compc,
int num)
複合曲線のメモリー確保
void NURBS_Func::Free_CompC_1DArray(COMPC *a,
int num)
複合曲線配列のメモリー解放
void NURBS_Func::Free_CompC(COMPC *a)
複合曲線のメモリー解放
int NURBS_Func::GenNurbsC(NURBSC *Nurbs,
int K,
int M,
int N,
double T[],
double W[],
Coord cp[],
double V[],
int prop[],
int euflag)
1つのNurbs曲線を生成する
void NURBS_Func::DelNurbsC(NURBSC *Nurbs)
GenNurbsC()によって生成されたNURBS曲線を削除する
int NURBS_Func::GenNurbsS(NURBSS *Nurbs,
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)
1つのNURBS曲面を生成する
int NURBS_Func::GenRotNurbsS(NURBSS *NurbsS,
NURBSC NurbsC,
Coord Axis,
double deg)
NurbsCを原点を通るAxis回りにdegだけ回転させた回転サーフェスNurbsSを生成する
int NURBS_Func::GenSweepNurbsS(NURBSS *NurbsS,
NURBSC NurbsC,
Coord Axis,
double Len)
1つのNURBS曲線からある軸方向にある距離だけスイープさせたスイープサーフェスを生成する
int NURBS_Func::GenIsoparamCurveU(NURBSS *P,
double u,
NURBSC *C)
NURBS曲面上のu方向パラメータ値を固定したときのアイソパラメトリックNURBS曲線を生成
int NURBS_Func::GenIsoparamCurveV(NURBSS *P,
double v,
NURBSC *C)
NURBS曲面上のv方向パラメータ値を固定したときのアイソパラメトリックNURBS曲線を生成
void NURBS_Func::DelNurbsS(NURBSS *Nurbs)
GenNurbsS()によって生成されたNURBS曲面を削除する
int NURBS_Func::GenTrimdNurbsS(TRIMD_NURBSS *TNurbs,
TRIMD_NURBSS tnurb)
トリム面を有するNURBS曲面をコピーする
int NURBS_Func::DelTrimdNurbsS(TRIMD_NURBSS *TNurbs)
GenTrimdNurbsS()によって生成されたトリム面を削除する
Coord NURBS_Func::CalcNurbsCCoord(NURBSC *NurbsC,
double t)
指定したノットtでのNURBS曲線の座標値を求める
void NURBS_Func::CalcNurbsCCoords(NURBSC *NurbsC,
int Ptnum,
double *T,
Coord *Pt)
指定したノットt群でのNURBS曲線の座標値を求める
Coord NURBS_Func::CalcNurbsSCoord(NURBSS *NurbsS,
double div_u,
double div_v)
指定したノットu,vでのNURBS曲面の座標値を求める
void NURBS_Func::CalcNurbsSCoords(NURBSS *NurbsS,
int Ptnum,
Coord *UV,
Coord *Pt)
指定したノットu,v群でのNURBS曲面の座標値群を求める
double NURBS_Func::CalcBSbasis(double t,
double knot[],
int N,
int I,
int M)
Bスプライン基底関数を計算し、計算結果を返す
double NURBS_Func::CalcDiffBSbasis(double t,
double knot[],
int N,
int I,
int M)
Bスプライン基底関数の1階微分係数を求める
double NURBS_Func::CalcDiffBSbasisN(double t,
double knot[],
int N,
int I,
int M,
int Dn)
Bスプライン基底関数のN階微分係数を求める
Coord NURBS_Func::CalcDiff2NurbsC(NURBSC *NurbsC,
double t)
NURBS曲線の2階微分係数を求める
Coord NURBS_Func::CalcDiffNNurbsC(NURBSC *NurbsC,
int r,
double t)
NURBS曲線のr階微分係数を求める
Coord NURBS_Func::CalcDiffuNurbsS(NURBSS *NurbsS,
double div_u,
double div_v)
NURBS曲面のu方向の1階微分係数を得る
Coord NURBS_Func::CalcDiffvNurbsS(NURBSS *NurbsS,
double div_u,
double div_v)
NURBS曲面のv方向の1階微分係数を得る
Coord NURBS_Func::CalcDiffNNurbsS(NURBSS *S,
int k,
int l,
double u,
double v)
NURBS曲面の各方向を任意階微分したときの微分係数を求める
double NURBS_Func::CalcDiffNurbsSDenom(NURBSS *S,
int k,
int l,
double u,
double v)
(private)NURBS曲面分母の各方向を任意階微分したときの微分係数を求める
Coord NURBS_Func::CalcDiffNurbsSNumer(NURBSS *S,
int k,
int l,
double u,
double v)
(private)NURBS曲面分子の各方向を任意階微分したときの微分係数を求める
Coord NURBS_Func::CalcNormVecOnNurbsS(NURBSS *nurb,
double u,
double v)
NURBS曲面上の(u,v)における法線ベクトルをもとめる
Coord NURBS_Func::CalcTanVecOnNurbsC(NURBSC *C,
double t)
NURBS曲線上のtにおける単位接ベクトルをもとめる
Coord NURBS_Func::CalcDiffuNormVecOnNurbsS(NURBSS *nurb,
double u,
double v)
NURBS曲面上の(u,v)における法線ベクトルのu方向1階微分をもとめる Nu = Suu×Sv + Su×Suv
Coord NURBS_Func::CalcDiffvNormVecOnNurbsS(NURBSS *nurb,
double u,
double v)
NURBS曲面上の(u,v)における法線ベクトルのv方向1階微分をもとめる Nv = Suv×Sv + Su×Svv
double NURBS_Func::CalcMeanCurvature(NURBSS *nurb,
double u,
double v)
NURBS曲面上の(u,v)における平均曲率を求める
Coord NURBS_Func::CalcMeanCurvatureNormVec(NURBSS *nurb,
double u,
double v)
NURBS曲面上の(u,v)における平均曲率法線ベクトルをもとめる
double NURBS_Func::CalcGaussCurvature(NURBSS *nurb,
double u,
double v)
NURBS曲面上の(u,v)におけるガウス曲率を求める
Coord NURBS_Func::CalcGaussCurvatureNormVec(NURBSS *nurb,
double u,
double v)
NURBS曲面上の(u,v)におけるガウス曲率法線ベクトルをもとめる
double NURBS_Func::CalcCurvatureNurbsC(NURBSC *C,
double t)
NURBS曲線の曲率を求める
int NURBS_Func::DetectInterfereNurbsS(NURBSS *nurbR,
NURBSS *nurbS,
int divnum)
NURBS曲面S(u,v)とNURBS曲面R(w,t)の干渉を検出する(トリム無)
int NURBS_Func::DetectInterfereTrmS(TRIMD_NURBSS *tNurbR,
TRIMD_NURBSS *tNurbS,
int divnum)
NURBS曲面S(u,v)とNURBS曲面R(w,t)の干渉を検出する(トリム有)
int NURBS_Func::CalcIntersecPtsPlaneV3(NURBSS *nurb,
Coord pt,
Coord nvec,
int v_divnum,
Coord *ans,
int ans_size)
3次以下のNURBS曲面と平面との交点群を代数解法にて求める(vパラメータ分割)
int NURBS_Func::CalcIntersecPtsPlaneU3(NURBSS *nurb,
Coord pt,
Coord nvec,
int u_divnum,
Coord *ans,
int ans_size)
3次以下のNURBS曲面と平面との交点群を代数解法にて求める(uパラメータ分割)
int NURBS_Func::CalcIntersecPtsPlaneV(NURBSS *nurbss,
Coord pt,
Coord nvec,
int v_divnum,
Coord *ans,
int ans_size)
V方向のアイソパラ曲線を指定した分割数で生成し,各曲線とNURBS曲面との交点を算出する
int NURBS_Func::CalcIntersecPtsPlaneU(NURBSS *nurbss,
Coord pt,
Coord nvec,
int u_divnum,
Coord *ans,
int ans_size)
U方向のアイソパラ曲線を指定した分割数で生成し,各曲線とNURBS曲面との交点を算出する
int NURBS_Func::CalcIntersecPtsOffsetPlaneSearch(NURBSS *nurb,
double os,
Coord pt,
Coord nvec,
double ds,
int initdivnum,
Coord *ans,
int ans_size)
オフセットNURBS曲面と平面との交点群を交点追跡法にて求める
int NURBS_Func::CalcIntersecPtsPlaneSearch(NURBSS *nurb,
Coord pt,
Coord nvec,
double ds,
int initdivnum,
Coord *ans,
int ans_size,
int method)
NURBS曲面と平面との交点群を交点追跡法にて求める
int NURBS_Func::CheckClossedPoints(Coord A,
Coord B,
Coord P)
(private)指定した点が他の2点を対角とする立方体の中に存在するかを調べる
Coord NURBS_Func::CalcIntersecPtsPlaneSearch_Sub(NURBSS *nurb,
double u,
double v,
Coord pt,
Coord nvec)
(private)平面とNURBS曲面との交点群を求める関数CalcIntersecPtsPlaneSearch()のサブ関数. 面から飛び出した(u,v)を参考に面のエッジ部における交点(new_u,new_v)を得る
int NURBS_Func::SearchIntersectPt_BS(NURBSS *S,
Coord pt,
Coord nvec,
double H,
double *u0,
double *v0,
int direction)
(private)Bulirsch-Stoer法により交点を収束させる(NURBS曲面と平面)
int NURBS_Func::GetSIPParam1(NURBSS *S,
double u,
double v,
Coord pt,
Coord nvec,
int direction,
Coord *f)
(private)SearchIntersectPt_BS()のサブ関数.曲面と平面の交点を表す微分方程式の右辺の値を得る
int NURBS_Func::SearchIntersectPt_RKM(NURBSS *S,
Coord pt,
Coord n,
double delta,
double *u,
double *v,
int direction)
(private)4次のルンゲクッタ法により交点を導出(NURBS曲面と平面)
int NURBS_Func::SearchIntersectPt_OS(NURBSS *S,
Coord pt,
Coord n,
double delta,
double *u,
double *v,
int direction)
(private)4次のルンゲクッタ法により交点を導出(オフセットNURBS曲面と平面)
int NURBS_Func::SearchIntersectPt(NURBSS *nurb,
Coord pt,
Coord nvec,
double ds,
double *u,
double *v,
int direction)
(private)ニュートン法により交点を真値に収束させる(NURBS曲面と平面)
int NURBS_Func::CalcIntersecPtsNurbsSNurbsC(NURBSS *NurbsS,
NURBSC *NurbsC,
int Divnum,
Coord *ans,
int ans_size)
NURBS曲面とNURBS曲線との交点群を交線追跡法で求める
int NURBS_Func::CalcIntersecPtsNurbsSSearch(NURBSS *nurbR,
NURBSS *nurbS,
int div,
double ds,
Coord *ansR,
Coord *ansS,
int ans_size)
NURBS曲面S(u,v)とNURBS曲面R(w,t)の交線(交点群)を交点追跡法にて求める
int NURBS_Func::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)の交線(交点群)を幾何学的に求める(補助平面を用いた解法)
void NURBS_Func::GetNurbsSCoef(int M,
double **coef,
double *a,
Coord *b,
int i,
Coord *P,
double *Q)
(private)CalcIntersecPtsPlaneU/V3()のサブ関数.NURBS曲線C(u) or C(v)の係数を求める
int NURBS_Func::CalcIntersecPtsNurbsCNurbsCParam(NURBSC *NurbA,
NURBSC *NurbB,
int Divnum,
Coord *ans,
int ans_size)
(x,y)平面上のNURBS曲線同士の交点を求める(ニュートン法)
int NURBS_Func::ClacIntersecPtsNurbsCLine(NURBSC *C,
Coord P,
Coord r,
double *t1,
double *t2)
2次元NURBS曲線と直線との交点を求める
int NURBS_Func::ClacIntersecPtsNurbsCLineSeg(NURBSC *C,
Coord P,
Coord r,
double ts,
double te,
double *t1,
double *t2)
2次元NURBS曲線と線分との交点を求める
int NURBS_Func::CalcIntersecCurve(NURBSC *nurb,
Coord pt,
Coord nvec,
int Divnum,
double *ans,
int ans_size,
int LoD)
NURBS曲線と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める. 交点は最大で(M-1)*(K-M+1)点得られる.
int NURBS_Func::CalcIntersecIsparaCurveU(NURBSS *nurb,
double V,
Coord pt,
Coord nvec,
int Divnum,
double *ans,
int ans_size)
NURBS曲面のU方向アイソパラ曲線(Vパラメータを固定)と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める 交点は最大で(M-1)*(K-M+1)点得られる.
int NURBS_Func::CalcIntersecIsparaCurveV(NURBSS *nurb,
double U,
Coord pt,
Coord nvec,
int Divnum,
double *ans,
int ans_size)
NURBS曲面のV方向アイソパラ曲線(Uパラメータを固定)と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める 交点は最大で(M-1)*(K-M+1)点得られる.
int NURBS_Func::CalcIntersecCurve3(NURBSC *nurb,
Coord pt,
Coord nvec,
double *ans,
int ans_size)
NURBS曲線と平面との交点を求める(3次まで対応) 交点は最大で(M-1)*(K-M+1)点得られる.
int NURBS_Func::CalcEquation(double *a,
double *t,
int M)
(private)CalcIntersecCurve3(), CalcIntersecPtsPlaneU/V3()のサブ関数.3次方程式までを解く
void NURBS_Func::GetIntersecEquation(int M,
Coord *P,
double *Q,
Coord pt,
Coord nvec,
double *a)
(private)CalcIntersecCurve3(), CalcIntersecPtsPlaneU/V3()のサブ関数.NURBS曲線と平面の交線導出用方程式を得る
int NURBS_Func::GetNurbsCCoef(NURBSC *nurb,
double **coef,
int i,
Coord *P,
double *Q)
(private)CalcIntersecCurve3()のサブ関数.NURBS曲線の係数を求める(最高3次)
int NURBS_Func::GetBSplCoef3(int M,
int K,
int i,
double *t,
double **coef)
3次のBスプライン曲線の各係数を求める.
int NURBS_Func::GetBSplCoef2(int M,
int K,
int i,
double *t,
double **coef)
2次のBスプライン曲線の各係数を求める
int NURBS_Func::GetBSplCoef1(int M,
int K,
int i,
double *t,
double **coef)
1次のBスプライン曲線の各係数を求める
void NURBS_Func::ShiftNurbsS(NURBSS *nurbs,
Coord shift)
NURBS曲面のシフト
void NURBS_Func::ShiftNurbsC(NURBSC *nurbs,
Coord shift)
NURBS曲線のシフト
void NURBS_Func::RotNurbsS(NURBSS *nurbs,
Coord axis,
double deg)
NURBS曲面をDベクトル回りにdeg(°)だけ回転させる
void NURBS_Func::RotNurbsC(NURBSC *nurbs,
Coord axis,
double deg)
NURBS曲面をDベクトル回りにdeg(°)だけ回転させる
void NURBS_Func::ChRatioNurbsS(NURBSS *nurbs,
Coord ratio)
NURBS曲面の倍率を変更する
void NURBS_Func::ChRatioNurbsC(NURBSC *nurbs,
Coord ratio)
NURBS曲線の倍率を変更する
int NURBS_Func::SetCPNurbsS(NURBSS *nurbs,
NURBSS Nurbs)
NURBS曲面nurbsのコントロールポイントを,NURBS曲面Nurbsのコントロールポイントに置き換える
int NURBS_Func::GenInterpolatedNurbsC1(NURBSC *Nurbs,
Coord *P,
int PNum,
int M)
与えられた点列を補間するn階のNURBS曲線を生成する.
int NURBS_Func::GenInterpolatedNurbsC2(NURBSC *Nurbs,
Coord *P_,
int PNum,
int M)
与えられた点列を補間するn階のNURBS曲線を生成する. 端末条件:始点とC2で一致
int NURBS_Func::GenApproximationNurbsC(NURBSC *Nurbs,
Coord *P,
int PNum,
int M)
与えられた点列を近似するn階のNURBS曲線を生成する
int NURBS_Func::GenNurbsCfromCP(NURBSC *Nurbs,
Coord *P,
int PNum,
int M)
コントロールポイントからNURBS曲線を生成する
int NURBS_Func::GenPolygonalLine(NURBSC *Nurbs,
Coord *P,
int PNum)
折れ線(NURBS曲線)を生成する
int NURBS_Func::GenInterpolatedNurbsS1(NURBSS *Nurbs,
Coord **P,
int PNum_u,
int PNum_v,
int Mu,
int Mv)
与えられた点列を補間するn階NURBS曲面を生成する. 端末条件を与えないバージョン
int NURBS_Func::GenApproximationNurbsS(NURBSS *Nurbs,
Coord **P,
int PNum_u,
int PNum_v,
int Mu,
int Mv)
与えられた点列を近似するn階のNURBS曲面を生成する
int NURBS_Func::GenNurbsSfromCP(NURBSS *Nurbs,
Coord **P,
int PNum_u,
int PNum_v,
int Mu,
int Mv)
与えられたコントロールポイントからn階のNURBS曲面を生成する
int NURBS_Func::ConnectNurbsSU(NURBSS *S1,
NURBSS *S2,
NURBSS *S_)
2枚のNURBS曲面を連結する(U方向に長くなる)(S1_U1とS2_U0を連結)
int NURBS_Func::ConnectNurbsSV(NURBSS *S1,
NURBSS *S2,
NURBSS *S_)
2枚のNURBS曲面を連結する(V方向に長くなる)(S1_V1とS2_V0を連結)
void NURBS_Func::SetCPSU_ConnectS(NURBSS *S1,
NURBSS *S2,
NURBSS *S_)
(private)ConnectNurbsSU()のサブ関数.S_のu方向コントロールポイントとウェイトを指定
void NURBS_Func::SetKnotVecSU_ConnectS(NURBSS *S1,
NURBSS *S2,
NURBSS *S_)
(private)ConnectNurbsSU()のサブ関数.S_のu方向ノット定義域を指定
void NURBS_Func::SetCPSV_ConnectS(NURBSS *S1,
NURBSS *S2,
NURBSS *S_)
(private)ConnectNurbsSV()のサブ関数.S_のv方向コントロールポイントとウェイトを指定
void NURBS_Func::SetKnotVecSV_ConnectS(NURBSS *S1,
NURBSS *S2,
NURBSS *S_)
(private)ConnectNurbsSV()のサブ関数.S_のv方向ノット定義域を指定
int NURBS_Func::CalcuIntersecPtNurbsLine(NURBSS *Nurb,
Coord r,
Coord p,
int Divnum,
Coord *ans,
int anssize,
int LoD)
NURBS曲面と直線の交点を算出
int NURBS_Func::CalcIntersecPtNurbsPt(NURBSS *S,
Coord P,
int Divnum,
int LoD,
Coord *Q)
空間上の1点PからNURBS曲面S上の最近傍点Qを求める(ニュートン法)
int NURBS_Func::GetMinDist(NURBSS *S,
Coord P,
Coord *Q,
int N,
Coord *Ans)
(private)CalcIntersecPtNurbsPt()のサブ関数.最小距離を調べる
int NURBS_Func::DetermPtOnTRMSurf(TRMS *Trim,
double u,
double v)
注目中のNURBS曲面上の1点(u,v)がトリミング領域内にあるのかを判定する
int NURBS_Func::DetermPtOnTRMSurf_sub(CONPS *Conps,
double u,
double v)
(private)DetermPtOnTRMSurf()のサブ関数.面上線のタイプが複合曲線の場合のトリミング領域内外判定
int NURBS_Func::GetPtsOnOuterTRMSurf(TRMS *Trm,
Coord *Pt,
int N)
外周トリム面内の点のみ残す
int NURBS_Func::GetPtsOnInnerTRMSurf(TRMS *Trm,
Coord *Pt,
int N)
内周トリム面外の点のみ残す
int NURBS_Func::GetPtsOnInnerOuterTRMSurf(TRMS *Trm,
Coord *Pt,
int N)
内外周トリム面内の点のみ残す
int NURBS_Func::ApproxTrimBorder(COMPC *CompC,
Coord *P)
(private)トリム境界線を点群で近似する
int NURBS_Func::CalcDeltaPtsOnNurbsC(NURBSC *Nurb,
int D,
Coord *Pts)
指定した分割数でNURBS曲線上の座標値を出力する
double NURBS_Func::CalcParamLengthOnNurbsC(NURBSC *C,
double L,
double Init_t)
NURBS曲線において一端からの指定距離におけるパラメータ値を返す
int NURBS_Func::CalcDeltaPtsOnNurbsS(NURBSS *S,
int Du,
int Dv,
Coord **Pts)
指定した分割数でNURBS曲面上の座標値を求める
int NURBS_Func::CalcExtremumNurbsC(NURBSC *C,
Coord nf,
double *pt,
int ptnum)
NURBS曲線の指定した方向における極値の座標値を得る
int NURBS_Func::CalcExtSearchCurve(NURBSS *S,
Coord n,
Coord pt,
double ds,
NURBSC *C1,
NURBSC *C2)
(準備中)極値探索線を得る
int NURBS_Func::CalcExtGradCurve(NURBSS *S,
Coord n,
Coord pt,
double ds,
NURBSC *C1,
NURBSC *C2)
(準備中)極値傾斜線を得る
int NURBS_Func::SearchExtremum_BS(NURBSS *S,
Coord nf,
double u0,
double v0,
double H,
int param,
int direction,
Coord *ans)
Bulirsch-Stoer法により極地探索を行う(微分方程式:du(s)/ds = fu(u,v) と、dv(s)/ds = fv(u,v)の解探索)
int NURBS_Func::GetSECParam1(NURBSS *S,
double u,
double v,
Coord nf,
int param,
int direction,
Coord *f)
(private)極値探索線Sub関数1
Coord NURBS_Func::TrimNurbsSPlaneSub1(double a,
double b,
double x0,
double y0,
double x1,
double y1)
(private)TrimNurbsSPlaneのサブ関数(2D上の2直線の交点をもとめる)
void NURBS_Func::GetCurveKnotParam1(Coord *P,
int PNum,
Vector T_)
(private)各通過点の曲線パラメータを算出(コード長の比から算出)
void NURBS_Func::GetCurveKnotParam2(Coord *P,
int PNum,
Vector T_)
(private)各通過点の曲線パラメータを算出(コード長の平方根の比から算出)
void NURBS_Func::GetEqIntervalKont(int K,
int M,
Vector T)
(private)曲線/曲面パラメータから等間隔なノットベクトルを算出
void NURBS_Func::GetInterpolatedKnot(Vector T_,
int N,
int K,
int M,
Vector T)
(private)曲線/曲面パラメータから補間用ノットベクトルを算出
void NURBS_Func::GetApproximatedKnot(Vector T_,
int N,
int M,
int K,
Vector T)
(private)曲線/曲面パラメータから近似用ノットベクトルを算出
void NURBS_Func::ChangeKnotVecRange(Vector T,
int N,
int M,
int K,
double Ts,
double Te)
(private)曲線/曲面パラメータの定義域を変更する
int NURBS_Func::SetApproximationCPnum(int PNum)
(private)点列数から生成するコントロールポイント数を算定する(勘です。)
void NURBS_Func::DebugForNurbsC(NURBSC *nurbs)
NURBS曲線情報をデバッグプリント
void NURBS_Func::DebugForNurbsS(NURBSS *nurbs)
NURBS曲面情報をデバッグプリント
double NURBS_Func::CalcNurbsCLength(NURBSC *Nurb,
double a,
double b)
NURBS曲線C(t)の指定パラメータ区間[a,b]の線分長Lを求める
Coord NURBS_Func::GetMinDistance(Coord a,
Coord *b,
int n)
(private)最小距離を持つ座標値を返す
int NURBS_Func::DivNurbsC(NURBSC *C0,
NURBSC *C1,
NURBSC *C2,
double L)
NURBS曲線を指定した位置(端からの弧長)で分割する
int NURBS_Func::DivNurbsCParam(NURBSC *C0,
NURBSC *C1,
NURBSC *C2,
double t)
NURBS曲線を指定したパラメータ値で分割する
int NURBS_Func::ConnectNurbsC(NURBSC *C1,
NURBSC *C2,
NURBSC *C_)
2本のNURBS曲線を連結する
void NURBS_Func::ReverseNurbsC(NURBSC *C)
NURBS曲線のノットベクトル向きを反転する
void NURBS_Func::SetKnotVecC_ConnectC(NURBSC *C1,
NURBSC *C2,
NURBSC *C_)
(private)2本の曲線を繋げたときのノットベクトルを設定する
void NURBS_Func::SetCPC_ConnectC(NURBSC *C1,
NURBSC *C2,
NURBSC *C_)
(private)2本の曲線を繋げたときのコントロールポイントとウェイトを設定する
int NURBS_Func::InsertNewKnotOnNurbsC(NURBSC *C,
NURBSC *C_,
double t,
int deg)
(private)NURBS曲線に新たなノットを挿入する