【问题标题】:Drawing NURBS Curves?绘制 NURBS 曲线?
【发布时间】:2012-08-07 07:45:34
【问题描述】:

在过去的一周里,我一直面临着这个问题。对于我当前的项目,我需要绘制 NURBS 曲线,该项目已经使用 OpenNURBS,但我无法弄清楚如何使用它。

我的问题是,我怎样才能从几个控制点得到曲线点?

我做了很多搜索,我看到了这个网站:http://www.nar-associates.com/nurbs/c_code.html

我可以使用该代码,但我不明白如何扩展/简化它以使用 N 个控制点。

(另外,我使用的是 C++,所以我将页面中的代码转换为所述语言,特定于 C++ 的答案会更好,但我在语言之间转换没有任何问题。)

【问题讨论】:

    标签: c++ c curve nurbs opennurbs


    【解决方案1】:

    试试这个库:

    http://libnurbs.sourceforge.net/

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

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

    【讨论】:

    • 我会试试这个并报告。我已经下载了几次,但我没有仔细阅读示例。
    • 不,那东西是完全无法编译的,每次我尝试编译时都会遇到数千个错误,它已经过时了,无法修复。
    • 也许你做错了什么……你遇到了什么错误?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我是这样做的

      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。添加结

      我。如果你有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. 对曲线进行采样

      一个。检查曲线是否有效

      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。评估这需要(曲线的参数,采用多少导数,什么维度,存储值的双精度数组)

        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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-11
        • 1970-01-01
        相关资源
        最近更新 更多