折线实现,我这边只实现了两端,可以根据我的代码往下扩展,废话不说,上代码
#include<windows.h>
#include<GL/glut.h>
int iPointNum = 0;
int x1=0,x2=0,y1=0,y2=0; //点坐标
int x11=0,x22=0,y11=0,y22=0;
int x=0,y=0,xx=0,yy=0;
int winWidth = 400, winHeight = 300; //窗口高度宽度
int choose=0; //菜单选择
int flag=0,flag1=0;
void Initial(void){
glClearColor(1.0f,1.0f,1.0f,1.0f); //窗口背景
}
void ChangeSize(int w,int h){
winWidth = w; winHeight = h; //保存当前窗口大小
glViewport(0,0,w,h); //指定窗口显示区域
glMatrixMode(GL_PROJECTION); //投影参数
glLoadIdentity(); //调用单位矩阵,去掉以前设置的投影参数
gluOrtho2D(0.0,winWidth,0.0,winHeight); //设置投影参数
}
void DisplayLine(){
}
void Display(void){
glClear(GL_COLOR_BUFFER_BIT); //背景填充色
glColor3f(1.0f,0.0f,0.0f); //绘图颜色
if(choose == 2){
if(iPointNum >= 1){
glBegin(GL_QUADS); //矩形
glVertex2i(x1,y1);
glVertex2i(x11,y11);
glVertex2i(x2,y2);
glVertex2i(x22,y22);
glEnd();
}
}else if(choose == 1){
if(iPointNum >= 1){
if(flag1 == 0){
glBegin(GL_LINES); //直线
glVertex2i(x1,y1);
glVertex2i(x2,y2);
glEnd();
}else{
glBegin(GL_LINES); //直线
glVertex2i(xx,yy);
glVertex2i(x,y);
glEnd();
glBegin(GL_LINES); //直线
glVertex2i(x1,y1);
glVertex2i(x2,y2);
glEnd();
}
}
}
glutSwapBuffers(); //交换缓冲区
}
void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse){
if(choose == 1){
if(flag == 0){ //确定起直线
if(button == GLUT_LEFT_BUTTON && action == GLUT_DOWN){//鼠标左键被按下
if(iPointNum == 0|| iPointNum == 2){
iPointNum = 1;
x1 = xMouse;
y1 = winHeight - yMouse;
xx=x1;
yy=y1;
}else{ //鼠标第二次被按下
iPointNum = 2;
flag=1;
x2 = xMouse;
y2 = winHeight - yMouse;
x=x2;
y=y2;
glutPostRedisplay(); //重新指定窗口绘制
}
}
}else{ //起始点已经确定,终止点是鼠标按下去的点
flag1 = 1;
if(iPointNum == 2){
iPointNum = 1;
x1 = x2;
y1 = y2;
}else if((button == GLUT_LEFT_BUTTON && action == GLUT_DOWN)&&(iPointNum == 1)){
iPointNum = 2;
x2 = xMouse;
y2 = winHeight - yMouse;
flag=0;
glutPostRedisplay(); //重新指定窗口绘制
}
}
}else if(choose == 2){
if(button == GLUT_LEFT_BUTTON && action == GLUT_DOWN){
if(iPointNum == 0|| iPointNum == 2){
iPointNum = 1;
x1 = xMouse;
y1 = winHeight - yMouse;
}else{
iPointNum = 2;
x2 = xMouse;
y2 = winHeight - yMouse;
x11 = x1;
y11 = y2;
x22 = x2;
y22 = y1;
glutPostRedisplay(); //重新指定窗口绘制
}
}
}
if(button == GLUT_RIGHT_BUTTON && action == GLUT_DOWN){
iPointNum = 0;
flag1 = 0;
flag = 0;
glutPostRedisplay();
}
}
void PassiveMouseMove(GLint xMouse,GLint yMouse){
if((iPointNum == 1)&&(choose == 2)){
x2 = xMouse;
y2 = winHeight-yMouse; //当前鼠标点作为末端点
x11 = x1;
y11 = y2;
x22 = x2;
y22 = y1;
glutPostRedisplay();
}else if((iPointNum == 1)&&(choose == 1)){
x2 = xMouse;
y2 = winHeight-yMouse;
glutPostRedisplay();
}
}
void ProcessMenu(int value){
switch(value){
case 1:
choose = 1;
break;
case 2:
choose = 2;
break;
}
}
int main(int argc,char *argv[]){
glutInit(&argc,argv); // 使用GLUT库首先需要进行初始化,对命令行的参数处理
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);// 设置窗口的显示模式,包括缓存和颜色模型
glutInitWindowSize(400,300); // (宽,高)窗口的大小
glutInitWindowPosition(100,100); // (距离屏幕左边界,距离屏幕上边界)窗口的位置
glutCreateWindow("hrr20161008045菜单");
glutDisplayFunc(Display); // 要显示的内容放到了Display()函数里面,Dis里面的
glutReshapeFunc(ChangeSize); //内容都会被刷新回调
glutMouseFunc(MousePlot); //鼠标响应函数
glutPassiveMotionFunc(PassiveMouseMove);//鼠标移动响应函数
glutCreateMenu(ProcessMenu);
glutAddMenuEntry("橡皮筋折线",1);
glutAddMenuEntry("橡皮筋矩形",2);
glutAttachMenu(GLUT_RIGHT_BUTTON);
Initial();
glutMainLoop(); // 需要调用该函数才能显示在屏幕上
return 0;
}