これが私がそれを行う方法です
- カーブを作る
を。曲線オブジェクトを作成します (寸法、有理フラグ (重みはありますか)、曲線の次数 +1、制御点の数)
ON_NurbsCurve thisCurve(3, false, order, controlPoints.size());
b. 制御点を曲線に追加する
for(int i = 0; i <controlPoints.size(); ++i)
{
ON_3dPoint cpPosition = controlPoints[i];
thisCurve.SetCV(i, cpPosition.x);
}
c. 結び目を追加する
I. ある場合は、knot_count = cv_count + degree + 1
for (int i = 1; i < knotValues.size() - 1; ++i)
thisCurve.SetKnot(i - 1, knotValues[i]);
Ⅱ.あなたがノットカウントを持っている場合 = cv_count + 次数 - 1
for (int i = 0; i < knotValues.size(); ++i)
thisCurve.SetKnot(i, knotValues[i]);
- カーブをサンプリングする
を。曲線が有効かどうかをチェックする
if (thisCurve.IsValid())
{
b. 曲線のパラメトリック範囲を取得します
double maxU = knotValues.back();
double minU = knotValues.front();
c. 補間する
double quadrature = 10;
for (unsigned int i = 0; i < quadrature; ++i)
{
double t = ((maxU - minU) * (i) / (quadrature - 1)) + minU;
double pointsOut[3];
d. これが取る評価 (曲線のパラメータ、導関数の数、次元、値を格納する double 配列)
bool successful = thisCurve.Evaluate(t, 0, 3, pointsOut);
if (successful)
curvePoints.push_back(ON_3dPoint(pointsOut[0], pointsOut[1], pointsOut[2]));
else
std::cout << "evaluation not successful " << std::endl;
e. 掃除
delete [] pointsOut;
}
thisCurve.Destroy();