專案要求:
– 使用滑鼠在螢幕中任意設定控制點,並生成曲線
– 使用滑鼠和鍵盤的互動操作實現對曲線的修改。
專案總體介紹
本專案利用bezier曲線生成演算法生成可由使用者自定義的曲線。可實現核心功能如下:
1、使用者用滑鼠左擊螢幕任意處產生記錄點。
2、滑鼠右擊螢幕任意處由先前的任意個數記錄點和其先後關係生成bezier曲線。
另有輔助輸入功能:
1、按鍵盤『c'鍵可清除所有記錄點。
2、按鍵盤『r'鍵可清除上乙個記錄點。
3、按鍵盤『q'鍵可推出程式。
專案設計思路
1、bezier曲線介紹:
貝塞爾曲線就是這樣的一條曲線,它是依據四個位置任意的點座標繪製出的一條光滑曲線。在歷史上,研究貝塞爾曲線的人最初是按照已知曲線引數方程來確定四個點的思路設計出這種向量曲線繪製法。2023年,法國數學家pierre bzier第乙個研究了這種向量繪製曲線的方法,並給出了詳細的計算公式,因此按照這樣的公式繪製出來的曲線就用他的姓氏來命名是為貝塞爾曲線。
2、生成公式:
(1)線性公式(只有兩個點情況)
給定點p0、p1,線性貝茲曲線只是一條兩點之間的直線。這條線由下式給出:
且其等同於線性插值。
(2)二次方公式(三個點組成)
二次方貝茲曲線的路徑由給定點p0、p1、p2的函式b(t)追蹤:
truetype字型就運用了以貝茲樣條組成的二次貝茲曲線。
(3)三次方公式(四個點)
p0、p1、p2、p3四個點在平面或在三維空間中定義了三次方貝茲曲線。曲線起始於p0走向p1,並從p2的方向來到p3。一般不會經過p1或p2;這兩個點只是在那裡提供方向資訊。p0和p1之間的間距,決定了曲線在轉而趨進p3之前,走向p2方向的「長度有多長」。
曲線的引數形式為:
現代的成象系統,如postscript、asymptote和metafont,運用了以貝茲樣條組成的三次貝茲曲線,用來描繪曲線輪廓。
(4)一般引數公式(n個點)
階貝茲曲線可如下推斷。給定點p0、p1、…、pn,其貝茲曲線即:
n階的貝茲曲線,即n-1階貝茲曲線之間的插值。
#include
#include
#include
#include
//定義控制點數目的最大值
#define max_cptx 25
int ncpts=0;//實際控制點個數
static int width=600,height=600;//視窗大小
typedef struct
point;
point cpts[max_cptx];//儲存控制點座標
//求n!
int jiecheng(int n)
else }
//求組合排列
double c(int n,int i)
//求乙個數u的num次方
double n(double u,int n)
for(int i=0;iwww.cppcns.comt y)
if(button==glut_right_button)}}
void display(void)
//鍵盤**函式
void keyboard(unsigned char key,int x,int y)}
//重繪函式
void reshape(int w,int h)
int main(int argc, char **ar**)
本文標題: opengl繪製bezier曲線的方法
本文位址:
Bezier曲線繪製方法
de casteljau演算法能簡單快速地求出某個t值的曲線值,複雜度是o n 2 的乘法與加法。這裡平方級的計算感覺比較慢,如果應用秦九韶演算法來求該多項式值的話,複雜度降低到了o n 難度是因為數值穩定性的原因?而如果是繪製一條曲線的話,如果要用m個等間距的點來逼近這條曲線的話,複雜度是o m ...
Qt 繪製平滑Bezier曲線
1 二階bezier static qpointf quadvalue const qpointf p0,const qpointf p1,const qpointf p2,qreal t static qpointf quadderived const qpointf p0,const qpoin...
繪製貝塞爾Bezier曲線
trainingtools.cpp 定義控制台應用程式的入口點。include include include include include include using namespace std const int ww max mark count 40 最大40個控制點 int mark c...