资源简介
基于OPENGL制作的描点式Bezier曲线绘制,功能较为完善,有多种键盘回调功能,代码简单,有详细注释,适合初学者学习借鉴,在VS2013调试无误
代码片段和文件信息
#include“stdafx.h“
#include
#include
#include
#define XVALUE 800//视口大小
#define YVALUE 600
#define ZVALUE 200
#define MAX_CPTX 50 //最大控制点数
#define float_x(x) ((float)x)/XVALUE
#define float_y(y) (float(W_height - 1 - y))/YVALUE
int W_width = XVALUE W_height = YVALUE;
int Ctrl_P_Num = 0;//实际控制点数
int type = GL_LINE_STRIP v;
int rubberbanding antialiasing;//弹性的、消除走样标志位
typedef struct
{
GLfloat x y;
} POINT;
POINT Control_Local[MAX_CPTX];//存储控制点坐标
void bezier() //德卡斯特里奥算法
{
float Approach_x[1000];
float Approach_y[1000];
GLfloat Path_Point[1000][2];
int k = 0;
for (double t = 0.0; t <= 1; t += 0.001)
{
for (int i = 1; i < Ctrl_P_Num; ++i)
{
for (int j = 0; j < Ctrl_P_Num - i; ++j)
{
if (i == 1) // i==1时第一次迭代由已知控制点计算
{
Approach_x[j] = Control_Local[j].x * (1 - t) + Control_Local[j + 1].x * t;
Approach_y[j] = Control_Local[j].y * (1 - t) + Control_Local[j + 1].y * t;
continue;
}
// i != 1时通过上一次迭代的结果计算
Approach_x[j] = Approach_x[j] * (1 - t) + Approach_x[j + 1] * t;
Approach_y[j] = Approach_y[j] * (1 - t) + Approach_y[j + 1] * t;
}
}
Path_Point[k][0] = Approach_x[0];
Path_Point[k][1] = Approach_y[0];
k++;
}
glColor3f(1.0 1.0 0.0);
glBegin(GL_LINE_STRIP);
for (int i = 0; i < 1000; i++)
{
glVertex2fv(Path_Point[i]);
}
glEnd();
}
void SetupRc(void)//初始化绘制环境
{
glClearColor(0.0f 0.0f 0.0f 0.0f);//用于清除的颜色
glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓冲以及深度缓冲
glMatrixMode(GL_PROJECTION);//指定当前矩阵对投影矩阵应用随后的矩阵操作.
glLoadIdentity();//对当前矩阵进行初始化
gluOrtho2D(0 XVALUE 0 YVALUE);
glBlendFunc(GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA);//指定红绿蓝和 alpha 目标混合因子 源混合因子如何计算
}
void RenderScene(void)//渲染
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(5.0);
if (Ctrl_P_Num == 1 && (type == GL_LINE_STRIP || type == GL_LINE_LOOP))
{
glBegin(GL_POINTS);//点模式,把每一个顶点作为一个点进行处理
glVertex2f(Control_Local[0].x Control_Local[0].y);//
glEnd();
}
glLineWidth(5.0f);//指定线的宽度
glBegin(type);
glColor3f(0.0 0.0 1.0);
for (i = 0; i < Ctrl_P_Num; i++)//依次绘制所有的点
{
glVertex2f(Control_Local[i].x Control_Local[i].y);
}
glEnd();
if (Ctrl_P_Num >= 3)//出现两条边后开始绘制Bezier曲线
{
bezier();
}
glutSwapBuffers();//双缓冲区图形绘制
}
void Reshape(int width int height)
{
float w_aspect = ((float)XVALUE) / YVALUE aspect = ((float)width) / height;
if (aspect <= w_aspect)//视口保持w_aspect的纵横比
glViewport(0 (height - width / w_aspect) / 2 width width / w_aspect);
else
glViewport((width - height*w_aspect) / 2 0 height*w_aspect height);
//透视视窗转换
glMatrixMode(GL_PROJECTION);//指定当前矩阵对投影矩阵应用随后的矩阵操作.
glLoadIdentity();//对当前矩阵进行初始化
gluOrtho2D(0 1 0 1);
}
void Keyboard(unsigned char key int x int y)//普通键盘回调
{
switch (key)
{
case ‘a‘://消除锯齿,使线段平滑
{
antialiasing = !antialiasing;//消除走样标志位
if (antialias
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 6584 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Bezier_experiment.cpp
文件 4553 2017-04-02 09:43 Bezier_experiment\Bezier_experiment\Bezier_experiment.vcxproj
文件 1324 2017-04-02 09:43 Bezier_experiment\Bezier_experiment\Bezier_experiment.vcxproj.filters
文件 174 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug\Bezier_e.BE11A5C9.tlog\Bezier_experiment.lastbuildstate
文件 1662 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug\Bezier_e.BE11A5C9.tlog\cl.command.1.tlog
文件 4262 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug\Bezier_e.BE11A5C9.tlog\CL.read.1.tlog
文件 1426 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug\Bezier_e.BE11A5C9.tlog\CL.write.1.tlog
文件 1502 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug\Bezier_e.BE11A5C9.tlog\li
文件 3404 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug\Bezier_e.BE11A5C9.tlog\li
文件 752 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug\Bezier_e.BE11A5C9.tlog\li
文件 1628 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug\Bezier_experiment.log
文件 22741 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug\Bezier_experiment.obj
文件 1703936 2017-04-02 09:43 Bezier_experiment\Bezier_experiment\Debug\Bezier_experiment.pch
文件 11741 2017-04-02 09:43 Bezier_experiment\Bezier_experiment\Debug\stdafx.obj
文件 84992 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug\vc120.idb
文件 151552 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug\vc120.pdb
文件 1580 2017-04-02 09:43 Bezier_experiment\Bezier_experiment\ReadMe.txt
文件 223 2017-04-02 09:43 Bezier_experiment\Bezier_experiment\stdafx.cpp
文件 234 2017-04-02 09:43 Bezier_experiment\Bezier_experiment\stdafx.h
文件 236 2017-04-02 09:43 Bezier_experiment\Bezier_experiment\targetver.h
文件 30212096 2017-05-13 21:54 Bezier_experiment\Bezier_experiment.sdf
文件 997 2017-04-02 09:43 Bezier_experiment\Bezier_experiment.sln
..A..H. 19968 2017-05-13 21:54 Bezier_experiment\Bezier_experiment.v12.suo
文件 41984 2017-04-04 22:54 Bezier_experiment\Debug\Bezier_experiment.exe
文件 470584 2017-04-04 22:54 Bezier_experiment\Debug\Bezier_experiment.ilk
文件 741376 2017-04-04 22:54 Bezier_experiment\Debug\Bezier_experiment.pdb
文件 3080192 2017-04-02 09:43 Bezier_experiment\ipch\bezier_experiment-e39e0123\bezier_experiment-128d144d.ipch
目录 0 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug\Bezier_e.BE11A5C9.tlog
目录 0 2017-04-04 22:54 Bezier_experiment\Bezier_experiment\Debug
目录 0 2017-04-02 09:43 Bezier_experiment\ipch\bezier_experiment-e39e0123
............此处省略7个文件信息
- 上一篇:struts2配置 用户注册登录
- 下一篇:eps文助力转向相关论文
相关资源
- OpenGL绘制的鱼轮廓曲线
- 绘制Bezier曲面和B样条曲面
- 安卓动画效果相关-SpringIndicator-bezie
- 案例22-双三次Bezier曲面-网格.zip
- 计算机图形学前沿报告flash版
- opengl包含16个鼠标控制点的Bezier曲面
- opengl实现bezier曲面的纹理贴图、鼠标
- 计算机图形学 Bezier曲线
- Bezier曲线(任意次数)程序实现可用
- 贝塞尔曲线编辑器——个人版
- 图形学Bezier曲线和B样条曲面
- Bezier曲线的算法描述及其程序实现
- 计算机图形学源码DDA直线、中点直线
- Bezier曲线的升阶和降阶
- 画bezier曲线代码
- 动态旋转双三次Bezier曲面实体模型
- 双三次Bezier曲面算法
- Bezier曲线曲面绘制
- C源代码:显示指定字符在指定字体中对
- unity 鼠标控制camera移动
- 绘制Bezier/B样条曲线
- 图形学曲线绘制实验
评论
共有 条评论