樣條曲線 B樣條曲線求解及C 實現

2021-10-14 18:44:02 字數 2018 閱讀 7434

功能:根據引數u值和k(大小為階數值)與節點向量,計算第i個k次b樣條基數

輸入引數: u—引數值;k—大小值為階數;i—第i個k次b樣條的支撐區間左端節點的下標;anode為節點向量。

輸出引數:返回函式值。

double getbasefunval(double u, int i, int k, vector m_anode)

}if (k>0)

else

else

alpha = (u - m_anode[i])/dtemp;

dtemp = m_anode[i+k+1] - m_anode[i+1];

if (dtemp == 0.0)

else

beta = (m_anode[i+k+1] - u)/dtemp;

val1 = alpha * getbasefunval(u, i, k-1, m_anode);

val2 = beta * getbasefunval(u, i+1, k-1, m_anode);

val = val1 + val2;}}

return val;

}

上述功能模組摘自於計算機輔助幾何設計與非均勻有理b樣條。已知b樣條的n+1控制點座標,以及相應的節點向量,可求得對應的曲線方程。

先計算各個控制點的基函式

各個基函式的求解可根據上述的功能模組求出。
下面是我的c++實現:曲線是二維的,三維的情況,就z座標做同x,y求解方式相同即可。在求解的過程中,我自己在cad上畫了個樣條曲線,然後通過getbasefunval(double u, int i, int k, vector m_anode)和頂點座標,及節點向量求各個點的座標。隨著u值的變化,計算各個x,y,z值。乙個星期的摸爬滾打中,能輸出圖形,但是與原來的圖形對應不上。最終找到的原因在與基函式出問題了。在書本等相關資源中,基函式成員中的k表示的是次數,在我畫的樣條曲線中,階數顯示為3(為什麼是3?cad的標註裡,實體塊中的 70 下一行,為3),所以我理所當然的寫為了2,。一直有問題。我將它改為3以後,竟然奇蹟般的可以用了。而且跟原來圖形吻合。這個是我的相關經歷,希望對你們能有用。另外,哪位熱心人士可以說明下,為什麼k改為階數大小,就可以呢?

// 以下相關資料,座標點,節點向量,是本人在cad中繪製一條樣條曲線之後得到的數值。關於資料,讀者可自行更改。

#include #include #include using namespace std;

struct tpoint

;double getbasefunval(double u, int i, int k, vector m_anode)

}if (k>0)

else

else

alpha = (u - m_anode[i])/dtemp;

dtemp = m_anode[i+k+1] - m_anode[i+1];

if (dtemp == 0.0)

else

beta = (m_anode[i+k+1] - u)/dtemp;

val1 = alpha * getbasefunval(u, i, k-1, m_anode);

val2 = beta * getbasefunval(u, i+1, k-1, m_anode);

val = val1 + val2;}}

return val;

}int main()

char *file = "c:/users/monkey/desktop/新建資料夾 (2)/test/last.txt";

ofstream out(file);

if (!out)

for (int n = 0; n < vtdata.size(); n++)

out.close();

return 0;

}

b樣條和三次樣條 樣條曲線

最近在學習軌跡規劃中的軌跡生成,涉及到樣條曲線方面的知識,總結一下。曲線的平滑性和相應的平滑性的評判準則相關,在 1 中,作者採用曲率的平方和曲率導數的平方作為評判準則 其中 是路徑點的方向角。最小化這兩個準則的軌跡分別是圓弧和三階螺旋線,並對在對稱和不對稱情況下如何生成路徑進行了分析,事實表明三階...

B 樣條曲線 動機 Motivation

b 樣條曲線 動機 motivation 定義 考慮設計乙個花瓶的剖面圖。下圖左邊是11次 degree 的貝塞爾曲線 但是它很難彎曲瓶頸到線段 p4p5。當然,我們可以在這個線段附近增加控制點來增加該區域的權重。但是這會增加曲線的次數 degree 許多情況下,不值得使用如此高次 degree 的...

B 樣條曲線的導數

回目錄 定義如下 如果原始的clamped節點向量是u 0 p 1 u p 1,u m p 1,u m p 1 那麼移動第乙個和最後乙個節點使得第乙個和最後乙個節點重複度變成,p 而不是p 1,我們有乙個m 1 個節點u 0 p u p 1,u m p 1,u m p 的新節點序列。那麼,可證明在原...