成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

OpenGL如何繪制Bezier曲線-創(chuàng)新互聯(lián)

這篇文章主要講解了OpenGL如何繪制Bezier曲線,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。

目前創(chuàng)新互聯(lián)公司已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、荷塘網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

項(xiàng)目要求:

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

– 使用鼠標(biāo)和鍵盤(pán)的交互操作實(shí)現(xiàn)對(duì)曲線的修改。

項(xiàng)目總體介紹

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

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

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

另有輔助輸入功能:

1、按鍵盤(pán)‘C'鍵可清除所有記錄點(diǎn)。

2、按鍵盤(pán)‘R'鍵可清除上一個(gè)記錄點(diǎn)。

3、按鍵盤(pán)‘Q'鍵可推出程序。

項(xiàng)目設(shè)計(jì)思路

1、Bezier曲線介紹:

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

2、生成公式:

(1)線性公式(只有兩個(gè)點(diǎn)情況)

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

且其等同于線性插值。

(2)二次方公式(三個(gè)點(diǎn)組成)

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

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

(3)三次方公式(四個(gè)點(diǎn))

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

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

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

(4)一般參數(shù)公式(n個(gè)點(diǎn))

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

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

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<GL/glut.h>
//定義控制點(diǎn)數(shù)目的大值
#define MAX_CPTX 25 
int ncpts=0;//實(shí)際控制點(diǎn)個(gè)數(shù)
static int width=600,height=600;//窗口大小
typedef struct
{
 GLfloat x,y;
} POINT;
POINT cpts[MAX_CPTX];//存儲(chǔ)控制點(diǎn)坐標(biāo)
//求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)));
}
//求一個(gè)數(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;
}
 
 
 
//輸入新的控制點(diǎn)
static void mouse(int button, int state,int x,int y)
{
void display();
float wx,wy;
//鼠標(biāo)未按下左鍵,不做響應(yīng)
if(state!=GLUT_DOWN)
 return;
else 
 {if(button==GLUT_LEFT_BUTTON)
 {
//轉(zhuǎn)換坐標(biāo)
wx=(2.0*x)/(float)(width-1)-1.0;
wy=(2.0*(height-1-y))/(float)(height-1)-1.0;
//判斷控制點(diǎn)數(shù)目是否超過(guò)大值
if(ncpts==MAX_CPTX)
 return;
//存儲(chǔ)控制點(diǎn)
cpts[ncpts].x=wx;
cpts[ncpts].y=wy;
ncpts++;
//繪制控制點(diǎn)
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();
 
}
//鍵盤(pán)回調(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");
//注冊(cè)回調(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();
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站jinyejixie.com,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)頁(yè)名稱:OpenGL如何繪制Bezier曲線-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)地址:http://jinyejixie.com/article34/csdipe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、Google、網(wǎng)站收錄企業(yè)建站、App開(kāi)發(fā)、App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
株洲市| 神农架林区| 双流县| 庆阳市| 万盛区| 抚远县| 安顺市| 峡江县| 云南省| 延吉市| 出国| 藁城市| 临沂市| 温宿县| 分宜县| 太湖县| 菏泽市| 额济纳旗| 西吉县| 合山市| 云霄县| 安福县| 鄯善县| 沙河市| 贵州省| 延寿县| 华坪县| 安国市| 浦县| 香河县| 封开县| 屏边| 武威市| 绥中县| 揭阳市| 隆德县| 藁城市| 玉龙| 怀安县| 吕梁市| 嵊州市|