功能:根據引數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)
beta = 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改為階數大小,就可以呢?
#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;
}
樣條曲線反求控制點
對於開曲線,關於首末端點條件,採用了兩種演算法進行比對 端點切矢,自由端點。下面只介紹核心部分,其他參考教材即可。測試思路 1 根據型值點求出控制點 2 由型值點在autocad畫出圖形輸出dxf檔案 3 將 1 求出的控制點在 2 中新增進去,用於和cad計算的結果做比對。一 端點切矢法 最主要的...
樣條曲線 B樣條曲線求解及C 實現
功能 根據引數u值和k 大小為階數值 與節點向量,計算第i個k次b樣條基數 輸入引數 u 引數值 k 大小值為階數 i 第i個k次b樣條的支撐區間左端節點的下標 anode為節點向量。輸出引數 返回函式值。double getbasefunval double u,int i,int k,vecto...
b樣條和三次樣條 樣條曲線
最近在學習軌跡規劃中的軌跡生成,涉及到樣條曲線方面的知識,總結一下。曲線的平滑性和相應的平滑性的評判準則相關,在 1 中,作者採用曲率的平方和曲率導數的平方作為評判準則 其中 是路徑點的方向角。最小化這兩個準則的軌跡分別是圓弧和三階螺旋線,並對在對稱和不對稱情況下如何生成路徑進行了分析,事實表明三階...