精华内容
下载资源
问答
  • 今天小编就为大家分享一篇关于OpenGL实现Bezier曲线的方法示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • OpenGL实现Bezier曲线

    千次阅读 2017-05-02 16:32:12
    Bezier曲线的形状是通过一组多边折线(特征多边形)的各顶点唯一地定义出来的。在这组顶点中: (1)只有第一个顶点和最后一个顶点在曲线上; (2)其余的顶点则用于定义曲线的导数、阶次和形状; (3)第一条边和最后一条...

    Bezier曲线的形状是通过一组多边折线(特征多边形)的各顶点唯一地定义出来的。在这组顶点中:

    (1)只有第一个顶点和最后一个顶点在曲线上;

    (2)其余的顶点则用于定义曲线的导数、阶次和形状;

    (3)第一条边和最后一条边则表示了曲线在两端点处的切线方向。


    
    
    // BezierCurve.cpp : 定义控制台应用程序的入口点。
    //
    


    展开全文
  • 将BezierCurve封装成了一个类,给予VS2010实现曲线拼接
  • OpenGLbezier曲线

    2020-08-19 07:28:56
    主要为大家详细介绍了OpenGLbezier曲线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 1、利用OpenGL绘制Bezier曲线; 2、使用鼠标在屏幕中任意设置控制点,并生成曲线, 3、使用鼠标和键盘的交互操作实现对曲线的修改;
  • 主要为大家详细介绍了使用OpenGL绘制Bezier曲线的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了OpenGL绘制Bezier曲线的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • VS下用OpenGL实现Bezier曲线算法
  • OpenGL-bezier曲线

    2021-04-30 14:12:50
    每一个t带入方程可以得到空间或平面上的一个点 当t从0-1就会得到bezier曲线 n n表示次数 是几次bezier曲线 Pi(0,1,2,…n): 控制多边形的n+1个顶点 (伯恩斯坦基函数)Bi,t(t): 二次bezier曲线 此时有三个控制点 ...

    曲线参数方程

    在这里插入图片描述
    每一个t带入方程可以得到空间或平面上的一个点 当t从0-1就会得到bezier曲线

    n

    n表示次数 是几次bezier曲线

    Pi(0,1,2,…n):

    控制多边形的n+1个顶点

    (伯恩斯坦基函数)Bi,t(t):

    在这里插入图片描述
    在这里插入图片描述

    二次bezier曲线

    此时有三个控制点 P0,P1,P2 ,n=2在这里插入图片描述

    最终简化 直接可以调用

    在这里插入图片描述

    矩阵形式

    在这里插入图片描述

    三次bezier曲线

    最终简化

    在这里插入图片描述

    bezier曲线性质

    端点性

    就是一定会经过第一个和最后一个点

    对称性

    假设n次bezier曲线控制多边形的顶点位置不变 把次序颠倒过来 曲线形状 仍然不变只不过曲线走向相反

    递推性

    n次的伯恩斯坦基函数可以由两个n-1次的伯恩斯坦基函数线性组合而成在这里插入图片描述

    走向

    bezier曲线的起点和终点处的切线方向和特征多边形的第一条和最后一条边走向相同

    变差缩减性在这里插入图片描述

    de Castel jau算法(bezier曲线递推算法)

    在这里插入图片描述
    在这里插入图片描述

    n次bezier曲线的递推公式

    在这里插入图片描述

    展开全文
  • 利用OPENGL技术实现图形Bezier曲线,这对于学习OPENGL技术优点帮助
  • 今天,用opengl实现bezier曲线的绘制,但是当我将控制点增加到九个的时候,程序死活绘制不出图像。 后来经过一番折腾,终于知道,是xp系统的问题,程序在win7上可以正常运行。 下面我附上我的主要程序 第一段是...

    今天,用opengl实现bezier曲线的绘制,但是当我将控制点增加到九个的时候,程序死活绘制不出图像。

    后来经过一番折腾,终于知道,是xp系统的问题,程序在win7上可以正常运行。

    下面我附上我的主要程序

    第一段是利用glEvalCoord1f() 

    函数先生成离散点,然后用直线链接。

     

    	glShadeModel(GL_FLAT);  
    	glColor3f(1.0,0.0,0.0);
    	
    	GLfloat controlPoint[9][3] = {
    		{-1.0f,0.0f,0.0f},{-0.75f,0.707f,0.0f},{-0.5f,1.0f,0.0f},
    		{-0.25f,0.707f,0.0f},{0.0f,0.0f,0.0f},{0.25f,-0.707f,0.0f},
    		{0.5f,-1.0f,0.0f},{0.75f,-0.707f,0.0f},{1.0f,0.0f,0.0f}
    	};
    	glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,8,(const float*)controlPoint);
    	glEnable(GL_MAP1_VERTEX_3);
    
    
    	
    glBegin(GL_LINE_STRIP);
    		for(int i = 0;i <= 100; i++)
    			glEvalCoord1f((GLfloat)i/(GLfloat)100.0);
    	glEnd();
    	glDisable(GL_MAP1_VERTEX_3); 
    

     

    第二段是利用glMapGrid1d();对u参数进行自动等分。再用glEvalMesh1()函数产生一系列的点并利用这些顶点坐标最终绘制一条曲线。

     

     

    	glShadeModel(GL_FLAT);  
    	glColor3f(1.0,0.0,0.0);
    	
    	GLfloat controlPoint[9][3] = {
    		{-1.0f,0.0f,0.0f},{-0.75f,0.707f,0.0f},{-0.5f,1.0f,0.0f},
    		{-0.25f,0.707f,0.0f},{0.0f,0.0f,0.0f},{0.25f,-0.707f,0.0f},
    		{0.5f,-1.0f,0.0f},{0.75f,-0.707f,0.0f},{1.0f,0.0f,0.0f}
    	};
    	glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,8,(const float*)controlPoint);
    	glEnable(GL_MAP1_VERTEX_3);
    	glMapGrid1f(50,0.0f,1.0f);
    	glEvalMesh1(GL_LINE,0,50);
    	glDisable(GL_MAP1_VERTEX_3); 
    

    转载于:https://www.cnblogs.com/gaoteng/archive/2011/10/23/2221668.html

    展开全文
  • openGLbezier曲线生成

    2015-12-12 13:11:33
    用vs2012、c++实现的简单bezier样条曲线生成实例,本人自己编写的代码,分享给大家,含较多注释,便于大家学习参考。
  • openglbezier曲线

    2007-11-11 23:12:42
    实现bezier曲线的绘制,支持鼠标操作
  • OpenGL绘制Bezier曲线

    万次阅读 2015-01-17 18:57:34
    本项目利用Bezier曲线生成算法生成可由用户自定义的曲线。可实现核心功能如下: 用户用鼠标左击屏幕任意处产生记录点。 鼠标右击屏幕任意处由先前的任意个数记录点和其先后关系生成Bezier曲线。 ...
    

    项目要求:

    – 使用鼠标在屏幕中任意设置控制点,并生成曲线

    – 使用鼠标和键盘的交互操作实现对曲线的修改。

    项目总体介绍

    本项目利用Bezier曲线生成算法生成可由用户自定义的曲线。可实现核心功能如下:

    1. 用户用鼠标左击屏幕任意处产生记录点。

    2. 鼠标右击屏幕任意处由先前的任意个数记录点和其先后关系生成Bezier曲线。

    另有辅助输入功能:

    1. 按键盘C键可清除所有记录点。

    2. 按键盘R键可清除上一个记录点。

    3. 按键盘Q键可推出程序。

     

     

    项目设计思路

    1Bezier曲线介绍:

    贝塞尔曲线就是这样的一条曲线,它是依据四个位置任意的点坐标绘制出的一条光滑曲线。在历史上,研究贝塞尔曲线的人最初是按照已知曲线参数方程来确定四个点的思路设计出这种矢量曲线绘制法。1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名是为贝塞尔曲线。

    2、生成公式:

    1线性公式(只有两个点情况)

    给定点P0P1,线性贝兹曲线只是一条两点之间的直线。这条线由下式给出:

    且其等同于线性插值。

    2二次方公式(三个点组成)

    二次方贝兹曲线的路径由给定点P0P1P2的函数Bt)追踪:

     

    TrueType字型就运用了以贝兹样条组成的二次贝兹曲线。

    3三次方公式(四个点)

    P0P1P2P3四个点在平面或在三维空间中定义了三次方贝兹曲线。曲线起始于P0走向P1,并从P2的方向来到P3。一般不会经过P1P2;这两个点只是在那里提供方向资讯。P0P1之间的间距,决定了曲线在转而趋进P3之前,走向P2方向的“长度有多长”。

    曲线的参数形式为:

    现代的成象系统,如PostScriptAsymptoteMetafont,运用了以贝兹样条组成的三次贝兹曲线,用来描绘曲线轮廓。

     

     

    4一般参数公式n个点)

    阶贝兹曲线可如下推断。给定点P0P1、…、Pn,其贝兹曲线即:

     


    N阶的贝兹曲线,即N-1阶贝兹曲线之间的插值。

    #include<stdlib.h>
    #include<stdio.h>
    #include<math.h>
    #include<GL/glut.h>
    //定义控制点数目的最大值
    #define MAX_CPTX 25  
    int ncpts=0;//实际控制点个数
    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)));
    }
    //求一个数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)
    	{
    //转换坐标
    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.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();
    
    }
    //键盘回调函数
    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;
        }
    }
    
    //重绘函数
    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);//调整视口
    width=w;
    height=h;
    }
    int main(int argc, char **argv)
    {
    //初始化
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(width,height);
    glutCreateWindow("zjc2012211763");
    //注册回调函数
    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();
    }
    






    张竞成

    www.zjc18.com

    展开全文
  • opengl实现三次Bezier曲线
  • 主要为大家详细介绍了基于OpenGL实现多段Bezier曲线拼接,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • OpenGLBezier曲线

    千次阅读 2010-09-26 16:29:00
    最近在看Francis S Hill ,Jr 和 Stephen M Kelley合著的《计算机图形学》(OpenGL版)(第三版)书中有绘制三个控制点的Bezier曲线的代码。自己重新敲了一遍代码。发现了其中的一点小错误,修正过来了。并做了一点小小的...
  • OpenGL实现Bezier曲线

    千次阅读 2011-12-16 21:42:47
    贝塞尔曲线的是参数曲线,参数...下面是对贝塞尔曲线实现。   #include #include #define DIMENSION 2//定义维度为2维 typedef GLfloat VECTOR [DIMENSION]; VECTOR points[4]= {{-1.0,-1.0},{0.0,2.0},{1.0,2.0
  • 基于OpenGL实现的多段Bezier曲线拼接 有代码, 截图
  • 计算机图形学作业( 七):利用 OpenGL 绘制 Bezier 贝塞尔曲线Bezier 曲线原理OpenGL 实现思路捕获鼠标点击时的坐标根据顶点画出连续的线段根据顶点画出 Bezier 贝塞尔曲线效果代码 Bezier 曲线原理 Bezier 曲线的...
  • 用MFC实现Bezier曲线.rar

    2010-06-28 00:28:06
    MFC VC++ OPENGL Bezier曲线 画图 MFC VC++ OPENGL Bezier曲线 画图
  • /* Create a windowed mode window and its OpenGL context */ window = glfwCreateWindow(WIDTH, HEIGHT, "Bezier Curve", NULL, NULL); glfwSetWindowPos(window, 600, 200); if (!window) { ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,002
精华内容 400
关键字:

opengl实现bezier曲线