2012-08-07 171 views
3

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

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

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

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

(另外,我使用C++,所以我转换的代码从页面到说的语言,具体到C++的答案会更好,但我没有语言之间转换的任何问题。)

回答

1

尝试这个库:

http://libnurbs.sourceforge.net/

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

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

+0

我会试试这个并报告回来。我已经下载了几次,但我没有完整阅读这些例子。 – 2012-08-07 13:37:29

+0

不,那件事情是不可能编译的,每次我尝试编译时都会遇到数千个错误,它已经过时了,无法修复。 – 2012-08-08 06:38:47

+0

也许你做错了什么。你有什么样的错误? – Tutankhamen 2012-08-08 08:18:40

0

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

0

这里是我如何做到这一点

  1. 使曲线

一个。创建曲线对象(维,理性标志(它具有权重),曲线+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); 
} 

c。添加结

一,如果你有knot_count = cv_count +学历+ 1

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

II。如果你有knot_count = 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。评估这需要(参数的曲线,采取多少衍生物,什么尺寸,存储值的双阵列)

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