最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenGL繪制Bezier曲線的方法

 更新時間:2020年04月20日 14:37:19   作者:process-z.com  
這篇文章主要為大家詳細介紹了OpenGL繪制Bezier曲線的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了OpenGL繪制Bezier曲線的具體代碼,供大家參考,具體內(nèi)容如下

項目要求:

– 使用鼠標在屏幕中任意設(shè)置控制點,并生成曲線

– 使用鼠標和鍵盤的交互操作實現(xiàn)對曲線的修改。

項目總體介紹

本項目利用Bezier曲線生成算法生成可由用戶自定義的曲線??蓪崿F(xiàn)核心功能如下:

1、用戶用鼠標左擊屏幕任意處產(chǎn)生記錄點。

2、鼠標右擊屏幕任意處由先前的任意個數(shù)記錄點和其先后關(guān)系生成Bezier曲線。

另有輔助輸入功能:

1、按鍵盤‘C'鍵可清除所有記錄點。

2、按鍵盤‘R'鍵可清除上一個記錄點。

3、按鍵盤‘Q'鍵可推出程序。

項目設(shè)計思路

1、Bezier曲線介紹:

貝塞爾曲線就是這樣的一條曲線,它是依據(jù)四個位置任意的點坐標繪制出的一條光滑曲線。在歷史上,研究貝塞爾曲線的人最初是按照已知曲線參數(shù)方程來確定四個點的思路設(shè)計出這種矢量曲線繪制法。1962年,法國數(shù)學家Pierre Bézier第一個研究了這種矢量繪制曲線的方法,并給出了詳細的計算公式,因此按照這樣的公式繪制出來的曲線就用他的姓氏來命名是為貝塞爾曲線。

2、生成公式:

(1)線性公式(只有兩個點情況)

給定點P0、P1,線性貝茲曲線只是一條兩點之間的直線。這條線由下式給出:

且其等同于線性插值。

(2)二次方公式(三個點組成)

二次方貝茲曲線的路徑由給定點P0、P1、P2的函數(shù)B(t)追蹤:

TrueType字型就運用了以貝茲樣條組成的二次貝茲曲線。

(3)三次方公式(四個點)

P0、P1、P2、P3四個點在平面或在三維空間中定義了三次方貝茲曲線。曲線起始于P0走向P1,并從P2的方向來到P3。一般不會經(jīng)過P1或P2;這兩個點只是在那里提供方向資訊。P0和P1之間的間距,決定了曲線在轉(zhuǎn)而趨進P3之前,走向P2方向的“長度有多長”。

曲線的參數(shù)形式為:

現(xiàn)代的成象系統(tǒng),如PostScript、Asymptote和Metafont,運用了以貝茲樣條組成的三次貝茲曲線,用來描繪曲線輪廓。

(4)一般參數(shù)公式(n個點)

階貝茲曲線可如下推斷。給定點P0、P1、…、Pn,其貝茲曲線即:

N階的貝茲曲線,即N-1階貝茲曲線之間的插值。

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<GL/glut.h>
//定義控制點數(shù)目的最大值
#define MAX_CPTX 25 
int ncpts=0;//實際控制點個數(shù)
static int width=600,height=600;//窗口大小
typedef struct
{
 GLfloat x,y;
} POINT;
POINT cpts[MAX_CPTX];//存儲控制點坐標
//求n!
int JieCheng(int n)
{
 if(n==1||n==0)
 {
 return 1;
 }
 else
 {
 return n*JieCheng(n-1);
 }
}
//求組合排列
double C(int n,int i)
{
 return ((double)JieCheng(n))/((double)(JieCheng(i)*JieCheng(n-i)));
}
//求一個數(shù)u的num次方
double N(double u,int n)
{
 double sum=1.0;
 if (n==0)
 {
 return 1;
 }
 for(int i=0;i<n;i++)
 {
 sum*=u;
 }
 return sum;
}
 
//繪制bezier曲線
void drawBezier(POINT *p)
{ 
 void display();
 if(ncpts<=0) return; 
 
 POINT *p1;
 p1=new POINT[1000];
 GLfloat u=0,x,y;
 int i,num=1;
 p1[0]=p[0];
 for(u=0;u<=1;u=u+0.001)
 { 
 x=0;
 y=0;
 for(i=0;i<ncpts;i++)
 { 
  x+=C(ncpts-1,i)*N(u,i)*N((1-u),(ncpts-1-i))*p[i].x;
  y+=C(ncpts-1,i)*N(u,i)*N((1-u),(ncpts-1-i))*p[i].y;
 }
 p1[num].x=x;
 p1[num].y=y;
 num++;
 } 
 
  glPointSize(4.0);
  glColor3f(0.0,0.0,0.0);
  glBegin(GL_LINE_STRIP);
  for(int k=0;k<1000;k++)
 glVertex2f(p1[k].x,p1[k].y);
  glEnd();
  glFlush();
 return;
}
 
 
 
