绘制NURBS曲线?

时间:2012-08-07 07:45:35

标签: c++ c curve nurbs opennurbs

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

我的问题是,如何从几个控制点获得曲线点?

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

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

(另外,我使用C ++,所以我将代码从页面转换为所述语言,特定于C ++的答案会更好,但我不会在语言之间进行转换。)< / p>

3 个答案:

答案 0 :(得分:1)

试试这个库:

http://libnurbs.sourceforge.net/

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我是这样做的

  1. 制作曲线
  2. 一个。创建曲线对象(维度,有理旗帜(它有权重),曲线度+1,你有多少个控制点)

     ON_NurbsCurve thisCurve(3, false, order, controlPoints.size());
    

    湾将控制点添加到曲线

    for(int i = 0; i <controlPoints.size(); ++i)
    {
       ON_3dPoint cpPosition = controlPoints[i];
       thisCurve.SetCV(i, cpPosition.x);
    }
    

    ℃。添加结

    予。如果你有knot_count = cv_count + degree + 1

    for (int i = 1; i < knotValues.size() - 1; ++i)
       thisCurve.SetKnot(i - 1, knotValues[i]);
    

    II。如果你有knot_count = cv_count + degree - 1

    for (int i = 0; i < knotValues.size(); ++i)
       thisCurve.SetKnot(i, knotValues[i]);
    
    1. 对曲线进行采样
    2. 一个。检查曲线是否有效

      if (thisCurve.IsValid())
      {
      

      湾获取曲线的参数范围

      double maxU = knotValues.back();
      double minU = knotValues.front();
      

      ℃。插

      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;
      

      即清理

        delete [] pointsOut;
      }
      
      thisCurve.Destroy();