山东大学图形学实验二多边形的世界


写一个可以交互的OpenGL应用程序,支持用户利用鼠标创建和删除2维多边形对象。基本功能包括: 对象创建:支持用户利用鼠标指定各个顶点位置,创建多边形。 对象删除: 支持用户选择一个多边形(与你的多边形保存的数据结构有关)并删除。 对象存储: 设计一种数据结构存储每个多边形的顶点与边,支持文件存盘。 提示:由于删除操作需要多边形的选择机制,你可以在设计数据结构时,把可以帮助你完成选择的信息一起保存。 扩展功能可以包括(至少选择其一): 1. 支持用户选择多边形的颜色 2. 支持用户移动多边形 3. 支持用户改变多边形单个顶点的位置 4. 支持3D多边形
资源截图
代码片段和文件信息
#include 
#include 
#include 
#include  
#define MAX_POLYGONS 10
#define MAX_VERTICES 20


#define TRUE 1
#define FALSE 0

void myReshape(int int); //窗口处理事件函数
void myinit(); //初始化
void myMouse(int int int int); //鼠标事件处理函数
void myMotion(int int); //实现移动多边形功能
int pick_polygon(int x int y); //选择多边形
int pick_point(int x int y); //选择点
void color_menu(int); //颜色选择菜单
void moving_menu(int); //选择移动点或者多边形
void main_menu(int); //主菜单
void myDisplay();                       //移动的图形高亮


/*定义全局变量*/


/*定义多边形的结构体类型即一种存放多边形信息的数据结构,包括颜色,是否要画出来,包围盒的边界大小,多边形中心的坐标,各顶点坐标*/

typedef struct polygon
{
int color;
bool isFill; //是否填充
bool end; //结束绘制多边形
bool  used; //多边形是否被定义
int xmin xmax ymin ymax; //包围盒
float xc yc; //多边形中心
int nvertices; //顶点数目
int x[MAX_VERTICES]; //顶点
int y[MAX_VERTICES];
bool highlight = false;
} polygon;

/*定义标记变量*/
bool start = TRUE; //开始绘制新的多边形
FILE *fp = NULL; //用于存盘复盘的指针
FILE *pp = NULL;
bool Fill = FALSE; //是否填充
bool noFill = FALSE; //解除填充
bool pointMoving = FALSE; //判断是否处于移动点状态

bool picking = FALSE; //判断是否处于拾取状态,如果是,则为TRUE 
bool moving = FALSE; //判断是否处于移动状态
int in_polygon = -1; //不在任何多边形的内部
int present_color = 0; //默认颜色

GLsizei wh = 800 ww = 500; //初始窗口大小
int draw_mode = 0; //绘制模式

GLfloat colors[8][3] = { { 0.0 0.0 0.0 }{ 1.0 0.0 0.0 }{ 0.0 1.0 0.0 }
{ 0.0 0.0 1.0 }{ 0.0 1.0 1.0 }{ 1.0 0.0 1.0 }{ 1.0 1.0 0.0 }
{ 1.0 1.0 1.0 } }; //颜色数组


polygon polygons[MAX_POLYGONS]; //多边形结构数组


void myReshape(int w int h) //窗口处理事件函数
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0 (GLdouble)w 0.0 (GLdouble)h);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glViewport(0 0 w h);
ww = w;
wh = h;
}

void myinit() //初始化
{
int  i; //设置清屏颜色
glClearColor(0.0 0.0 0.0 1.0); //把所有的多边形标记为未定义的状态
for (i = 0; i {
polygons[i].used = FALSE;
polygons[i].end = FALSE;
polygons[i].isFill = FALSE;
polygons[i].nvertices = 0;
}
}


/*鼠标事件处理,功能有初始化成绘制模式,在新建多边形模式下存储点的坐标删除多边形,填充颜色,增加多边形的一个顶点*/
void myMouse(int btn int state int x int y)
{
int i j;
int a;

/*设置窗口打开后就能点击画图,不需要点击菜单开始绘图,start判断是否开始绘图。首先判断判断是否超出最大多边形数量,如果没有,就可以绘制*/
if (start)
{
moving = FALSE;
for (a = 0;a if (a == MAX_POLYGONS)
{
printf(“超出最多的多边形数!“);
exit(0);
}
polygons[a].color = present_color;
polygons[a].used = TRUE;
polygons[a].isFill = FALSE;
polygons[a].end = FALSE;
polygons[a].nvertices = 0;
in_polygon = a;
picking = FALSE;
start = FALSE;
}

y = wh - y;
if (btn == GLUT_LEFT_BUTTON && state == GLUT_UP && !picking && !moving && !pointMoving)
//增加顶点   

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-05-08 09:31  GTest2
     目录           0  2017-05-07 19:50  GTest2.git
     文件        2581  2017-05-07 19:50  GTest2.gitattributes
     文件        3997  2017-05-07 19:50  GTest2.gitignore
     文件         597  2017-05-07 19:50  GTest2.gitconfig
     文件          73  2017-05-07 19:50  GTest2.gitdescription
     文件          23  2017-05-07 19:50  GTest2.gitHEAD
     目录           0  2017-05-07 19:50  GTest2.githooks
     文件         177  2017-05-07 19:50  GTest2.githooksREADME.sample
     文件        1096  2017-05-07 19:50  GTest2.gitindex
     目录           0  2017-05-07 19:50  GTest2.gitinfo
     文件         113  2017-05-07 19:50  GTest2.gitinfoexclude
     目录           0  2017-05-07 19:50  GTest2.gitlogs
     文件         342  2017-05-07 19:50  GTest2.gitlogsHEAD
     目录           0  2017-05-07 19:50  GTest2.gitlogs
efs
     目录           0  2017-05-07 19:50  GTest2.gitlogs
efsheads
     文件         342  2017-05-07 19:50  GTest2.gitlogs
efsheadsmaster
     文件         150  2017-05-07 19:50  GTest2.gitms-persist.xml
     目录           0  2017-05-07 19:50  GTest2.gitobjects
     目录           0  2017-05-07 19:50  GTest2.gitobjectsd
     文件          89  2017-05-07 19:50  GTest2.gitobjectsd76fe4328089e5b63a9c4190badacfc35ef2624
     目录           0  2017-05-07 19:50  GTest2.gitobjects14
     文件         178  2017-05-07 19:50  GTest2.gitobjects148dee6faefcccee0cc6714a1e1f60cb5ce87e22
     目录           0  2017-05-07 19:50  GTest2.gitobjects15
     文件         296  2017-05-07 19:50  GTest2.gitobjects1516aba376093d36708bc1a3248e5b9397cd2471
     目录           0  2017-05-07 19:50  GTest2.gitobjects1c
     文件        1863  2017-05-07 19:50  GTest2.gitobjects1c9a181a44b4f9a105f0dc71a40ad0284ab6a7c4
     目录           0  2017-05-07 19:50  GTest2.gitobjects1f
     文件         751  2017-05-07 19:50  GTest2.gitobjects1ff0c423042b46cb1d617b81efb715defbe8054d
     目录           0  2017-05-07 19:50  GTest2.gitobjects7f
     文件         229  2017-05-07 19:50  GTest2.gitobjects7fd44d2fc500db7f387dde34abefe34c4a7026bf
............此处省略63个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)