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

资源简介

基于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\link.command.1.tlog

     文件       3404  2017-04-04 22:54  Bezier_experiment\Bezier_experiment\Debug\Bezier_e.BE11A5C9.tlog\link.read.1.tlog

     文件        752  2017-04-04 22:54  Bezier_experiment\Bezier_experiment\Debug\Bezier_e.BE11A5C9.tlog\link.write.1.tlog

     文件       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个文件信息

评论

共有 条评论