多边形扫描转换和区域填充Word文档格式.docx
- 文档编号:20302427
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:13
- 大小:58.23KB
多边形扫描转换和区域填充Word文档格式.docx
《多边形扫描转换和区域填充Word文档格式.docx》由会员分享,可在线阅读,更多相关《多边形扫描转换和区域填充Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
floatxc,yc;
/*多边形的中心*/
intnvertices;
/*顶点的数目*/
intx[MAX_VERTICES];
//顶点
inty[MAX_VERTICES];
}polygon;
boolpicking=FALSE;
//如果处于拾取状态,则为TRUE
boolmoving=FALSE;
intlock;
////////////
intin_polygon=-1;
intpresent_color=0;
GLsizeiwh=500,ww=800;
//初始窗口大小
intdraw_mode=0;
GLfloatcolors[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}};
polygonpolygons[MAX_POLYGONS];
voidmyReshape(intw,inth)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,(GLdouble)w,0,(GLdouble)h);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,w,h);
ww=w;
wh=h;
}
voidmyinit()
inti;
//清屏颜色
glClearColor(1.0,1.0,1.0,1);
fstreamfile;
file.open("
save.txt"
ios_base:
:
in|ios_base:
out|ios_base:
app);
try{
for(i=0;
i<
MAX_POLYGONS;
i++){
file.read((char*)(&
polygons[i]),sizeof(polygons[i]));
}
}catch(exception*ex)
{//捕获exception*;
i++)
{
polygons[i].used=FALSE;
}
file.close();
voidsave(){
//添加写文件命令
out|ios:
binary);
for(i=0;
file.write((char*)(&
voidmyMouse(intbtn,intstate,intx,inty)
inti,j;
y=wh-y;
if(btn==GLUT_LEFT_BUTTON&
&
state==GLUT_DOWN&
!
picking&
moving)
{//增加顶点
moving=FALSE;
if(in_polygon>
=0){
if(polygons[in_polygon].nvertices>
=MAX_VERTICES)
{
printf("
超出了最大承受点数,最大承受点数为%d\n"
MAX_VERTICES);
exit(0);
}
i=polygons[in_polygon].nvertices;
polygons[in_polygon].x[i]=x;
polygons[in_polygon].y[i]=y;
polygons[in_polygon].nvertices++;
glutPostRedisplay();
{//删除多边形
picking=FALSE;
j=pick_polygon(x,y);
if(j>
=0)
polygons[j].used=FALSE;
in_polygon=-1;
glutPostRedisplay();
if(btn==GLUT_MIDDLE_BUTTON&
state==GLUT_DOWN){
polygons[in_polygon].xmax=polygons[in_polygon].xmin=polygons[in_polygon].x[0];
polygons[in_polygon].ymax=polygons[in_polygon].ymin=polygons[in_polygon].y[0];
polygons[in_polygon].xc=polygons[in_polygon].x[0];
polygons[in_polygon].yc=polygons[in_polygon].y[0];
for(i=1;
polygons[in_polygon].nvertices;
if(polygons[in_polygon].x[i]<
polygons[in_polygon].xmin)
polygons[in_polygon].xmin=polygons[in_polygon].x[i];
elseif(polygons[in_polygon].x[i]>
polygons[in_polygon].xmax)
polygons[in_polygon].xmax=polygons[in_polygon].x[i];
if(polygons[in_polygon].y[i]<
polygons[in_polygon].ymin)
polygons[in_polygon].ymin=polygons[in_polygon].y[i];
elseif(polygons[in_polygon].y[i]>
polygons[in_polygon].ymax)
polygons[in_polygon].ymax=polygons[in_polygon].y[i];
polygons[in_polygon].xc+=polygons[in_polygon].x[i];
polygons[in_polygon].yc+=polygons[in_polygon].y[i];
polygons[in_polygon].xc=polygons[in_polygon].xc/polygons[in_polygon].nvertices;
polygons[in_polygon].yc=polygons[in_polygon].yc/polygons[in_polygon].nvertices;
in_polygon=-1;
moving){
moving=false;
moving=true;
intj=pick_polygon(x,y);
lock=j;
intpick_polygon(intx,inty)
{//根据每个多边形的包围盒寻找第一个包含拾取位置的多边形
{
if(polygons[i].used)
if((x>
=polygons[i].xmin)&
(x<
=polygons[i].xmax)&
(y>
=polygons[i].ymin)&
(y<
polygons[i].ymax))
in_polygon=i;
moving=TRUE;
return(i);
printf("
notinapolygon\n"
);
return(-1);
voidmyMotion(intx,inty)
{//判断是否位于多边形内部
floatdx,dy;
if(moving)
y=wh-y;
if(j<
0)
printf("
return;
if(lock==j){
//如果位于多边形内部,则移动多边形
dx=x-polygons[j].xc;
dy=y-polygons[j].yc;
polygons[j].nvertices;
polygons[j].x[i]+=dx;
polygons[j].y[i]+=dy;
polygons[j].xc+=dx;
polygons[j].yc+=dy;
if(dx>
0)polygons[j].xmax+=dx;
elsepolygons[j].xmin+=dx;
if(dy>
0)polygons[j].ymax+=dy;
elsepolygons[j].ymin+=dy;
voidcolor_menu(intindex)
present_color=index;
if(in_polygon>
=0)polygons[in_polygon].color=index;
voidmain_menu(intindex){
switch(index)
case
(1):
//建立一个新的多边形
moving=FALSE;
for(i=0;
i++)if(polygons[i].used==FALSE)break;
if(i==MAX_POLYGONS)
exceeededmaximumnumberofpolygons\n"
polygons[i].color=present_color;
polygons[i].used=TRUE;
polygons[i].nvertices=0;
in_polygon=i;
picking=FALSE;
break;
case
(2):
//结束多边形的定义并计算多边形包围盒和它的中心位置
if(in_polygon>
polygons[in_polygon].xmax=polygons[in_polygon].xmin=polygons[in_polygon].x[0];
polygons[in_polygon].ymax=polygons[in_polygon].ymin=polygons[in_polygon].y[0];
polygons[in_polygon].xc=polygons[in_polygon].x[0];
polygons[in_polygon].yc=polygons[in_polygon].y[0];
for(i=1;
{
if(polygons[in_polygon].x[i]<
polygons[in_polygon].xmin=polygons[in_polygon].x[i];
elseif(polygons[in_polygon].x[i]>
polygons[in_polygon].xmax=polygons[in_polygon].x[i];
if(polygons[in_polygon].y[i]<
polygons[in_polygon].ymin=polygons[in_polygon].y[i];
elseif(polygons[in_polygon].y[i]>
polygons[in_polygon].ymax=polygons[in_polygon].y[i];
polygons[in_polygon].xc+=polygons[in_polygon].x[i];
polygons[in_polygon].yc+=polygons[in_polygon].y[i];
}
polygons[in_polygon].xc=polygons[in_polygon].xc/polygons[in_polygon].nvertices;
polygons[in_polygon].yc=polygons[in_polygon].yc/polygons[in_polygon].nvertices;
case(3):
//设置拾取模式
picking=TRUE;
case(4):
//设置移动模式
moving=TRUE;
case(5):
//退出
exit(0);
case(6):
//保存
save();
voidmyDisplay()
{//显示所有的活动多边形
glClear(GL_COLOR_BUFFER_BIT);
glColor3fv(colors[polygons[i].color]);
glBegin(GL_POLYGON);
for(j=0;
j<
polygons[i].nvertices;
j++)
glVertex2i(polygons[i].x[j],polygons[i].y[j]);
glEnd();
/*printf("
%d\n"
in_polygon);
intk=in_polygon;
glColor3fv(colors[polygons[k].color]);
glBegin(GL_LINE_STRIP);
ints;
for(s=0;
s<
polygons[k].nvertices;
s++){
haha%d\n"
s);
glVertex2i(polygons[k].x[s],polygons[k].y[s]);
glEnd();
}*/
glFlush();
voidmain(intargc,char**argv)
{
intc_menu;
glutInit(&
argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutCreateWindow("
polygonmodeler"
glutDisplayFunc(myDisplay);
myinit();
c_menu=glutCreateMenu(color_menu);
glutAddMenuEntry("
Black"
0);
Red"
1);
Green"
2);
Blue"
3);
Cyan"
4);
Magenta"
5);
Yellow"
6);
White"
7);
glutCreateMenu(main_menu);
newpolygon"
endpolygon"
deletepolygon"
movepolygon"
quit"
save"
glutAddSubMenu("
Colors"
c_menu);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutReshapeFunc(myReshape);
glutMouseFunc(myMouse);
glutMotionFunc(myMotion);
glutMainLoop();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多边形 扫描 转换 区域 填充