使用OpenGL绘制Bezier曲线

本文实例为大家分享了OpenGL绘制Bezier曲线的具体代码,供大家参考,具体内容如下

最近在看Francis S Hill ,Jr 和 Stephen M Kelley合著的《计算机图形学》(OpenGL版)(第三版)书中有绘制三个控制点的Bezier曲线的代码。自己重新敲了一遍代码。发现了其中的一点小错误,修正过来了。并做了一点小小的改动。

源码见下

#include <windows.h>
#include <math.h>
#include <gl/GL.h>
#include <gl/glut.h>
int SCREEN_HEIGHT = 480;
int NUMPOINTS = 0;
class Point
{
public:
 float x, y;
 void setxy(float x2, float y2)
 {
 x = x2;
 y = y2;
 }
 Point operator&(const Point & rPoint)
 {
 x = rPoint.x;
 y = rPoint.y;
 return * this;
 }
};
Point abc[3];
void myInit()
{
 glClearColor(0.0,0.0,0.0,0.0);
 glColor3f(1.0f, 0.0, 0.0);
 glPointSize(4.0);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluOrtho2D(0.0, 640, 0.0, 480.0);
}
void drawDot(Point pt)
{
 glBegin(GL_POINTS);
 glVertex2f(pt.x, pt.y);
 glEnd();
 glFlush();
}
void drawLine(Point p1, Point p2)
{
 glBegin(GL_LINES);
 glVertex2f(p1.x, p1.y);
 glVertex2f(p2.x, p2.y);
 glEnd();
 glFlush();
}
//三个控制点的贝塞尔曲线
Point drawBezier(Point A, Point B, Point C, double t)
{
 Point P;
 P.x = pow((1-t), 2) * A.x + 2*t*(1-t)*B.x + pow(t, 2)*C.x;
 P.y = pow((1-t), 2) * A.y + 2*t*(1-t)*B.y + pow(t, 2)*C.y;
 return P;
}
void myMouse(int button, int state, int x, int y)
{
 if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
 {
 abc[NUMPOINTS].setxy((float)x, (float)(SCREEN_HEIGHT - y));
 NUMPOINTS++;
 if (NUMPOINTS == 3)
 {
  glColor3f(1.0, 0.0, 1.0);

  drawDot(abc[0]);
  drawDot(abc[1]);
  drawDot(abc[2]);
  glColor3f(1.0, 1.0, 0.0);
  drawLine(abc[0], abc[1]);
  drawLine(abc[1], abc[2]);
  glColor3f(0.0, 1.0, 1.0);
  Point POld = abc[0];
  for (double t = 0.0; t<=1.0;t+=0.1)
  {
  Point P = drawBezier(abc[0], abc[1], abc[2], t);
  drawLine(POld, P);
  POld = P;
  }
  glColor3f(1.0, 0.0, 0.0);
  NUMPOINTS = 0;
 }
 }
}
void myDisplay()
{
 glClear(GL_COLOR_BUFFER_BIT);
 glFlush();
}
int main(int argc, char * agrv[])
{
 glutInit(&argc, agrv);
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
 glutInitWindowSize(640, 480);
 glutInitWindowPosition(100, 150);
 glutCreateWindow("Bezier Curve");
 glutMouseFunc(myMouse);
 glutDisplayFunc(myDisplay);
 myInit();
 glutMainLoop();
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • OpenGL绘制Bezier曲线的方法

    本文实例为大家分享了OpenGL绘制Bezier曲线的具体代码,供大家参考,具体内容如下 项目要求: – 使用鼠标在屏幕中任意设置控制点,并生成曲线 – 使用鼠标和键盘的交互操作实现对曲线的修改. 项目总体介绍 本项目利用Bezier曲线生成算法生成可由用户自定义的曲线.可实现核心功能如下: 1.用户用鼠标左击屏幕任意处产生记录点. 2.鼠标右击屏幕任意处由先前的任意个数记录点和其先后关系生成Bezier曲线. 另有辅助输入功能: 1.按键盘'C'键可清除所有记录点. 2.按键盘'R'键可清除上

  • 基于OpenGL实现多段Bezier曲线拼接

    本文实例为大家分享了OpenGL实现多段Bezier曲线拼接的具体代码,供大家参考,具体内容如下 运行程序的交互方式有点类似corelDraw中的自由曲线绘制,或者photoShop中的钢笔自由路径绘制. 截图: 将BezierCurve封装成了一个类,代码如下: #ifndef _BEZIERCURVE_H #define _BEZIERCURVE_H #include "vec3.hpp" #include <vector> #include <iostream&

  • OpenGL绘制三次Bezier曲线

    本文实例为大家分享了OpenGL绘制三次Bezier曲线的具体代码,供大家参考,具体内容如下 计算公式: 运行结果: 代码如下: #include<gl/glut.h> #include<math.h> #include<windows.h> #include<vector> #include<algorithm> using namespace std; struct Point { int x, y; Point(){}; Point(int

  • OpenGL实现Bezier曲线的方法示例

    Bezier曲线的形状是通过一组多边折线(特征多边形)的各顶点唯一地定义出来的.在这组顶点中: (1)只有第一个顶点和最后一个顶点在曲线上: (2)其余的顶点则用于定义曲线的导数.阶次和形状: (3)第一条边和最后一条边则表示了曲线在两端点处的切线方向. // BezierCurve.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h"</div></div></li><li><div class=

  • OpenGL画bezier曲线

    Bezier Curve算法是根据参数曲线方程来得到光滑曲线的一种算法,曲线方程的参数由控制点决定. 其本质是由调和函数根据控制点插值而成,其参数方程如下: 其中Pi(i=0,1,-,n)为控制点的向量, Bi,n(t)为伯恩斯坦Bernstein基函数,其多项式表示为: 线性Bezier Curve由两个控制点决定: 二次Bezier Curve由三个控制点决定: 三次Bezier Curve由四个控制点决定: 如下图,t = AE:AB = BF:BC = CG:CD = EH:EF = F

  • 使用OpenGL绘制Bezier曲线

    本文实例为大家分享了OpenGL绘制Bezier曲线的具体代码,供大家参考,具体内容如下 最近在看Francis S Hill ,Jr 和 Stephen M Kelley合著的<计算机图形学>(OpenGL版)(第三版)书中有绘制三个控制点的Bezier曲线的代码.自己重新敲了一遍代码.发现了其中的一点小错误,修正过来了.并做了一点小小的改动. 源码见下 #include <windows.h> #include <math.h> #include <gl/GL

  • OpenGL绘制贝塞尔曲线

    本文实例为大家分享了OpenGL绘制贝塞尔曲线的具体代码,供大家参考,具体内容如下 最终效果图: 通过3个点形成一条贝塞尔曲线 1. 鼠标问题 在使用鼠标获取坐标的时候,要知道鼠标获取的坐标和屏幕坐标是不同的; openGL使用右手坐标 从左到右,x递增 从下到上,y递增 从远到近,z递增 而鼠标是从左到右增x,同时从上到下也是增y 所以在求 y 的时候,用(屏幕大小-y)来获取 2. 绘制 setpoint 用来绘制点 setline 用来绘制线 setBezier 用来绘制贝塞尔曲线 其中公

  • 解析在Direct2D中画Bezier曲线的实现方法

    Direct2D通过ID2D1RenderTarget接口支持基本图元(直线,矩形,圆角矩形,椭圆等)的绘制,然而,此接口并未提供对曲线绘制的直接支持.因此,想要使用Direct2D绘制一段通过指定点的曲线,比如Bezier曲线,必须借助于DrawGeometry()方法间接实现.需要通过一定的算法,将指定点转换为定义Path的控制点.幸运的是,codproject上已经有人做了这项工作,给出了相应的转换算法,并给出了C#版的实现:Draw a Smooth Curve through a Se

  • OpenGL实现贝塞尔曲线或曲面

    本文实例为大家分享了OpenGL实现贝塞尔曲线或曲面的具体代码,供大家参考,具体内容如下 理论基础 贝塞尔曲线和曲面:OpenGL只能直接绘制基本图元,对于曲线和曲面我们一般采用一系列线段或多边形来模拟的,这样当线段或多边形增多时必定很耗性能.其实对于这种曲线和曲面,我们可以使用一些控制点,通过求值器程序先计算出坐标等信息,然后直接用这些数据绘制,这样不仅节省内存,还提高了模拟曲线或曲面的精度(本质还是通过线段或多边形绘制的,只是求值器提前算出了曲线或曲面的顶点信息). 求值器使用一般步骤:1.

  • Javascript 绘制 sin 曲线过程附图

    Javascript 绘制 sin 曲线代码如下: <!DOCTYPE html> <html> <head> <style type="text/css"> #MyCanvas { background-color: cornflowerblue; } </style> <script type="text/javascript"> function draw(){ var my_canvas

  • Android Path绘制贝塞尔曲线实现QQ拖拽泡泡

    这两天学习了使用Path绘制贝塞尔曲线相关,然后自己动手做了一个类似QQ未读消息可拖拽的小气泡,效果图如下: 最终效果图 接下来一步一步的实现整个过程. 基本原理 其实就是使用Path绘制三点的二次方贝塞尔曲线来完成那个妖娆的曲线的.然后根据触摸点不断绘制对应的圆形,根据距离的改变改变原始固定圆形的半径大小.最后就是松手后返回或者爆裂的实现. Path介绍: 顾名思义,就是一个路径的意思,Path里面有很多的方法,本次设计主要用到的相关方法有 moveTo() 移动Path到一个指定的点 qua

随机推荐