Bezier曲线曲面绘制
知识点:
Bezier曲面性质
Bezier曲线简单理解
代码参考:https://blog.csdn.net/wpxu08/article/details/70208395
曲线
#include <GL/glut.h>
GLfloat ctrlpoints[4][3] ={{ -4.0, -4.0, 0.0}, { -2.0, 3.0, 0.0},{2.0, 4.5, 0.0}, {3.0, -3.0, 0.0}};
//GLfloat ctrlpoints[4][3] ={{ 0.0, 0.0, 0.0}, { 4.0, 0.0, 0.0},{4.0, 4.0, 0.0}, {-4,4, 0.0}};//改变顶点
void init(void)
{glClearColor(1.0, 1.0, 1.0, 0.0);glShadeModel(GL_FLAT);//下行用于定义曲线函数glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);//一维求值器glEnable(GL_MAP1_VERTEX_3); //将当前曲线函数激活
}
void display(void)
{int i;glClear(GL_COLOR_BUFFER_BIT);//下面用求值器按等分计算Bezier曲线上的点glColor3f(0.0, 0.0, 0.0);glLineWidth(2);//画弯折直线glBegin(GL_LINE_STRIP);//分段数for (i = 0; i <= 100; i++)glEvalCoord1f((GLfloat) i/100); //相当于调用了glVertex*()glEnd();//下面绘制控制多边形glLineWidth(1);glColor3f(0.0, 0.0, 1.0);glBegin(GL_LINE_STRIP);for (i = 0; i < 4; i++)glVertex3fv(&ctrlpoints[i][0]);glEnd();glFlush();
}
//改变窗口大小时保持图形比例
void reshape(int w, int h)
{glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w, 5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0); elseglOrtho(-5.0*(GLfloat)w/(GLfloat)h, 5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}
int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE " GLUT_RGB);glutInitWindowSize (500, 500);glutInitWindowPosition (100, 100);glutCreateWindow (argv[0]);init ();glutDisplayFunc(display);glutReshapeFunc(reshape);//改变窗口大小时保持图形比例glutMainLoop();return 0;
}
曲面
#include <GL/glut.h>
GLfloat ctrlpoints[4][4][3] = {
{{ -3, -3, 4.0 },{ -1, -3, 4.0 },{ 1, -3, -2.0 },{ 3, -3, 4.0 }},
{{ -3, -1, 2.0 },{ -1, 3, 4.0 },{ 1, 1, 2},{3,-1,-2}},
{{ -3, 1, 4.0 },{ -1, 1, 2.0 },{ 1,1, 6},{3,-3,3} },
{{ -3,3, -4},{ -1,3,-4.0},{1,1,2},{3,3,-2}}
};
//增加一个顶点的x
//GLfloat ctrlpoints[4][4][3] = {
//{{ -1, -3, 4.0 },{ -1, -3, 4.0 },{ 1, -3, -2.0 },{ 3, -3, 4.0 }},
//{{ -3, -1, 2.0 },{ -1, 3, 4.0 },{ 1, 1, 2},{3,-1,-2}},
//{{ -3, 1, 4.0 },{ -1, 1, 2.0 },{ 1,1, 6},{3,-3,3} },
//{{ -3,3, -4},{ -1,3,-4.0},{1,1,2},{3,3,-2}}
//};
void init(void)
{glClearColor (1.0, 1.0, 1.0, 0.0);//下行的代码用控制点定义Bezier曲面函数glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]);glEnable(GL_MAP2_VERTEX_3); //激活该曲面函数glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0); //构造平行投影矩阵 设置正投影空间
}
void display(void)
{int i, j;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glColor3f(0.0, 0.0, 1.0);glPushMatrix ();//矩阵入栈glRotatef(30.0, 1.0, 1.0, 1.0);//旋转一下便于查看for (j = 0; j <= 20; j++){glBegin(GL_LINE_STRIP);for (i = 0; i <= 20; i++)glEvalCoord2f((GLfloat)i/20.0, (GLfloat)j/20.0); //调用求值器glEnd();glBegin(GL_LINE_STRIP);for (i = 0; i <= 20; i++)glEvalCoord2f((GLfloat)j/20.0, (GLfloat)i/20.0); //调用求值器glEnd();}glPopMatrix ();//矩阵出栈glFlush();
}
int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize (500, 500);glutInitWindowPosition (100, 100);glutCreateWindow (argv[0]);init ();glutDisplayFunc(display);glutMainLoop();return 0;
}
结果
绘制曲线: 改变顶点后
绘制曲面: 增加其中一个顶点x
Bezier曲线曲面绘制相关推荐
- bezier 曲线的绘制 matlab实现
Bezier曲线的定义如下: 下面用matlab实现Bezier曲线的绘制: 1.绘制二维bezier曲线代码如下: function [X,Y]=bezier2(x,y) %用法: %bezier( ...
- 计算机图形学:三次Bezier曲线的绘制(算法原理及代码实现)
一.实现方案 贝塞尔曲线原理:贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一.它通过控制曲线上的四个点(起始点.终止点以及两个相互分离的中间点)来创造.编辑图形.其中起重 ...
- 【Python】Bezier曲线的绘制
Bezier曲线的绘制 r(u)=∑iJn,i(u)Vir(u) = \sum_i{J_{n,i}(u)V_i}r(u)=∑iJn,i(u)Vi Jn,i=Cniui(1−u)n−iJ_{n,i ...
- 计算机图形学:Bezier曲线的绘制
1.实验目的 掌握Bezier曲线的定义原理及绘制过程 定义: 贝塞尔曲线(Bezier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线.一般的矢量图形软件通过它来精确画出 ...
- qt下bezier曲线的绘制(C++)
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- matlab meshgrid例子,MATLAB简单三维曲线曲面绘制——meshgrid函数 ← MATLAB讨论组 ......
三维曲线和曲面的绘制在实际中经常用到,MATLAB正式由于其强大的绘图功能,在工程和科学界已经广泛使用.这里演示一下,怎样根据离散点数据绘制三维曲线或者曲面. 绘制三维图形,首先,需要XY平面的网格数 ...
- MFC有理二次Bezier曲线绘制
MFC有理二次Bezier曲线绘制 非有理Bezier曲线曲线无法精确表示所有的二次曲线和二次曲面,引入了有理Bezier曲线曲面,来精确表示.如图,通过控制权重,可以获取不同的二次有理Bezier曲 ...
- 计算机图形学 实验7 《复杂图形绘制-Bezier曲线与Hermite曲线》
计算机图形学 实验7 <复杂图形绘制-Bezier曲线与Hermite曲线> 一.实验目的 学习样条曲线的绘制. 二.实验内容 1.绘制Bezier曲线: 2.绘制Hermite曲线. 三 ...
- Bezier曲线的拼接
Bezier曲线的拼接 根据前面对Bezier曲线生成算法的介绍,显然随着点的增加,接着会引起 的次数提高,而而高次多项式又会带来计算上的困难. 对于上式子,也就是随着n的增加,t的次数也会随着增加 ...
最新文章
- 听说,这是时下最恐怖的出游邀请
- 4.Windows下安装ZooKeeper
- bug4 导入新工程时报 Target runtime com.genuitec.runtime.generic.jee60 is not defined
- jquery生成二维码
- Boost.Asio入门
- SQL server 2016 安装步骤
- 【Unity3D与23种设计模式】模板方法模式(Template Method)
- 双系统重装windows以后修复ubuntu的引导
- 获得SAP CRM report的元数据get report detail(Metadata) via url
- css3的cursor
- 基于JAVA+SpringBoot+Mybatis+MYSQL的快递管理系统
- 一周只指定一个主要目标,当主要目标完成时,就已经完成了任务的80%
- IEEE COMMUNICATIONS LETTERS 写作Latex模板
- WSADATA 数据结构
- [JZOJ3339]【NOI2013模拟】wyl8899和法法塔的游戏
- 小白学习MySQL - MySQL会不会受到“高水位”的影响?
- 基因编辑最新研究进展(2021年8月)
- 动手学习数据分析第一章内容
- 关于textarea中的回车符
- pandas相关性分析的三种方法
热门文章
- 炒菜机器人的弊端_体验官|炒菜机器人真的实用吗
- 司库奇尤单抗什么时候停药?理由不少于200字
- WSL Docker 使用 bitnami 镜像
- Android常用命令行指令
- [无线] Android 系统开发学习杂记
- 目标检测YOLO实战应用案例100讲-基于点云的三维多目标检测算法研究
- Efficient SR挑战赛结果| AIM 2020 Challenge on Efficient Super-Resolution:Methods and Results
- 使用Excel计算正态分布的峰度(Kurtosis)和偏度(Skewness)
- Linux Mint设置中文输入法
- 看英文电影必备的粗口词汇短语