資源簡介
本程序主要通過調用OpenGL庫中的基礎函數(shù)實現(xiàn)了Bezier曲線的繪制,繪制原理是利用遞推公式求解Bernstein多項式,進而求解出Bezier曲線上對應點的坐標值,然后連接這些點繪制出Bezier曲線。點擊左鍵選擇頂點,點擊右鍵結束控制點的輸入,并繪制出Beizer曲線,繼續(xù)點擊左鍵,可以繼續(xù)添加控制點。

代碼片段和文件信息
#include
#include
#include
#include
//定義控制點數(shù)目的最大值
#define?MAX_CPTX?25??
int?ncpts=0;//實際控制點個數(shù)
static?int?width=1024height=768;//窗口大小
typedef?struct
{
GLfloat?xy;
}?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?nint?i)
{
return?((double)JieCheng(n))/((double)(JieCheng(i)*JieCheng(n-i)));
}
//求一個數(shù)u的num次方
double?N(double?uint?n)
{
double?sum=1.0;
if?(n==0)
{
return?1;
}
for(int?i=0;i {
sum*=u;
}
return?sum;
}
//繪制bezier曲線
void?drawBezier(POINT?*p)
{????
void?display();
if(ncpts<=0)?return;
POINT?*p1;
p1=new?POINT[1000];
GLfloat?u=0xy;
int?inum=1;
p1[0]=p[0];
for(u=0;u<=1;u=u+0.001)
{???
x=0;
y=0;
for(i=0;i {
??????x+=C(ncpts-1i)*N(ui)*N((1-u)(ncpts-1-i))*p[i].x;
??????y+=C(ncpts-1i)*N(ui)*N((1-u)(ncpts-1-i))*p[i].y;
}
p1[num].x=x;
p1[num].y=y;
num++;
}
????glPointSize(2.0);
????glColor3f(1.00.00.0);
????glBegin(GL_LINE_STRIP);
????for(int?k=0;k<1000;k++)
??glVertex2f(p1[k].xp1[k].y);
????glEnd();
????glFlush();
return;
}
//輸入新的控制點
static?void?mouse(int?button?int?stateint?xint?y)
{
void?display();
float?wxwy;
//鼠標未按下左鍵,不做響應
if(state!=GLUT_DOWN)
???return;
else?
{if(button==GLUT_LEFT_BUTTON)
{
//轉換坐標
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.00.00.0);
glPointSize(5.0);
glBegin(GL_POINTS);
glVertex2f(wxwy);
glEnd();
glFlush();
}
if(button==GLUT_RIGHT_BUTTON)
{
display();
drawBezier(cpts);
}
}
}
void?display(void)
{
int?i;
????glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.00.00.0);
????glPointSize(5.0);
????glBegin(GL_POINTS);
????for?(i?=?0;?i?????????glVertex2f(cpts[i].xcpts[i].y);
????glEnd();
????glFlush();
}
//鍵盤回調函數(shù)
void?keyboard(unsigned?char?keyint?xint?y)
{
switch?(key)
????{
????????case?‘q‘:?case?‘Q‘:
????????????exit(0);
????????????break;
????????case?‘c‘:?case?‘C‘:
ncpts?=?0;
glutPostRedisplay();
????????????break;
????}
}
//重繪函數(shù)
void?reshape(int?wint?h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.01.0-1.01.0-1.01.0);
glMatrixMode(GL_MODELVIEW);
glViewport(00wh);//調整視口
width=w;
height=h;
}
int?main(int?argc?char?**argv)
{
//初始化
glutInit(&argcargv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(widthheight);
glutCreateWindow(“bezier“);
//注冊回調函數(shù)
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutKeyboardFunc(keyboard);
glutReshapeFunc(reshape);
glClearColor(1.01.01.01.0);
glColor3f(0.00.00.0);
glutMainLoop();
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????3020??2014-03-09?02:38??bezier1\bezier1\bezier1.cpp
?????文件???????3920??2014-03-06?23:46??bezier1\bezier1\bezier1.vcxproj
?????文件????????945??2014-03-06?23:46??bezier1\bezier1\bezier1.vcxproj.filters
?????文件????????143??2014-03-06?22:27??bezier1\bezier1\bezier1.vcxproj.user
?????文件????????406??2014-03-06?23:56??bezier1\bezier1\Debug\bezier1.exe.em
?????文件????????472??2014-03-06?23:56??bezier1\bezier1\Debug\bezier1.exe.em
?????文件????????381??2014-03-08?01:30??bezier1\bezier1\Debug\bezier1.exe.intermediate.manifest
?????文件?????????49??2014-03-08?01:30??bezier1\bezier1\Debug\bezier1.lastbuildstate
?????文件???????2051??2014-03-08?01:30??bezier1\bezier1\Debug\bezier1.log
?????文件??????18491??2014-03-08?01:30??bezier1\bezier1\Debug\bezier1.obj
?????文件????????707??2014-03-06?23:46??bezier1\bezier1\Debug\bezier1.vcxprojResolveAssemblyReference.cache
?????文件??????????0??2014-03-06?23:46??bezier1\bezier1\Debug\bezier1.write.1.tlog
?????文件????????204??2014-03-06?23:56??bezier1\bezier1\Debug\bezier1_manifest.rc
?????文件????????618??2014-03-08?01:30??bezier1\bezier1\Debug\cl.command.1.tlog
?????文件???????2232??2014-03-08?01:30??bezier1\bezier1\Debug\CL.read.1.tlog
?????文件????????282??2014-03-08?01:30??bezier1\bezier1\Debug\CL.write.1.tlog
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
?????文件??????????2??2014-03-08?01:30??bezier1\bezier1\Debug\li
............此處省略35個文件信息
- 上一篇:通信電子線路(第四版)答案
- 下一篇:Spring Boot 參考指南
評論
共有 條評論