3

先週、私はこの問題に直面してきました。私の現在のプロジェクトでは、NURBS 曲線を描く必要があります。プロジェクトは既に OpenNURBS を使用していますが、その使用方法を理解できませんでした。

私の質問は、いくつかのコントロール ポイントからカーブ ポイントを取得するにはどうすればよいですか?

かなりの検索を行ったところ、次の Web サイトを見ました: http://www.nar-associates.com/nurbs/c_code.html

コードを使用できますが、N 個の制御点を使用するためにコードを拡張/単純化する方法がわかりません。

(また、私は C++ を使用しているので、コードをページから上記の言語に変換しました。C++ に固有の回答の方が適切ですが、言語間の変換に問題はありません。)

4

3 に答える 3

1

このライブラリを試してください:

http://libnurbs.sourceforge.net/

Non-Uniform Rational B-Splines (NURBS) 曲線と曲面は、コンピューター グラフィックスで複雑な 3 次元形状を表現するために広く使用されている、非常に一般的な数学的曲面です。

libnurbs の目標は、NURBS 曲線とサーフェスを定義、操作、および分析する機能を備えた、クリーンで堅牢で強力なライブラリを提供することです。openNURBS ライブラリによって提供される基盤から構築し、そのライブラリに欠けている機能を実装し、必要に応じて変更を加えます。openNURBS の取り組みの目標は、さまざまな CAD システム間の相互運用性を高めることです。そのため、より完全な機能を備えたライブラリ (Rhino、彼らの商用プラットフォーム) を開発またはリリースするインセンティブがありません。したがって、このプロジェクトが必要です。

于 2012-08-07T12:19:00.013 に答える
0

これが私がそれを行う方法です

  1. カーブを作る

を。曲線オブジェクトを作成します (寸法、有理フラグ (重みはありますか)、曲線の次数 +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]);
  1. カーブをサンプリングする

を。曲線が有効かどうかをチェックする

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();
于 2016-09-28T18:44:24.463 に答える