18-01-2016, 04:32 PM
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<GL/glut.h>
int sub_menu1;
int sub_menu2;
float theta1=0;
int flag=2;
void idlefunc()
{
theta1=theta1+1;
if(theta1>360) theta1=0;
glutPostRedisplay();
}
void mytimer(int v)
{
idlefunc();
glutTimerFunc(100,mytimer,60);
glutPostRedisplay();
}
void circle(int x,int y,int a,int b,int c)
{
float rtheta,theta,r=150;
glBegin(GL_POLYGON);
for(theta=0;theta<360;theta++)
{
rtheta=theta*3.142/180;
glColor3f(a,b,c);
glVertex3f(x+r*cos(rtheta),y+r*sin(rtheta),0);
}
glEnd();
}
void righteye(int x,int y)
{
GLfloat thr,x1,x2,y1,y2;
int i;
glColor3f(1,0,0);
glBegin(GL_QUAD_STRIP);
for(i=0;i<=196;i++)
{
thr=3.142*i/6.0;
x1=5*cos(thr);
y1=5*sin(thr);
x2=10*cos(thr);
y2=10*sin(thr);
glVertex3f(x1+x+45,y1+y+45,0);
glVertex3f(x2+x+45,y2+y+45,0);
}
glEnd();
}
void lefteye(int x,int y)
{
GLfloat thr,x1,x2,y1,y2;
int i;
glColor3f(1,0,0);
glBegin(GL_QUAD_STRIP);
for(i=0;i<=196;i++)
{
thr=3.142*i/6;
x1=5*cos(thr);
y1=5*sin(thr);
x2=10*cos(thr);
y2=10*sin(thr);
glVertex3f(x1+x-45,y1+y+45,0);
glVertex3f(x2+x-45,y2+y+45,0);
}
glEnd();
}
void smile(int x,int y)
{
float rtheta,theta,r=90;
do
{
glBegin(GL_POINTS);
for(theta=225;theta<315;theta++)
{
rtheta=theta*3.142/180;
glColor3f(0,0,0);
glVertex3f(x+r*cos(rtheta),y+r*sin(rtheta),0);
}
glEnd();
r=r+0.5;
}while(r<92);
}
void sad(int x,int y)
{
float rtheta,theta,r=90;
do
{
glBegin(GL_POINTS);
for(theta=45;theta<135;theta++)
{
rtheta=theta*3.142/180;
glColor3f(0,0,0);
glVertex3f(x+r*cos(rtheta),y-150+r*sin(rtheta),0);
}
glEnd();
r=r+0.5;
}while(r<92);
}
void nose(int x,int y)
{
glColor3f(0,0,0);
glBegin(GL_LINES);
glVertex3f(x,y+30,0);
glVertex3f(x,y-45,0);
glEnd();
glFlush();
}
void sample(int a,int b,int c)
{
circle(0,0,a,b,c);
righteye(0,0);
lefteye(0,0);
smile(0,0);
nose(0,0);
glFlush();
}
void sample1(int a,int b,int c)
{
circle(0,0,a,b,c);
righteye(0,0);
lefteye(0,0);
sad(0,0);
nose(0,0);
glFlush();
}
void smenu1_func(int n)
{
switch(n)
{
case 1:flag=0;
break;
case 2:flag=1;
break;
case 3:flag=2;
break;
}
glutPostRedisplay();
}
void smenu2_func(int n)
{
switch(n)
{
case 4:flag=3;
break;
case 5:flag=4;
break;
case 6:flag=5;
break;
}
glutPostRedisplay();
}
void menu_func(int n)
{
if(n==13)
exit(0);
}
void myinit()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-250,250,-250,250,-250,250);
glMatrixMode(GL_MODELVIEW);
glClearColor(0,0,0,0);
}
void display()
{
int i;
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(0,0,0,0);
char s1[]="right click on the window for menu";
char s2[]="the above graphics is used in mobile applications";
glColor3f(1,1,1);
glRasterPos2i(-200,200);
for(i=0;i<strlen(s1);i++)
glutBitmapCharacter(GLUT_BITMAP_8_BY_13,s1[i]);
glRasterPos2i(-200,-200);
for(i=0;i<strlen(s2);i++)
glutBitmapCharacter(GLUT_BITMAP_8_BY_13,s2[i]);
glLoadIdentity();
glRotatef(theta1,0,1,0);
if(flag==0)
{
sample(0,1,0);
}
if(flag==1)
{
sample(0,0,1);
}
if(flag==2)
{
sample(1,1,0);
}
if(flag==3)
{
sample1(0,1,1);
}
if(flag==4)
{
sample1(1,0 ,1);
}
if(flag==5)
{
sample1(1,1,1);
}
glFlush();
glutSwapBuffers();
}
int main(int argc,char*argv)
{
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
glutInitWindowPosition(100,100);
glutInitWindowSize(500,500);
glutInit(&argc,argv);
glutCreateWindow("smiley");
myinit();
glutDisplayFunc(display);
sub_menu1=glutCreateMenu(smenu1_func);
glutAddMenuEntry("green",1);
glutAddMenuEntry("blue",2);
glutAddMenuEntry("yellow",3);
sub_menu2=glutCreateMenu(smenu2_func);
glutAddMenuEntry("cyan",4);
glutAddMenuEntry("magenta",5);
glutAddMenuEntry("white",6);
glutCreateMenu(menu_func);
glutAddSubMenu("smile",sub_menu1);
glutAddSubMenu("sad",sub_menu2);
glutAddMenuEntry("quit",13);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutIdleFunc(idlefunc);
glEnable(GL_DEPTH_TEST);
glutTimerFunc(100,mytimer,60);
glutMainLoop();
return 0;
}