2012-08-07 201 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();