• 大小: 5.84MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-11-07
  • 语言: 其他
  • 标签: OpenGL  Bezier  递推  

资源简介

本程序主要通过调用OpenGL库中的基础函数实现了Bezier曲线的绘制,绘制原理是利用递推公式求解Bernstein多项式,进而求解出Bezier曲线上对应点的坐标值,然后连接这些点绘制出Bezier曲线。点击左键选择顶点,点击右键结束控制点的输入,并绘制出Beizer曲线,继续点击左键,可以继续添加控制点。

资源截图

代码片段和文件信息

#include
#include
#include
#include
//定义控制点数目的最大值
#define MAX_CPTX 25  
int ncpts=0;//实际控制点个数
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)));
}
//求一个数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;
//判断控制点数目是否超过最大值
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 < ncpts; i++)
        glVertex2f(cpts[i].xcpts[i].y);
    glEnd();
    glFlush();

}
//键盘回调函数
void keyboard(unsigned char keyint xint y)
{
switch (key)
    {
        case ‘q‘: case ‘Q‘:
            exit(0);
            break;
        case ‘c‘: case ‘C‘:
ncpts = 0;
glutPostRedisplay();
            break;
    }
}

//重绘函数
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“);
//注册回调函数
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.embed.manifest

     文件        472  2014-03-06 23:56  bezier1\bezier1\Debug\bezier1.exe.embed.manifest.res

     文件        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\link-cvtres.read.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link-cvtres.write.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link.20220-cvtres.read.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link.20220-cvtres.write.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link.20220.read.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link.20220.write.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link.5380-cvtres.read.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link.5380-cvtres.write.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link.5380.read.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link.5380.write.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link.6088-cvtres.read.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link.6088-cvtres.write.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link.6088.read.1.tlog

     文件          2  2014-03-08 01:30  bezier1\bezier1\Debug\link.6088.write.1.tlog

............此处省略35个文件信息

评论

共有 条评论