//輸入新的控制點
static void mouse(int button, int state,int x,int y)
{
void display();
float wx,wy;
//鼠標未按下左鍵,不做響應
if(state!=GLUT_DOWN)
 return;
else 
 {if(button==GLUT_LEFT_BUTTON)
 {
//轉(zhuǎn)換坐標
wx=(2.0*x)/(float)(width-1)-1.0;
wy=(2.0*(height-1-y))/(float)(height-1)-1.0;
//判斷控制點數(shù)目是否超過最大值
if(ncpts==MAX_CPTX)
 return;
//存儲控制點
cpts[ncpts].x=wx;
cpts[ncpts].y=wy;
ncpts++;
//繪制控制點
glColor3f(0.0,0.0,0.0);
glPointSize(5.0);
glBegin(GL_POINTS);
glVertex2f(wx,wy);
glEnd();
glFlush();
}
if(button==GLUT_RIGHT_BUTTON)
{
display();
drawBezier(cpts);
}
}
}
void display(void)
{
 int i;
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(0.0,0.0,0.0);
 glPointSize(5.0);
 glBegin(GL_POINTS);
 for (i = 0; i < ncpts; i++)
  glVertex2f(cpts[i].x,cpts[i].y);
 glEnd();
 glFlush();
 
}
//鍵盤回調(diào)函數(shù)
void keyboard(unsigned char key,int x,int y)
{
 switch (key)
 {
  case 'q': case 'Q':
   exit(0);
   break;
  case 'c': case 'C':
 ncpts = 0;
 glutPostRedisplay();
   break;
 case 'r': case 'R':
 ncpts--;
 glutPostRedisplay();
 break;
 }
}
 
//重繪函數(shù)
void reshape(int w,int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,w,h);//調(diào)整視口
width=w;
height=h;
}
int main(int argc, char **argv)
{
//初始化
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(width,height);
glutCreateWindow("zjc2012211763");
//注冊回調(diào)函數(shù)
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutKeyboardFunc(keyboard);
glutReshapeFunc(reshape);
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(0.0,0.0,0.0);
glutMainLoop();
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于C++語言實現(xiàn)機動車違章處罰管理系統(tǒng)

    基于C++語言實現(xiàn)機動車違章處罰管理系統(tǒng)

    這篇文章主要介紹了基于C++語言實現(xiàn)機動車違章處罰管理系統(tǒng)的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • 基于list循環(huán)刪除元素,迭代器失效的問題詳解

    基于list循環(huán)刪除元素,迭代器失效的問題詳解

    下面小編就為大家?guī)硪黄趌ist循環(huán)刪除元素,迭代器失效的問題詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • fatal error LNK1104: 無法打開文件“l(fā)ibc.lib”的解決方法

    fatal error LNK1104: 無法打開文件“l(fā)ibc.lib”的解決方法

    本篇文章是對fatal error LNK1104: 無法打開文件“l(fā)ibc.lib”的解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中變量進行初始化的3種方法

    C++中變量進行初始化的3種方法

    本文主要介紹了C++中變量進行初始化的3種方法,包括用"=",構(gòu)造函數(shù)初始化以及統(tǒng)一初始化這三種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,著小編來一起學習學習吧
    2024-02-02
  • C++ 中placement new 操作符使用方法

    C++ 中placement new 操作符使用方法

    這篇文章主要介紹了C++ 中placement new 操作符使用方法的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++采用ring3讀取MBR實例

    C++采用ring3讀取MBR實例

    這篇文章主要介紹了C++采用ring3讀取MBR實例,可實現(xiàn)對硬盤的主引導記錄的讀取,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • 詳解C語言未初始化的局部變量是多少

    詳解C語言未初始化的局部變量是多少

    這篇文章主要給大家介紹了關(guān)于C語言未初始化的局部變量是多少,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-07-07
  • 一文解析C語言中動態(tài)內(nèi)存管理

    一文解析C語言中動態(tài)內(nèi)存管理

    這篇文章主要為大家詳細介紹了C語言中動態(tài)內(nèi)存管理的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以跟隨小編一起學習一下
    2024-02-02
  • QString的常用方法(小結(jié))

    QString的常用方法(小結(jié))

    這篇文章主要介紹了QString的常用方法(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • C語言18個必背經(jīng)典程序

    C語言18個必背經(jīng)典程序

    這篇文章主要分下工的是18個C語言必背的經(jīng)典程序,下面文章我們就來看看實例,需要的小伙伴可以參考一下喲,希望對你有所幫助
    2021-10-10

最新評論

白城市| 咸宁市| 宾阳县| 玉环县| 阿勒泰市| 沅江市| 清徐县| 雅安市| 呼和浩特市| 中方县| 崇州市| 五家渠市| 齐齐哈尔市| 宝鸡市| 乌审旗| 泰州市| 深州市| 沧源| 深水埗区| 定陶县| 于都县| 菏泽市| 佳木斯市| 沽源县| 洛川县| 新蔡县| 西青区| 德保县| 昌黎县| 江陵县| 漾濞| 大关县| 永吉县| 潮安县| 桦甸市| 安龙县| 双城市| 新田县| 开远市| 武陟县| 盈江县|