绘制NURBS曲线?

3
过去一周,我一直面临着这个问题。在我的当前项目中,我需要绘制NURBS曲线,该项目已经使用了OpenNURBS,但我无法弄清如何使用它。我的问题是,如何从一些控制点获取曲线点?我进行了相当多的搜索,并看到了这个网站:http://www.nar-associates.com/nurbs/c_code.html。我可以使用这段代码,但我不知道如何扩展/简化它以使用N个控制点。此外,我正在使用C ++,因此我将页面上的代码转换为所说的语言,特定于C ++的答案会更好,但是我转换语言没有任何问题。
3个回答

1
你可以使用this免费工具在线绘制NURBS曲线。这是一个基于webGL的应用程序,最好在Chrome浏览器中使用。在这里,你可以使用N个控制点绘制曲线,并查看与u参数相对应的曲线上某一点的值。

1

试试这个库:

http://libnurbs.sourceforge.net/

非均匀有理B样条(NURBS)曲线和曲面是计算机图形学中用于表示复杂三维形状的非常通用的数学表面。

libnurbs的目标是提供一个干净、强大且功能全面的库,能够定义、操作和分析NURBS曲线和曲面。我们将建立在openNURBS库提供的基础上,实现该库缺失的功能并根据需要进行更改。openNURBS项目的目标是增加各种CAD系统之间的互操作性,因此他们没有动力开发或发布更全面的库(这就是Rhino,他们的商业平台) - 因此需要这个项目。


我会尝试这个并反馈结果。我已经下载了几次,但还没有仔细阅读示例。 - Ilija Boshkov
不行,那个东西根本无法编译,每次尝试编译时都会出现成千上万的错误,它已经过时到无法修复的地步了。 - Ilija Boshkov
你可能做错了什么。你遇到了什么样的错误? - Tutankhamen

0

这是我的做法

  1. 制作曲线

a. 创建曲线对象(维度,有无权重标志,曲线的次数+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]);

二、如果您的 knot_count = cv_count + degree - 1

for (int i = 0; i < knotValues.size(); ++i)
   thisCurve.SetKnot(i, knotValues[i]);
  1. 采样曲线

a. 检查曲线是否有效

if (thisCurve.IsValid())
{

获取曲线的参数范围

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. evaluate this takes(曲线参数,求几阶导数,哪个维度,一个双精度数组用于存储值)

  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;

清理

  delete [] pointsOut;
}

thisCurve.Destroy();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接