NURBS_Func.cpp | |
Functions | |
New_NurbsC | Nurbs曲線のメモリー確保 |
Free_NurbsC_1DArray | NURBS曲線配列のメモリー解放 |
Free_NurbsC | 1本のNURBS曲線のメモリー解放 |
New_NurbsS | NURBS曲面のメモリー確保 |
Free_NurbsS_1DArray | NURBS曲面配列のメモリー解放 |
Free_NurbsS | 1つのNURBS曲面のメモリー解放 |
New_TrmS | トリム面のメモリー確保 |
Free_TrmS_1DArray | トリム面配列のメモリー解放 |
Free_TrmS | トリム面のメモリー解放 |
New_CompC | 複合曲線のメモリー確保 |
Free_CompC_1DArray | 複合曲線配列のメモリー解放 |
Free_CompC | 複合曲線のメモリー解放 |
GenNurbsC | 1つのNurbs曲線を生成する |
GenNurbsC | 1つのNurbs曲線を生成する(NURBS曲線のコピー)(オーバーロード) |
DelNurbsC | GenNurbsC()によって生成されたNURBS曲線を削除する |
GenNurbsS | 1つのNURBS曲面を生成する |
GenNurbsS | 1つのNurbs曲面を生成する(NURBS曲面のコピー) |
GenRotNurbsS | NurbsCを原点を通るAxis回りにdegだけ回転させた回転サーフェスNurbsSを生成する |
GenSweepNurbsS | 1つのNURBS曲線からある軸方向にある距離だけスイープさせたスイープサーフェスを生成する |
GenIsoparamCurveU | NURBS曲面上のu方向パラメータ値を固定したときのアイソパラメトリックNURBS曲線を生成 |
GenIsoparamCurveV | NURBS曲面上のv方向パラメータ値を固定したときのアイソパラメトリックNURBS曲線を生成 |
DelNurbsS | GenNurbsS()によって生成されたNURBS曲面を削除する |
GenTrimdNurbsS | トリム面を有するNURBS曲面をコピーする |
DelTrimdNurbsS | GenTrimdNurbsS()によって生成されたトリム面を削除する |
CalcNurbsCCoord | 指定したノットtでのNURBS曲線の座標値を求める |
CalcNurbsCCoords | 指定したノットt群でのNURBS曲線の座標値を求める |
CalcNurbsSCoord | 指定したノットu,vでのNURBS曲面の座標値を求める |
CalcNurbsSCoords | 指定したノットu,v群でのNURBS曲面の座標値群を求める |
CalcBSbasis | Bスプライン基底関数を計算し、計算結果を返す |
CalcDiffBSbasis | Bスプライン基底関数の1階微分係数を求める |
CalcDiffBSbasisN | Bスプライン基底関数のN階微分係数を求める |
CalcDiff2NurbsC | NURBS曲線の2階微分係数を求める |
CalcDiffNNurbsC | NURBS曲線のr階微分係数を求める |
CalcDiffuNurbsS | NURBS曲面のu方向の1階微分係数を得る |
CalcDiffvNurbsS | NURBS曲面のv方向の1階微分係数を得る |
CalcDiffNNurbsS | NURBS曲面の各方向を任意階微分したときの微分係数を求める |
CalcDiffNurbsSDenom | (private)NURBS曲面分母の各方向を任意階微分したときの微分係数を求める |
CalcDiffNurbsSNumer | (private)NURBS曲面分子の各方向を任意階微分したときの微分係数を求める |
CalcNormVecOnNurbsS | NURBS曲面上の(u,v)における法線ベクトルをもとめる |
CalcTanVecOnNurbsC | NURBS曲線上のtにおける単位接ベクトルをもとめる |
CalcDiffuNormVecOnNurbsS | NURBS曲面上の(u,v)における法線ベクトルのu方向1階微分をもとめる Nu = Suu×Sv + Su×Suv |
CalcDiffvNormVecOnNurbsS | NURBS曲面上の(u,v)における法線ベクトルのv方向1階微分をもとめる Nv = Suv×Sv + Su×Svv |
CalcMeanCurvature | NURBS曲面上の(u,v)における平均曲率を求める |
CalcMeanCurvature | NURBS曲面上の(u,v)における平均曲率を求める(オーバーロード) |
CalcMeanCurvatureNormVec | NURBS曲面上の(u,v)における平均曲率法線ベクトルをもとめる |
CalcGaussCurvature | NURBS曲面上の(u,v)におけるガウス曲率を求める |
CalcGaussCurvature | NURBS曲面上の(u,v)におけるガウス曲率を求める(オーバーロード) |
CalcGaussCurvatureNormVec | NURBS曲面上の(u,v)におけるガウス曲率法線ベクトルをもとめる |
CalcCurvatureNurbsC | NURBS曲線の曲率を求める |
DetectInterfereNurbsS | NURBS曲面S(u,v)とNURBS曲面R(w,t)の干渉を検出する(トリム無) |
DetectInterfereTrmS | NURBS曲面S(u,v)とNURBS曲面R(w,t)の干渉を検出する(トリム有) |
CalcIntersecPtsPlaneV3 | 3次以下のNURBS曲面と平面との交点群を代数解法にて求める(vパラメータ分割) |
CalcIntersecPtsPlaneU3 | 3次以下のNURBS曲面と平面との交点群を代数解法にて求める(uパラメータ分割) |
CalcIntersecPtsPlaneV | V方向のアイソパラ曲線を指定した分割数で生成し,各曲線とNURBS曲面との交点を算出する |
CalcIntersecPtsPlaneU | U方向のアイソパラ曲線を指定した分割数で生成し,各曲線とNURBS曲面との交点を算出する |
CalcIntersecPtsOffsetPlaneSearch | オフセットNURBS曲面と平面との交点群を交点追跡法にて求める |
CalcIntersecPtsPlaneSearch | NURBS曲面と平面との交点群を交点追跡法にて求める |
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曲面と平面) |
CalcIntersecPtsNurbsSNurbsC | NURBS曲面とNURBS曲線との交点群を交線追跡法で求める |
CalcIntersecPtsNurbsSSearch | NURBS曲面S(u,v)とNURBS曲面R(w,t)の交線(交点群)を交点追跡法にて求める |
CalcIntersecPtsNurbsSGeom | NURBS曲面S(u,v)とNURBS曲面R(w,t)の交線(交点群)を幾何学的に求める(補助平面を用いた解法) |
SearchIntersectPt | (private)ニュートン法により交点を真値に収束させる(NURBS曲面同士) |
GetNurbsSCoef | (private)CalcIntersecPtsPlaneU/V3()のサブ関数.NURBS曲線C(u) or C(v)の係数を求める |
CalcIntersecPtsNurbsCNurbsCParam | (x,y)平面上のNURBS曲線同士の交点を求める(ニュートン法) |
ClacIntersecPtsNurbsCLine | 2次元NURBS曲線と直線との交点を求める |
ClacIntersecPtsNurbsCLineSeg | 2次元NURBS曲線と線分との交点を求める |
CalcIntersecCurve | NURBS曲線と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める. 交点は最大で(M-1)*(K-M+1)点得られる. |
CalcIntersecIsparaCurveU | NURBS曲面のU方向アイソパラ曲線(Vパラメータを固定)と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める 交点は最大で(M-1)*(K-M+1)点得られる. |
CalcIntersecIsparaCurveV | NURBS曲面のV方向アイソパラ曲線(Uパラメータを固定)と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める 交点は最大で(M-1)*(K-M+1)点得られる. |
CalcIntersecCurve3 | NURBS曲線と平面との交点を求める(3次まで対応) 交点は最大で(M-1)*(K-M+1)点得られる. |
CalcEquation | (private)CalcIntersecCurve3(), CalcIntersecPtsPlaneU/V3()のサブ関数.3次方程式までを解く |
GetIntersecEquation | (private)CalcIntersecCurve3(), CalcIntersecPtsPlaneU/V3()のサブ関数.NURBS曲線と平面の交線導出用方程式を得る |
GetNurbsCCoef | (private)CalcIntersecCurve3()のサブ関数.NURBS曲線の係数を求める(最高3次) |
GetBSplCoef3 | 3次のBスプライン曲線の各係数を求める. |
GetBSplCoef2 | 2次のBスプライン曲線の各係数を求める |
GetBSplCoef1 | 1次のBスプライン曲線の各係数を求める |
ShiftNurbsS | NURBS曲面のシフト |
ShiftNurbsC | NURBS曲線のシフト |
RotNurbsS | NURBS曲面をDベクトル回りにdeg(°)だけ回転させる |
RotNurbsC | NURBS曲面をDベクトル回りにdeg(°)だけ回転させる |
ChRatioNurbsS | NURBS曲面の倍率を変更する |
ChRatioNurbsC | NURBS曲線の倍率を変更する |
SetCPNurbsS | NURBS曲面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曲面を生成する |
ConnectNurbsSU | 2枚のNURBS曲面を連結する(U方向に長くなる)(S1_U1とS2_U0を連結) |
ConnectNurbsSV | 2枚の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方向ノット定義域を指定 |
CalcuIntersecPtNurbsLine | NURBS曲面と直線の交点を算出 |
CalcIntersecPtNurbsPt | 空間上の1点PからNURBS曲面S上の最近傍点Qを求める(ニュートン法) |
CalcIntersecPtNurbsPt | 空間上の1点PからNURBS曲線C上の最近傍点Q(曲線パラメータ)を求める(ニュートン法) |
GetMinDist | (private)CalcIntersecPtNurbsPt()のサブ関数.最小距離を調べる |
CalcIntersecPtNurbsPtDescrete | 空間上の1点PからNURBS曲面S上の最近傍点Qを求める(離散的) |
CalcIntersecPtNurbsPtDescrete | 空間上の1点PからNURBS曲線C上の最近傍点Qを求める(離散的) |
DetermPtOnTRMSurf | 注目中のNURBS曲面上の1点(u,v)がトリミング領域内にあるのかを判定する |
DetermPtOnTRMSurf_sub | (private)DetermPtOnTRMSurf()のサブ関数.面上線のタイプが複合曲線の場合のトリミング領域内外判定 |
GetPtsOnOuterTRMSurf | 外周トリム面内の点のみ残す |
GetPtsOnInnerTRMSurf | 内周トリム面外の点のみ残す |
GetPtsOnInnerOuterTRMSurf | 内外周トリム面内の点のみ残す |
ApproxTrimBorder | (private)トリム境界線を点群で近似する |
CalcDeltaPtsOnNurbsC | 指定した分割数でNURBS曲線上の座標値を出力する |
CalcDeltaPtsOnNurbsC | 指定した間隔でNURBS曲線上の座標値を出力する |
CalcParamLengthOnNurbsC | NURBS曲線において一端からの指定距離におけるパラメータ値を返す |
CalcDeltaPtsOnNurbsS | 指定した分割数でNURBS曲面上の座標値を求める |
CalcExtremumNurbsC | NURBS曲線の指定した方向における極値の座標値を得る |
CalcExtSearchCurve | (準備中)極値探索線を得る |
CalcExtGradCurve | (準備中)極値傾斜線を得る |
SearchExtremum_BS | Bulirsch-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)点列数から生成するコントロールポイント数を算定する(勘です。) |
DebugForNurbsC | NURBS曲線情報をデバッグプリント |
DebugForNurbsS | NURBS曲面情報をデバッグプリント |
CalcNurbsCLength | NURBS曲線C(t)の指定パラメータ区間[a,b]の線分長Lを求める |
CalcNurbsCLength | NURBS曲線C(t)の全区間の線分長Lを求める |
GetMinDistance | (private)最小距離を持つ座標値を返す |
DivNurbsC | NURBS曲線を指定した位置(端からの弧長)で分割する |
DivNurbsCParam | NURBS曲線を指定したパラメータ値で分割する |
ConnectNurbsC | 2本のNURBS曲線を連結する |
ReverseNurbsC | NURBS曲線のノットベクトル向きを反転する |
SetKnotVecC_ConnectC | (private)2本の曲線を繋げたときのノットベクトルを設定する |
SetCPC_ConnectC | (private)2本の曲線を繋げたときのコントロールポイントとウェイトを設定する |
InsertNewKnotOnNurbsC | (private)NURBS曲線に新たなノットを挿入する |
CalcConstScallop | 等スキャロップ点を算出 |
CalcConstPitch | 等ピッチ点を算出 |
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曲線を生成する
*Nurbs | 生成するNURBS曲線へのポインタ |
K | コントロールポイントの数 |
M | 階数 |
N | ノットベクトルの数 |
T[] | ノットベクトル列 |
W[] | ウェイト列 |
cp[] | コントロールポイント列 |
V[2] | ノットベクトルの範囲 |
prop[4] | プロパティ(BODY.h参照) |
euflag | ディレクトリ部 Entity Use Flag の値(0:幾何要素 5:2Dパラメトリック要素) |
KOD_TRUE
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曲面を生成する
Mu,Mv | 階数 |
Ku,Kv | コントロールポイントの数 |
*S,*T | u,v方向ノットベクトル列 |
**W | ウエイト |
**Cp | コントロールポイント |
U_s,U_e,V_s,V_e | u方向ノットベクトルの開始値,終了値 |
成功:KOD_TRUE, 失敗:KOD_ERR
int NURBS_Func::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.x,ans.yに格納 |
ans_size | ansの配列長 |
交点の個数(交点の数がans_sizeを超えた場合:KOD_ERR)
int NURBS_Func::CalcIntersecPtsPlaneU3( NURBSS * nurb, Coord pt, Coord nvec, int u_divnum, Coord * ans, int ans_size )
3次以下のNURBS曲面と平面との交点群を代数解法にて求める(uパラメータ分割)
*nurb | NURBS曲面 |
pt | 平面上の一点 |
nvec | 平面の法線ベクトル |
u_divnum | uパラメータ分割数 |
*ans | 算出された交点のu,vパラメータ値ををそれぞれans.x,ans.yに格納 |
ans_size | ansの配列長 |
交点の個数(交点の数がans_sizeを超えた:KOD_ERR)
int NURBS_Func::CalcIntersecPtsPlaneV( NURBSS * nurbss, Coord pt, Coord nvec, int v_divnum, Coord * ans, int ans_size )
V方向のアイソパラ曲線を指定した分割数で生成し,各曲線とNURBS曲面との交点を算出する
*nurb | NURBS曲面 |
pt | 平面上の一点 |
nvec | 平面の法線ベクトル |
v_divnum | vパラメータ分割数 |
*ans | 算出された交点のu,vパラメータ値をそれぞれans.x,ans.yに格納 |
ans_size | ansの配列長 |
交点の個数(交点の数がans_sizeを超えた:KOD_ERR)
int NURBS_Func::CalcIntersecPtsPlaneU( NURBSS * nurbss, Coord pt, Coord nvec, int u_divnum, Coord * ans, int ans_size )
U方向のアイソパラ曲線を指定した分割数で生成し,各曲線とNURBS曲面との交点を算出する
*nurb | NURBS曲面 |
pt | 平面上の一点 |
nvec | 平面の法線ベクトル |
u_divnum | uパラメータ分割数 |
*ans | 算出された交点のu,vパラメータ値をそれぞれans.x,ans.yに格納 |
ans_size | ansの配列長 |
交点の個数(交点の数がans_sizeを超えた:KOD_ERR)
int NURBS_Func::CalcIntersecPtsOffsetPlaneSearch( NURBSS * nurb, double os, Coord pt, Coord nvec, double ds, int initdivnum, Coord * ans, int ans_size )
オフセットNURBS曲面と平面との交点群を交点追跡法にて求める
*nurb | NURBS曲面 |
os | オフセット量 |
pt | 平面上の1点 |
nvec | 平面の法線ベクトル |
ds | 交線(交点群)の粗さ(密0.1~2疎) |
initdivnum | 初期点探索の荒さ(密10~1疎) |
*ans | 解格納用配列 |
ans_size | 解の数(ansの配列長) |
KOD_FALSE:NURBS曲面と平面が交差していない KOD_ERR:特異点または発散により処理を中断
int NURBS_Func::CalcIntersecPtsPlaneSearch( NURBSS * nurb, Coord pt, Coord nvec, double ds, int initdivnum, Coord * ans, int ans_size, int method )
NURBS曲面と平面との交点群を交点追跡法にて求める
*nurb | NURBS曲面 |
pt | 平面上の1点 |
nvec | 平面の法線ベクトル |
ds | 交線(交点群)の粗さ(密0.1~2疎) |
initdivnum | 初期点探索の荒さ(密10~1疎) |
*ans | 解格納用配列 |
ans_size | 解の数(ansの配列長) |
method | 交点算出時の数値解析法の選択(RUNGE_KUTTA or BULIRSH_STOER) |
返値 KOD_FALSE:NURBS曲面と平面が交差していない KOD_ERR:特異点または発散により処理を中断
Coord NURBS_Func::CalcIntersecPtsPlaneSearch_Sub( NURBSS * nurb, double u, double v, Coord pt, Coord nvec )
(private)平面とNURBS曲面との交点群を求める関数CalcIntersecPtsPlaneSearch()のサブ関数. 面から飛び出した(u,v)を参考に面のエッジ部における交点(new_u,new_v)を得る
*nurb | NURBS曲面へのポインタ |
u,v | 曲面存在領域外の(u, v)値 |
pt | 平面上の1点 |
nvec | 平面の法線ベクトル |
エッジ部上の交点の(u, v)座標値(Coord.xにu,Coord.yにvがそれぞれ格納される)
int NURBS_Func::SearchIntersectPt_BS( NURBSS * S, Coord pt, Coord nvec, double H, double * u0, double * v0, int direction )
(private)Bulirsch-Stoer法により交点を収束させる(NURBS曲面と平面)
*S | 1つ目の対象となるNURBS曲面 |
pt | 平面上の1点 |
nvec | 平面の法線ベクトル |
H | BS法のデフォルトの刻み幅 |
*u0 | 得られた交点のuパラメータ |
*v0 | 得られた交点のvパラメータ |
direction | 追跡方向を表すフラグ(FORWARD or INVERSE) |
収束した:KOD_TRUE, パラメータ範囲外:KOD_FALSE,失敗:KOD_ERR
int NURBS_Func::GetSIPParam1( NURBSS * S, double u, double v, Coord pt, Coord nvec, int direction, Coord * f )
(private)SearchIntersectPt_BS()のサブ関数.曲面と平面の交点を表す微分方程式の右辺の値を得る
*S | NURBS曲面へのポインタ |
u,v | 注目中のNURBS曲面パラメータ |
pt | 平面上の一点 |
nvec | 平面の法線ベクトル |
direction | 追跡方向を表すフラグ(FORWARD or INVERSE) |
*f | 計算結果 |
成功:KOD_TRUE, 失敗:KOD_ERR
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)
*S | NURBS曲面へのポインタ |
pt | 平面上の一点 |
n | 平面の法線ベクトル |
delta | 解追跡の刻み幅 |
*u,*v | 解 |
direction | 追跡方向を表すフラグ(FORWARD or INVERSE) |
成功:KOD_TRUE, 失敗:KOD_ERR
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)
*S | NURBS曲面へのポインタ |
pt | 平面上の一点 |
n | 平面の法線ベクトル |
delta | 解追跡の刻み幅 |
*u,*v | 解 |
direction | 追跡方向を表すフラグ(FORWARD or INVERSE) |
成功:KOD_TRUE, パラメータ範囲外:KOD_FALSE, 失敗:KOD_ERR
int NURBS_Func::SearchIntersectPt( NURBSS * nurb, Coord pt, Coord nvec, double ds, double * u, double * v, int direction )
(private)ニュートン法により交点を真値に収束させる(NURBS曲面と平面)
*nurb | NURBS曲面へのポインタ |
pt | 平面上の一点 |
nvec | 平面の法線ベクトル |
ds | 解追跡の刻み幅 |
*u,*v | 解 |
direction | 追跡方向を表すフラグ(FORWARD or INVERSE) |
成功:KOD_TURE, パラメータ範囲外:KOD_FALSE, 失敗(特異点につきゼロ割):KOD_ERR
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)の交線(交点群)を交点追跡法にて求める
nurbsS | NURBS曲面S(u,v) |
nurbsR | NURBS曲面R(w,t) |
div | 初期点サーチ時の曲面分割数 |
ds | 交線(交点群)の粗さ(密0.1~2疎) |
ans | 解 |
ans_size | ans配列の配列長 |
交点の数(NURBS曲面同士が交差していない:KOD_FALSE,特異点または発散により処理を中断:KOD_ERR)
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)の交線(交点群)を幾何学的に求める(補助平面を用いた解法)
*nurbS | NURBS曲面S(u,v) |
*nurbR | NURBS曲面R(w,t) |
u_divnum | uパラメータ分割数 |
v_divnum | vパラメータ分割数 |
*ans | 算出された交点のu,vパラメータ値をそれぞれans.x,ans.yに格納 |
ans_size | ansの配列長 |
交点の個数
int NURBS_Func::SearchIntersectPt( NURBSS * nurbR, NURBSS * nurbS, double ds, double * w, double * t, double * u, double * v, int direction )
(private)ニュートン法により交点を真値に収束させる(NURBS曲面同士)
*nurbR | NURBS曲面S(u,v) |
*nurbS | NURBS曲面R(w,t) |
ds | 解追跡時の刻み幅 |
*w,*t,*u,*v | 解 |
direction | 追跡方向を表すフラグ(FORWARD or INVERSE) |
収束した:KOD_TRUE, パラメータ範囲外:KOD_FALSE, 特異点検出:KOD_ERR
int NURBS_Func::ClacIntersecPtsNurbsCLineSeg( NURBSC * C, Coord P, Coord r, double ts, double te, double * t1, double * t2 )
2次元NURBS曲線と線分との交点を求める
*C | NURBS曲線 |
P | 線分上の1点 |
r | 線分の方向ベクトル |
ts | 線分の始点パラメータ |
te | 線分の終点パラメータ |
*t1 | 交点におけるNURBS曲線パラメータ |
*t2 | 交点における直線パラメータ |
交点の有無(KOD_TRUE:交点あり, KOD_FALSE:交点なし)
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)個の配列を用意することが望ましい.
*nurb | NURBS曲線 |
pt | 平面上の一点 |
nvec | 平面の法線ベクトル |
Divnum | NURBS曲線のパラメータ分割数 |
*ans | 算出された交点のtパラメータ値を格納 |
ans_size | ansの配列長 |
LoD | 詳細度(ニュートン法の更新パラメータを足しこむときに,LoDで割ることで,急激なパラメータ変更を避ける.通常は1でよいが,解が得られない場合は値を大きくする.2とか3とか) |
交点の個数(KOD_ERR:交点の数がans_sizeを超えた)
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)個の配列を用意することが望ましい.
*nurb | NURBS曲面 |
V | vの固定値 |
pt | 平面上の一点 |
nvec | 平面の法線ベクトル |
Divnum | NURBS曲線のパラメータ分割数 |
*ans | 算出された交点のtパラメータ値を格納 |
ans_size | ansの配列長 |
交点の個数(KOD_ERR:交点の数がans_sizeを超えた)
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)個の配列を用意することが望ましい.
*nurb | NURBS曲面 |
U | uの固定値 |
pt | 平面上の一点 |
nvec | 平面の法線ベクトル |
Divnum | NURBS曲線のパラメータ分割数 |
*ans | 算出された交点のtパラメータ値を格納 |
ans_size | ansの配列長 |
交点の個数(KOD_ERR:交点の数がans_sizeを超えた)
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)個の配列を用意することが望ましい.
*nurb | NURBS曲線 |
pt | 平面上の一点 |
nvec | 平面の法線ベクトル |
*ans | 算出された交点のtパラメータ値を格納 |
ans_size | ansの配列長 |
交点の個数(曲線次数が3次以上:KOD_ERR)
int NURBS_Func::CalcuIntersecPtNurbsLine( NURBSS * Nurb, Coord r, Coord p, int Divnum, Coord * ans, int anssize, int LoD )
NURBS曲面と直線の交点を算出
*Nurb | NURBS曲面S(u,v)へのポインタ |
r | 直線N(t)上の1点 |
p | 直線N(t)の方向 |
DivNum | NURBS曲面の分割数 |
*ans | 交点のu,v,tパラメータ格納用配列 |
anssize | ansの配列長 |
Divnumが大きいほど、交点算出の取りこぼしは少なくなる.
anssizeはDivNum*DivNum以上にするのが好ましい.
LoD | 詳細度(ニュートン法の更新パラメータを足しこむときに,LoDで割ることで,急激なパラメータ変更を避ける.通常は1でよいが,解が得られない場合は値を大きくする.2とか3とか) |
交点の数, KOD_ERR:交点の数が指定した配列長を超えた
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|
*S | NURBS曲面 |
P | 空間上の1点 |
Divnum | ニュートン法初期値指定用の曲面分割数 |
LoD | ニュートンパラメータ更新時のステップサイズ(1~) |
Q | 解(S上の点をu,v,tパラメータでCoord構造体に格納) |
KOD_TRUE:収束した KOD_FALSE:収束しなかった
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)
*C | NURBS曲線 |
P | 空間上の1点 |
Divnum | ニュートン法初期値指定用の曲線分割数 |
LoD | ニュートンパラメータ更新時のステップサイズ(1~) |
Q | 解(C上の点をtパラメータで格納) |
KOD_TRUE:収束した KOD_FALSE:収束しなかった
void NURBS_Func::CalcIntersecPtNurbsPtDescrete( NURBSS * S, Coord P, int Divnum, int LoD, double Us, double Ue, double Vs, double Ve, Coord * Q )
空間上の1点PからNURBS曲面S上の最近傍点Qを求める(離散的)
*S | NURBS曲面 |
P | 空間上の1点 |
Divnum | 曲面分割数 |
LoD | 詳細度 |
Us | u方向パラメータの探索開始値 |
Ue | u方向パラメータの探索終了値 |
Vs | v方向パラメータの探索開始値 |
Ve | v方向パラメータの探索終了値 |
*Q | 解(S上の点をu,vパラメータでCoord構造体に格納) |
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)の解探索)
*S | 極値探索されるNURBS曲面へのポインタ |
nf | 平面の法線ベクトル |
u0,v0 | 開始点 |
H | 探索幅 |
param | u方向の1階微分が0となる極値の探索(PARAM_U) or v方向探索(PARAM_V)の選択 |
direction | 順方向探索(FORWARD) or逆方向探索(INVERSE) |
*ans | 更新されたu,vパラメータ(ans.x = u, ans.y = v) |
KOD_TRUE:正常終了, KOD_FALSE:特異点により処理を中断, KOD_ERR:パラメータの指定ミスにより処理を中断
int NURBS_Func::GetSECParam1( NURBSS * S, double u, double v, Coord nf, int param, int direction, Coord * f )
(private)極値探索線Sub関数1
*S | NURBS曲面 |
u, v | 注目中の(u, v)パラメータ |
nf | 平面の法線ベクトル |
param | u方向の1階微分が0となる極値の探索(PARAM_U) or v方向探索(PARAM_V)の選択 |
direction | 順方向探索(FORWARD) or逆方向探索(INVERSE) |
*f | f.x = fu(u,v), f.y = fv(u,v) |
成功:KOD_TURE, 特異点につき処理を中断した:KOD_FALSE
Nurbs曲線のメモリー確保
int NURBS_Func::New_NurbsC( NURBSC * nurb, int K, int N )
NURBS曲線配列のメモリー解放
void NURBS_Func::Free_NurbsC_1DArray( NURBSC * a, int num )
1本のNURBS曲線のメモリー解放
void NURBS_Func::Free_NurbsC( NURBSC * a )
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 )
1つのNURBS曲面のメモリー解放
void NURBS_Func::Free_NurbsS( NURBSS * a )
トリム面のメモリー確保
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 )
1つのNurbs曲線を生成する
int NURBS_Func::GenNurbsC( NURBSC * Nurbs, int K, int M, int N, double T[], double W[], Coord cp[], double V[], int prop[], int euflag )
GenNurbsC()によって生成されたNURBS曲線を削除する
void NURBS_Func::DelNurbsC( NURBSC * Nurbs )
1つの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 )
NurbsCを原点を通るAxis回りにdegだけ回転させた回転サーフェスNurbsSを生成する
int NURBS_Func::GenRotNurbsS( NURBSS * NurbsS, NURBSC NurbsC, Coord Axis, double deg )
1つのNURBS曲線からある軸方向にある距離だけスイープさせたスイープサーフェスを生成する
int NURBS_Func::GenSweepNurbsS( NURBSS * NurbsS, NURBSC NurbsC, Coord Axis, double Len )
NURBS曲面上のu方向パラメータ値を固定したときのアイソパラメトリックNURBS曲線を生成
int NURBS_Func::GenIsoparamCurveU( NURBSS * P, double u, NURBSC * C )
NURBS曲面上のv方向パラメータ値を固定したときのアイソパラメトリックNURBS曲線を生成
int NURBS_Func::GenIsoparamCurveV( NURBSS * P, double v, NURBSC * C )
GenNurbsS()によって生成されたNURBS曲面を削除する
void NURBS_Func::DelNurbsS( NURBSS * Nurbs )
トリム面を有するNURBS曲面をコピーする
int NURBS_Func::GenTrimdNurbsS( TRIMD_NURBSS * TNurbs, TRIMD_NURBSS tnurb )
GenTrimdNurbsS()によって生成されたトリム面を削除する
int NURBS_Func::DelTrimdNurbsS( TRIMD_NURBSS * TNurbs )
指定したノットtでのNURBS曲線の座標値を求める
Coord NURBS_Func::CalcNurbsCCoord( NURBSC * NurbsC, double t )
指定したノットt群でのNURBS曲線の座標値を求める
void NURBS_Func::CalcNurbsCCoords( NURBSC * NurbsC, int Ptnum, double * T, Coord * Pt )
指定したノットu,vでの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 )
Bスプライン基底関数を計算し、計算結果を返す
double NURBS_Func::CalcBSbasis( double t, double knot[], int N, int I, int M )
Bスプライン基底関数の1階微分係数を求める
double NURBS_Func::CalcDiffBSbasis( double t, double knot[], int N, int I, int M )
Bスプライン基底関数のN階微分係数を求める
double NURBS_Func::CalcDiffBSbasisN( double t, double knot[], int N, int I, int M, int Dn )
NURBS曲線の2階微分係数を求める
Coord NURBS_Func::CalcDiff2NurbsC( NURBSC * NurbsC, double t )
NURBS曲線のr階微分係数を求める
Coord NURBS_Func::CalcDiffNNurbsC( NURBSC * NurbsC, int r, double t )
NURBS曲面のu方向の1階微分係数を得る
Coord NURBS_Func::CalcDiffuNurbsS( NURBSS * NurbsS, double div_u, double div_v )
NURBS曲面のv方向の1階微分係数を得る
Coord NURBS_Func::CalcDiffvNurbsS( NURBSS * NurbsS, double div_u, double div_v )
NURBS曲面の各方向を任意階微分したときの微分係数を求める
Coord NURBS_Func::CalcDiffNNurbsS( NURBSS * S, int k, int l, double u, double v )
(private)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 )
NURBS曲面上の(u,v)における法線ベクトルをもとめる
Coord NURBS_Func::CalcNormVecOnNurbsS( NURBSS * nurb, double u, double v )
NURBS曲線上のtにおける単位接ベクトルをもとめる
Coord NURBS_Func::CalcTanVecOnNurbsC( NURBSC * C, double t )
NURBS曲面上の(u,v)における法線ベクトルのu方向1階微分をもとめる Nu = Suu×Sv + Su×Suv
Coord NURBS_Func::CalcDiffuNormVecOnNurbsS( NURBSS * nurb, double u, double v )
NURBS曲面上の(u,v)における法線ベクトルのv方向1階微分をもとめる Nv = Suv×Sv + Su×Svv
Coord NURBS_Func::CalcDiffvNormVecOnNurbsS( NURBSS * nurb, double u, double v )
NURBS曲面上の(u,v)における平均曲率を求める
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曲線の曲率を求める
double NURBS_Func::CalcCurvatureNurbsC( NURBSC * C, double t )
NURBS曲面S(u,v)とNURBS曲面R(w,t)の干渉を検出する(トリム無)
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 )
3次以下のNURBS曲面と平面との交点群を代数解法にて求める(vパラメータ分割)
int NURBS_Func::CalcIntersecPtsPlaneV3( NURBSS * nurb, Coord pt, Coord nvec, int v_divnum, Coord * ans, int ans_size )
3次以下のNURBS曲面と平面との交点群を代数解法にて求める(uパラメータ分割)
int NURBS_Func::CalcIntersecPtsPlaneU3( NURBSS * nurb, Coord pt, Coord nvec, int u_divnum, Coord * ans, int ans_size )
V方向のアイソパラ曲線を指定した分割数で生成し,各曲線とNURBS曲面との交点を算出する
int NURBS_Func::CalcIntersecPtsPlaneV( NURBSS * nurbss, Coord pt, Coord nvec, int v_divnum, Coord * ans, int ans_size )
U方向のアイソパラ曲線を指定した分割数で生成し,各曲線とNURBS曲面との交点を算出する
int NURBS_Func::CalcIntersecPtsPlaneU( NURBSS * nurbss, Coord pt, Coord nvec, int u_divnum, Coord * ans, int ans_size )
オフセット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 )
(private)指定した点が他の2点を対角とする立方体の中に存在するかを調べる
int NURBS_Func::CheckClossedPoints( Coord A, Coord B, Coord P )
(private)平面とNURBS曲面との交点群を求める関数CalcIntersecPtsPlaneSearch()のサブ関数. 面から飛び出した(u,v)を参考に面のエッジ部における交点(new_u,new_v)を得る
Coord NURBS_Func::CalcIntersecPtsPlaneSearch_Sub( NURBSS * nurb, double u, double v, Coord pt, Coord nvec )
(private)Bulirsch-Stoer法により交点を収束させる(NURBS曲面と平面)
int NURBS_Func::SearchIntersectPt_BS( NURBSS * S, Coord pt, Coord nvec, double H, double * u0, double * v0, int direction )
(private)SearchIntersectPt_BS()のサブ関数.曲面と平面の交点を表す微分方程式の右辺の値を得る
int NURBS_Func::GetSIPParam1( NURBSS * S, double u, double v, Coord pt, Coord nvec, int direction, Coord * f )
(private)4次のルンゲクッタ法により交点を導出(NURBS曲面と平面)
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)ニュートン法により交点を真値に収束させる(NURBS曲面と平面)
int NURBS_Func::SearchIntersectPt( NURBSS * nurb, Coord pt, Coord nvec, double ds, double * u, double * v, int direction )
NURBS曲面とNURBS曲線との交点群を交線追跡法で求める
int NURBS_Func::CalcIntersecPtsNurbsSNurbsC( NURBSS * NurbsS, NURBSC * NurbsC, int Divnum, Coord * ans, int ans_size )
NURBS曲面S(u,v)とNURBS曲面R(w,t)の交線(交点群)を交点追跡法にて求める
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 )
(private)CalcIntersecPtsPlaneU/V3()のサブ関数.NURBS曲線C(u) or C(v)の係数を求める
void NURBS_Func::GetNurbsSCoef( int M, double ** coef, double * a, Coord * b, int i, Coord * P, double * Q )
(x,y)平面上のNURBS曲線同士の交点を求める(ニュートン法)
int NURBS_Func::CalcIntersecPtsNurbsCNurbsCParam( NURBSC * NurbA, NURBSC * NurbB, int Divnum, Coord * ans, int ans_size )
2次元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 )
NURBS曲線と平面との交点を求める(ニュートン法) F(t) = nvec・(C(t)-pt) = 0をニュートン法を用いて求める. 交点は最大で(M-1)*(K-M+1)点得られる.
int NURBS_Func::CalcIntersecCurve( NURBSC * nurb, Coord pt, Coord nvec, int Divnum, double * ans, int ans_size, int LoD )
NURBS曲面のU方向アイソパラ曲線(Vパラメータを固定)と平面との交点を求める(ニュートン法) 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曲面のV方向アイソパラ曲線(Uパラメータを固定)と平面との交点を求める(ニュートン法) 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曲線と平面との交点を求める(3次まで対応) 交点は最大で(M-1)*(K-M+1)点得られる.
int NURBS_Func::CalcIntersecCurve3( NURBSC * nurb, Coord pt, Coord nvec, double * ans, int ans_size )
(private)CalcIntersecCurve3(), CalcIntersecPtsPlaneU/V3()のサブ関数.3次方程式までを解く
int NURBS_Func::CalcEquation( double * a, double * t, int M )
(private)CalcIntersecCurve3(), CalcIntersecPtsPlaneU/V3()のサブ関数.NURBS曲線と平面の交線導出用方程式を得る
void NURBS_Func::GetIntersecEquation( int M, Coord * P, double * Q, Coord pt, Coord nvec, double * a )
(private)CalcIntersecCurve3()のサブ関数.NURBS曲線の係数を求める(最高3次)
int NURBS_Func::GetNurbsCCoef( NURBSC * nurb, double ** coef, int i, Coord * P, double * Q )
3次のBスプライン曲線の各係数を求める.
int NURBS_Func::GetBSplCoef3( int M, int K, int i, double * t, double ** coef )
2次のBスプライン曲線の各係数を求める
int NURBS_Func::GetBSplCoef2( int M, int K, int i, double * t, double ** coef )
1次のBスプライン曲線の各係数を求める
int NURBS_Func::GetBSplCoef1( int M, int K, int i, double * t, double ** coef )
NURBS曲面のシフト
void NURBS_Func::ShiftNurbsS( NURBSS * nurbs, Coord shift )
NURBS曲線のシフト
void NURBS_Func::ShiftNurbsC( NURBSC * nurbs, Coord shift )
NURBS曲面をDベクトル回りにdeg(°)だけ回転させる
void NURBS_Func::RotNurbsS( NURBSS * nurbs, Coord axis, double deg )
NURBS曲面をDベクトル回りにdeg(°)だけ回転させる
void NURBS_Func::RotNurbsC( NURBSC * nurbs, Coord axis, double deg )
NURBS曲面の倍率を変更する
void NURBS_Func::ChRatioNurbsS( NURBSS * nurbs, Coord ratio )
NURBS曲線の倍率を変更する
void NURBS_Func::ChRatioNurbsC( NURBSC * nurbs, Coord ratio )
NURBS曲面nurbsのコントロールポイントを,NURBS曲面Nurbsのコントロールポイントに置き換える
int NURBS_Func::SetCPNurbsS( NURBSS * nurbs, NURBSS Nurbs )
与えられた点列を補間するn階のNURBS曲線を生成する.
int NURBS_Func::GenInterpolatedNurbsC1( NURBSC * Nurbs, Coord * P, int PNum, int M )
与えられた点列を補間するn階のNURBS曲線を生成する. 端末条件:始点とC2で一致
int NURBS_Func::GenInterpolatedNurbsC2( NURBSC * Nurbs, Coord * P_, int PNum, int M )
与えられた点列を近似するn階のNURBS曲線を生成する
int NURBS_Func::GenApproximationNurbsC( NURBSC * Nurbs, Coord * P, int PNum, int M )
コントロールポイントからNURBS曲線を生成する
int NURBS_Func::GenNurbsCfromCP( NURBSC * Nurbs, Coord * P, int PNum, int M )
折れ線(NURBS曲線)を生成する
int NURBS_Func::GenPolygonalLine( NURBSC * Nurbs, Coord * P, int PNum )
与えられた点列を補間するn階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 )
2枚のNURBS曲面を連結する(U方向に長くなる)(S1_U1とS2_U0を連結)
int NURBS_Func::ConnectNurbsSU( NURBSS * S1, NURBSS * S2, NURBSS * S_ )
2枚のNURBS曲面を連結する(V方向に長くなる)(S1_V1とS2_V0を連結)
int NURBS_Func::ConnectNurbsSV( NURBSS * S1, NURBSS * S2, NURBSS * S_ )
(private)ConnectNurbsSU()のサブ関数.S_のu方向コントロールポイントとウェイトを指定
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)ConnectNurbsSV()のサブ関数.S_のv方向コントロールポイントとウェイトを指定
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_ )
NURBS曲面と直線の交点を算出
int NURBS_Func::CalcuIntersecPtNurbsLine( NURBSS * Nurb, Coord r, Coord p, int Divnum, Coord * ans, int anssize, int LoD )
空間上の1点PからNURBS曲面S上の最近傍点Qを求める(ニュートン法)
int NURBS_Func::CalcIntersecPtNurbsPt( NURBSS * S, Coord P, int Divnum, int LoD, Coord * Q )
(private)CalcIntersecPtNurbsPt()のサブ関数.最小距離を調べる
int NURBS_Func::GetMinDist( NURBSS * S, Coord P, Coord * Q, int N, Coord * Ans )
空間上の1点PからNURBS曲面S上の最近傍点Qを求める(離散的)
void NURBS_Func::CalcIntersecPtNurbsPtDescrete( NURBSS * S, Coord P, int Divnum, int LoD, double Us, double Ue, double Vs, double Ve, Coord * Q )
注目中のNURBS曲面上の1点(u,v)がトリミング領域内にあるのかを判定する
int NURBS_Func::DetermPtOnTRMSurf( TRMS * Trim, double u, double v )
(private)DetermPtOnTRMSurf()のサブ関数.面上線のタイプが複合曲線の場合のトリミング領域内外判定
int NURBS_Func::DetermPtOnTRMSurf_sub( CONPS * Conps, double u, double v )
外周トリム面内の点のみ残す
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 )
(private)トリム境界線を点群で近似する
int NURBS_Func::ApproxTrimBorder( COMPC * CompC, Coord * P )
指定した分割数でNURBS曲線上の座標値を出力する
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 )
(準備中)極値探索線を得る
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 )
Bulirsch-Stoer法により極地探索を行う(微分方程式:du(s)/ds = fu(u,v) と、dv(s)/ds = fv(u,v)の解探索)
int NURBS_Func::SearchExtremum_BS( NURBSS * S, Coord nf, double u0, double v0, double H, int param, int direction, Coord * ans )
(private)極値探索線Sub関数1
int NURBS_Func::GetSECParam1( NURBSS * S, double u, double v, Coord nf, int param, int direction, Coord * f )
(private)TrimNurbsSPlaneのサブ関数(2D上の2直線の交点をもとめる)
Coord NURBS_Func::TrimNurbsSPlaneSub1( double a, double b, double x0, double y0, double x1, double y1 )
(private)各通過点の曲線パラメータを算出(コード長の比から算出)
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 )
NURBS曲線情報をデバッグプリント
void NURBS_Func::DebugForNurbsC( NURBSC * nurbs )
NURBS曲面情報をデバッグプリント
void NURBS_Func::DebugForNurbsS( NURBSS * nurbs )
NURBS曲線C(t)の指定パラメータ区間[a,b]の線分長Lを求める
double NURBS_Func::CalcNurbsCLength( NURBSC * Nurb, double a, double b )
(private)最小距離を持つ座標値を返す
Coord NURBS_Func::GetMinDistance( Coord a, Coord * b, int n )
NURBS曲線を指定した位置(端からの弧長)で分割する
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 )
2本のNURBS曲線を連結する
int NURBS_Func::ConnectNurbsC( NURBSC * C1, NURBSC * C2, NURBSC * C_ )
NURBS曲線のノットベクトル向きを反転する
void NURBS_Func::ReverseNurbsC( NURBSC * C )
(private)2本の曲線を繋げたときのノットベクトルを設定する
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)NURBS曲線に新たなノットを挿入する
int NURBS_Func::InsertNewKnotOnNurbsC( NURBSC * C, NURBSC * C_, double t, int deg )
等スキャロップ点を算出
int NURBS_Func::CalcConstScallop( NURBSS * S, NURBSC * C, double t, double g, double * u, double * v, int direct )
等ピッチ点を算出
int NURBS_Func::CalcConstPitch( NURBSS * S, NURBSC * C, double t0, double ds, double * t, int direct )