ONGEOによる半直線とNurbs曲面群との交点計算手順

1. ONGEO_SphereTree *stを構築する。

2. 半直線 ON_3dRay rayを定義する。

3. ONGEO_SphereTree_RayIntersectTest(st, ray, results)でざっくり干渉テストを実施する。

4. 3.で得られたresultsの各要素をresultとして、下記を実施する。

4-1. 干渉したベジエ曲面を取得

 ON_BezierSurface &bez = st->bezs[result.bez_index];

4-2. bezを有効範囲でトリム

 bez.Trim(0, result.uint), bez.Trim(1, result.vint);

4-3. 干渉したNurbs曲面番号と、そのUVレンジを取得

 int nbsurf_index = ONGEO_SphereTree_GetNurbsIntervalFromBezIndex(st, nbsurfs, result.bez_index, range);

4-4. result.uintとresult.vintをNurbs曲面上のUV範囲に変換する。

 nbrange[0] = range[0].ParameterAt(result.uint), nbrange[1] = range[1].ParameterAt(result.vint);

4-5. QuasiInterpolating法で交点計算

 ONGEO_IntersectRayBezier_QuasiInterpolating(ray, bez, tuvs, ptsrf, ptlin, トレランス);

4-6. 得られた交点毎に必要に応じて固有の処理を実施

なお、tuvsの各要素をtuvとすると、tuv[0]:直線パラメータ、tuv[1]:ベジエ曲面Uパラメータ、tuv[2]:ベジエ曲面Vパラメータとなり、tuv[1]、tuv[2]は nbrange[0 or 1].ParameterAt(tuv[1 or 2])によりNurbs曲面のUV値に変換できます。