用鼠标实现橡皮筋技术画多边形改进.docx
- 文档编号:10883315
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:10
- 大小:90.12KB
用鼠标实现橡皮筋技术画多边形改进.docx
《用鼠标实现橡皮筋技术画多边形改进.docx》由会员分享,可在线阅读,更多相关《用鼠标实现橡皮筋技术画多边形改进.docx(10页珍藏版)》请在冰豆网上搜索。
用鼠标实现橡皮筋技术画多边形改进
实验五用鼠标实现橡皮筋技术
一、参照课本P63的例子,编程绘制一个正五边形。
要求:
1图形中心坐标和外接圆半径由鼠标指定。
2用鼠标实现橡皮筋技术。
3五边形的其中一个顶点固定在x轴的某一点上。
(即五边形的旋转方向不变)
二、程序代码
#include"windows.h"
#include
#definePI3.14
intiPointNum=0;
#include"math.h"//已确定点的数目
intx[5],y[5],x,y;
//x[0]=0;y[0]=0;x[1]=0;y[1]=0;
//intx1=0,x2=0,y1=0,y2=0;//确定的点坐标
intwinWidth=400,winHeight=300;//窗口的宽度和高度
voidInitial(void)
{
glClearColor(1.0f,1.0f,1.0f,1.0f);
}
voidChangeSize(intw,inth)
{
winWidth=w;winHeight=h;
glViewport(0,0,w,h);//指定窗口显示区域
glMatrixMode(GL_PROJECTION);//设置投影参数
glLoadIdentity();
gluOrtho2D(0.0,winWidth,0.0,winHeight);
}
voidDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
if(iPointNum>=1){
y[0]=(x[0]-xc)*tan(0.1*PI)+yc;
floatr=sqrt((x[0]-x)*(x[0]-x)+(y[0]-y)(y[0]-y));
//floatl=2*r*sin(0.2*PI);
//floatradian=0.2*PI-atan((y[0]-y)/(x[0]-x))
x[4]=x-r*sin(0.3*PI-radian);
y[4]=y-r*cos(0.3*PI-radian);
x[1]=2*l*cos(PI/5)*cos(radian+PI*0.2)+x[4];
y[1]=2*l*cos(PI/5)*sin(radian+PI*0.2)+y[4];
x[2]=2*l*cos(PI/5)*cos(radian+PI*0.4)+x[4];
y[2]=2*l*cos(PI/5)*sin(radian+PI*0.4)+y[4];
x[3]=2*l*cos(radian+PI*0.8)+x[4];
y[3]=2*l*sin(radian+PI*0.8)+y[4];
glBegin(GL_LINE_LOOP);//绘制直线段
for(intj=0;j<5;j++){
glVertex2i(x[j],y[j]);
}
glEnd();
}
glutSwapBuffers();//交换缓冲区
}
voidMousePlot(GLintbutton,GLintaction,GLintxMouse,GLintyMouse)
{
if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN){
if(iPointNum==0||iPointNum==2){
iPointNum=1;
x=xMouse;y=winHeight-yMouse;
}
else{
iPointNum=2;
x[0]=xMouse;//y[0]=winHeight-yMouse;
glutPostRedisplay();//指定窗口重新绘制
}
}
if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN){
iPointNum=0;
glutPostRedisplay();
}
}
voidPassiveMouseMove(GLintxMouse,GLintyMouse)
{
if(iPointNum==1){
x[0]=xMouse;
y[0]=winHeight-yMouse;
glutPostRedisplay();
}
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//使用双缓存及RGB模型
glutInitWindowSize(400,300);
glutInitWindowPosition(100,100);
glutCreateWindow("橡皮筋技术");
glutDisplayFunc(Display);
glutReshapeFunc(ChangeSize);//指定窗口在整形回调函数
glutMouseFunc(MousePlot);//指定鼠标响应函数
glutPassiveMotionFunc(PassiveMouseMove);//指定鼠标移动响应函数
Initial();
glutMainLoop();
return0;
}
三、程序结果
#include"windows.h"
#include
#definePI3.14
intiPointNum=0;
#include"math.h"//已确定点的数目
intx[5],y[5],xc,yc;
//x[0]=0;y[0]=0;x[1]=0;y[1]=0;
//intx1=0,x2=0,y1=0,y2=0;//确定的点坐标
intwinWidth=400,winHeight=300;//窗口的宽度和高度
voidInitial(void)
{
glClearColor(1.0f,1.0f,1.0f,1.0f);
}
voidChangeSize(intw,inth)
{
winWidth=w;winHeight=h;
glViewport(0,0,w,h);//指定窗口显示区域
glMatrixMode(GL_PROJECTION);//设置投影参数
glLoadIdentity();
gluOrtho2D(0.0,winWidth,0.0,winHeight);
}
voidDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
if(iPointNum>=1){
/*
floatradion=asin(y[1]/l);
floatl=sqrt((x[0]-x[1])*(x[0]-x[1])+(y[0]-y[1])*(y[0]-y[1]));
x[2]=2*l*cos(PI/5)*cos(radion+PI*0.2)+x[0];
y[2]=2*l*cos(PI/5)*sin(radion+PI*0.2);
x[3]=2*l*cos(PI/5)*cos(radion+PI*0.4)+x[0];
y[3]=2*l*cos(PI/5)*sin(radion+PI*0.4);
x[4]=2*l*cos(radion+PI*0.8)+x[0];
y[4]=2*l*sin(radion+PI*0.8);
*/
floatr=sqrt((x[0]-xc)*(x[0]-xc)+(y[0]-yc)(y[0]-yc));
floatl=2*r*sin(0.2*PI);
floatradian;
if(x[0]!
=xc){
radian=*atan((y[0]-y)/(x[0]-x))-0.3*PI;
}
elseif(x[0]==xc&&y[0] radian=0.3*PI; } else{ radian=1.2*PI; } x[1]=xc+r*cos(0.1*PI+radian); y[1]=yc+r*cos(0.1*PI+radian); x[2]=xc+r*cos(0.1*PI+radian); y[2]=yc+r*sin(0.1*PI+radian); x[3]=xc-r*sin(radian); y[3]=yc+r*cos(radian); x[4]=xc-r*cos(radian); y[4]=yc+r*sin(radian); glBegin(GL_LINE_LOOP);//绘制直线段 for(intj=0;j<5;j++){ glVertex2i(x[j],y[j]); } glEnd(); } glutSwapBuffers();//交换缓冲区 } voidMousePlot(GLintbutton,GLintaction,GLintxMouse,GLintyMouse) { if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN){ if(iPointNum==0||iPointNum==2){ iPointNum=1; xc=xMouse;yc=winHeight-yMouse; } else{ iPointNum=2; x[0]=xMouse;y[0]=winHeight-yMouse; glutPostRedisplay();//指定窗口重新绘制 } } if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN){ iPointNum=0; glutPostRedisplay(); } } voidPassiveMouseMove(GLintxMouse,GLintyMouse) { if(iPointNum==1){ x[0]=xMouse; y[0]=winHeight-yMouse; glutPostRedisplay(); } } intmain(intargc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//使用双缓存及RGB模型 glutInitWindowSize(400,300); glutInitWindowPosition(100,100); glutCreateWindow("橡皮筋技术"); glutDisplayFunc(Display); glutReshapeFunc(ChangeSize);//指定窗口在整形回调函数 glutMouseFunc(MousePlot);//指定鼠标响应函数 glutPassiveMotionFunc(PassiveMouseMove);//指定鼠标移动响应函数 Initial(); glutMainLoop(); return0; } 四、思考题 参照课本P63的例子,编程绘制一个正五边形。 要求: 1图形中心坐标和外接圆半径由鼠标指定。 2用鼠标实现橡皮筋技术。 3可用鼠标调整五边形的顶点从而调整五边形的方向。 但是不要求精确调整。 如图所示: 提示: 在题目一的基础上,在x的位置方程中添加初始角θ,θ由鼠标的位置确定: tgθ=(y2-yc)/(x2-xc)θ=atan((y2-yc)/(x2-xc))(x2,y2分别是鼠标第二点的坐标值) 注意: x2不能等于xc,否则tgθ的分母为0会导致程序出错。 所以要在求tgθ之前判断(x2-xc)是否为0,如果是则让θ=PI/2或-PI/2 (二)、程序代码 (三)、程序结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 鼠标 实现 橡皮筋 技术 多边形 改进
![提示](https://static.bdocx.com/images/bang_tan.gif)