Práctiica 2: Ejercicio 3


#include<stdlib.h>
#include<math.h>
#include<stdio.h>
#include<windows.h>
#include <GL/glut.h>

GLsizei wh = 600, ww = 800,wx,wy, wx1=800, wy1=600;

char* image;

int count=0;
int sub_menu;

int draw;
int i,j,k;
float a[100][2], b[100][2];
int m, n;
int pol;
int flag=0, flag1;
int fill=0;
float textx,texty, textz=0.0;
float a1=0, a2=0, a3=0, b1=0, b2=0, b3=0;
int size=1;

int save=0;


float posx, posy;
void *currentfont;

FILE *fptr;
char fname[20];
int s=0;
int wel=0;


void drawstring(float x,float y,float z,char *string)
{
char *c;
glRasterPos3f(x,y,z);

for(c=string;*c!='\0';c++)
{
glutBitmapCharacter(currentfont,*c);
}
}



void setFont(void *font)
{
currentfont=font;
}




void drawpoint(int x, int y)
{
y=wh-y;

if(x>wh/10+1 && wh/10<y && y<wh-31)
{
glPointSize(size);
glBegin(GL_POINTS);
glVertex2f(x, y);

glEnd();

glFlush();
}
}




void paint(int x, int y)
{
y=wh-y;



if(x>wh/10+1 && wh/10<y && y<wh-31)
{
glBegin(GL_POLYGON);
glVertex2f(x, y);
glVertex2f(x+4+size, y);
glVertex2f(x+4+size, y+4+size);
    glVertex2f(x, y+4+size);
glEnd();
glFlush();
}

}






void reset()
{
a1=0;
a2=0;
b1=0;
b2=0;
a3=0;
b3=0;
}



void palette(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4)
{
glBegin(GL_QUADS);
glVertex2f(x1, y1);
glVertex2f(x2, y2);
glVertex2f(x3, y3);
glVertex2f(x4, y4);
glEnd();
}



void draw_pixel(GLfloat x, GLfloat y)
{
if(x>wh/10+1 && wh/10<y && y<wh-31)
{
if(fill==1)
glPointSize(3);
else
glPointSize(size);
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
}



void plotpixels(GLfloat p, GLfloat q, GLfloat x, GLfloat y)
{
draw_pixel(x+p, y+q);
draw_pixel(-x+p, y+q);
draw_pixel(x+p, -y+q);
draw_pixel(-x+p, -y+q);


draw_pixel(y+p, x+q);
draw_pixel(-y+p, x+q);
draw_pixel(y+p, -x+q);
draw_pixel(-y+p, -x+q);
}


void draw_circle(GLfloat p, GLfloat q, GLfloat r)
{
GLfloat d=1-r, x=0, y=r;

while(y>x)
{
plotpixels(p, q, x, y);
if(d<0) d+=2*x+3;
else
{
d+=2*(x-y)+5;
--y;
}
++x;
}
plotpixels(p, q, x, y);
}


void draw_pixel1(GLfloat x, GLfloat y)
{

glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();

}

void plotpixels1(GLfloat p, GLfloat q, GLfloat x, GLfloat y)
{
draw_pixel1(x+p, y+q);
draw_pixel1(-x+p, y+q);
draw_pixel1(x+p, -y+q);
draw_pixel1(-x+p, -y+q);


draw_pixel1(y+p, x+q);
draw_pixel1(-y+p, x+q);
draw_pixel1(y+p, -x+q);
draw_pixel1(-y+p, -x+q);
}

void draw_circle1(GLfloat p, GLfloat q, GLfloat r)
{
GLint d=1-r, x=0, y=r;

while(y>x)
{
plotpixels1(p, q, x, y);
if(d<0) d+=2*x+3;
else
{
d+=2*(x-y)+5;
--y;
}
++x;
}
plotpixels1(p, q, x, y);
}




void edgedetect(float x1, float y1, float x2, float y2, int *le, int *re)
{
float mx, x, temp;

if((y2-y1)<0)
{
temp=y1;
y1=y2;
y2=temp;

temp=x1;
x1=x2;
x2=temp;
}

if((y2-y1)!=0)
mx=(x2-x1)/(y2-y1);
else
mx=x2-x1;

x=x1;

for(i=y1;i<=y2;i++)
{
if(x<(float)le[i])
le[i]=(int)x;
if(x>(float)re[i])
re[i]=(int)x;
x+=mx;
}
}



void scanfill(GLint num1, GLint num2)
{
int le[1000], re[1000];
int p, q;
int bottom, top;

for(p=0;p<wh;p++)
{
le[p]=ww;
re[p]=0;
}

for(p=num1;p<num2;p++)
{
edgedetect(a[p][0], a[p][1], a[p+1][0], a[p+1][1], le, re);
}

edgedetect(a[num2][0], a[num2][1], a[num1][0], a[num1][1], le, re);

for(q=0;q<wh;q++)
le[q]=le[q]+1;

bottom=0;
while(re[bottom]<le[bottom])
bottom++;

bottom++;

top=wh-1;
while(re[top]<le[top])
top--;


for(q=bottom;q<top;q++)
{
if(le[q]<=re[q])
{
for(p=(int)le[q];p<(int)re[q];p++)
draw_pixel(p, q);
}
}
}


void detect_point(GLint num1, GLint num2, int x, int y)
{
int le[1000], re[1000];
int p, q;

for(p=0;p<wh;p++)
{
le[p]=ww;
re[p]=0;
}

for(p=num1;p<num2;p++)
{
edgedetect(a[p][0], a[p][1], a[p+1][0], a[p+1][1], le, re);
}

edgedetect(a[num2][0], a[num2][1], a[num1][0], a[num1][1], le, re);

for(q=0;q<wh;q++)
{
if(le[q]<=re[q])
{
for(p=(int)le[q];p<(int)re[q];p++)
{
if(x==p && y==q)
flag=num1;
}
}
}
}



void display(void)
{

glClearColor (1.0, 1.0, 1.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);




if(wel==0 || wel==1)
{




glClearColor (0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);


setFont(GLUT_BITMAP_HELVETICA_18);
glColor3f(0, 1, 1);
drawstring(22*wh/45, 42*wh/45 , 0.0, "Proyecto Mano alzada");

drawstring(8*wh/45, 40*wh/45, 0.0, "EDITOR GRAFICO");



setFont(GLUT_BITMAP_HELVETICA_12);

drawstring(25*wh/45, 32*wh/45, 0.0, "POR:");
drawstring(8*wh/45, 29*wh/45, 0.0, "Uriel Hernandez Gonzalez, Josue Hernandez Atonal");
drawstring(8*wh/45, 27*wh/45, 0.0, "123456");






drawstring(5*wh/45, 17*wh/45, 0.0, "");
drawstring(5*wh/45, 15*wh/45, 0.0, "Graficacion");
drawstring(5*wh/45, 13*wh/45, 0.0, "UAEMex Facultad de Ingenieria");



wel=1;

glFlush();
glClearColor (1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);


}


if(wel==2)
{

count++;

if(count>1)
{

if(ww!=0 && wh!=0)
{ wx=wx1;
wy=wy1;

wx1=ww;
wy1=wh;
}

glDrawBuffer(GL_FRONT);
glRasterPos2f(posx, posy);
glDrawPixels(wx-wy/10-2, wy-wy/10-wy/20-1, GL_RGB, GL_UNSIGNED_BYTE, image);
   }




   glColor3f(0.85, 0.85, 0.85);
glPointSize(1);
glLineWidth(1);
glRectf(0,wh/10+1,wh/10,wh-(wh/20)-1);

glRectf(0, 0, ww, wh/10);

glRectf(0,wh-(wh/20), ww, wh);


glColor3f(0.5, 0.5, 0.5);
glBegin(GL_LINES);
glVertex2f(wh/10, wh/10+2);
glVertex2f(wh/10, wh-(wh/20)+2);
glVertex2f(wh/10+1, wh/10+2);
glVertex2f(wh/10+1, wh-(wh/20)+2);
glEnd();

glColor3f(0.5, 0.5, 0.5);
glBegin(GL_LINES);
glVertex2f(wh/10+1, wh-(wh/20));
glVertex2f(ww, wh-(wh/20));
glVertex2f(wh/10+1, wh-(wh/20)+1);
glVertex2f(ww, wh-(wh/20)+1);
glEnd();



glColor3f(0, 0, 0);
palette(6*wh/60+1, wh/60, 6*wh/60+1, wh/20-1, 8*wh/60-1, wh/20-1, 8*wh/60-1, wh/60);

glColor3f(1, 1, 1);
palette(6*wh/60+1, wh/20+1, 6*wh/60+1, wh/12, 8*wh/60-1, wh/12, 8*wh/60-1, wh/20+1);


glColor3f(0, 0, 1);
palette(8*wh/60+1, wh/60, 8*wh/60+1, wh/20-1, 10*wh/60-1, wh/20-1, 10*wh/60-1, wh/60);


glColor3f(1, 0, 1);
palette(8*wh/60+1, wh/20+1, 8*wh/60+1, wh/12, 10*wh/60-1, wh/12, 10*wh/60-1, wh/20+1);

glColor3f(1, 1, 0);
palette(10*wh/60+1, wh/60, 10*wh/60+1, wh/20-1, 12*wh/60-1, wh/20-1, 12*wh/60-1, wh/60);





glColor3f(0, 0, 0);




glBegin(GL_TRIANGLES);                        
glVertex2f(3*wh/120-1, 18.10*wh/20);
glVertex2f(wh/60+2, 18.3*wh/20);
glVertex2f(2*wh/60-4, 18.3*wh/20);
glEnd();

glBegin(GL_LINE_LOOP);
glVertex2f(wh/60+2, 18.3*wh/20);
glVertex2f(wh/60+2, 18.8*wh/20);
glVertex2f(2*wh/60-4, 18.8*wh/20);
glVertex2f(2*wh/60-4, 18.3*wh/20);
glEnd();



glPointSize(1);
}
}







void myMouse(int btn, int state, int x, int y)
{
GLfloat r, r1, r2;
int num1=0, num2=0;

int [i1, i2];
int flag2;

flag2=0;


if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
{
/*Seleccionar color*/


if(wel==1)
{
wel=2;
display();
}


if(6*wh/60<x && x<8*wh/60 && wh/60<wh-y && wh-y<wh/20)
glColor3f(0, 0, 0);


else if(6*wh/60<x && x<8*wh/60 && wh/20<wh-y && wh-y<wh/12)
glColor3f(1, 1, 1);


else if(8*wh/60<x && x<10*wh/60 && wh/60<wh-y && wh-y<wh/20)
        glColor3f(0, 0, 1);


else if(8*wh/60<x && x<10*wh/60 && wh/20<wh-y && wh-y<wh/12)
    glColor3f(1, 0, 1);


else if(10*wh/60<x && x<12*wh/60 && wh/60<wh-y && wh-y<wh/20)
    glColor3f(1, 1, 0);


else if(10*wh/60<x && x<12*wh/60 && wh/20<wh-y && wh-y<wh/12)
    glColor3f(1, 0, 0);


else if(12*wh/60<x && x<14*wh/60 && wh/60<wh-y && wh-y<wh/20)
glColor3f(0, 1, 0);


else if(12*wh/60<x && x<14*wh/60 && wh/20<wh-y && wh-y<wh/12)
    glColor3f(0, 1, 1);


else if(14*wh/60<x && x<16*wh/60 && wh/60<wh-y && wh-y<wh/20)
glColor3f(0.5, 0.5, 0);

else if(14*wh/60<x && x<16*wh/60 && wh/20<wh-y && wh-y<wh/12)
glColor3f(0.1, 0.4, 0.6);

else if(16*wh/60<x && x<18*wh/60 && wh/60<wh-y && wh-y<wh/20)
glColor3f(0.4, 0.1, 0.1);

else if(16*wh/60<x && x<18*wh/60 && wh/20<wh-y && wh-y<wh/12)
glColor3f(0.9, 0.1, 0.5);


else if(18*wh/60<x && x<20*wh/60 && wh/60<wh-y && wh-y<wh/20)
glColor3f(0.5, 0.1, 0.5);

else if(18*wh/60<x && x<20*wh/60 && wh/20<wh-y && wh-y<wh/12)
glColor3f(0.3, 0.1, 0.5);

else if(20*wh/60<x && x<22*wh/60 && wh/60<wh-y && wh-y<wh/20)
glColor3f(0.0, 0.5, 0.1);

else if(20*wh/60<x && x<22*wh/60 && wh/20<wh-y && wh-y<wh/12)
glColor3f(0.9, 0.8, 0.0);


else if(22*wh/60<x && x<24*wh/60 && wh/60<wh-y && wh-y<wh/20)
glColor3f(0.7, 0.0, 0.0);


else if(22*wh/60<x && x<24*wh/60 && wh/20<wh-y && wh-y<wh/12)
glColor3f(0.5, 0.5, 0.5);


           

if(2<x && x<wh/20 && 18*wh/20<wh-y && wh-y<wh-(wh/20)-1)                  
draw=1;

if(draw==1)         /* to draw using a  PENCIL  */
{
if(pol==1)
{
m++;
a[m][0]='$';
a[m][1]='$';

pol=0;
}

if(x>wh/10+1 && wh/10<wh-y && wh-y<wh-31)
glutMotionFunc(drawpoint);

}



palette(wh/30, 2*wh/30, 2*wh/30, 2*wh/30, 2*wh/30, wh/30, wh/30, wh/30);  /* to display SELECTED COLOUR */

glFlush();


glReadBuffer(GL_FRONT);


glReadPixels(wh/10+2, wh/10, ww-wh/10-2, wh-wh/10-wh/20-1,GL_RGB, GL_UNSIGNED_BYTE, image);

posx=wh/10+2;
posy=wh/10;



  }

if(btn==GLUT_LEFT_BUTTON && state==GLUT_UP)
{
glReadBuffer(GL_FRONT);


glReadPixels(wh/10+2, wh/10, ww-wh/10-2, wh-wh/10-wh/20-1,GL_RGB, GL_UNSIGNED_BYTE, image);

posx=wh/10+2;
posy=wh/10;
}

}




void myReshape(GLsizei w, GLsizei h)
{


    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0);

glMatrixMode(GL_MODELVIEW);

glViewport(0,0,w,h);

    glFlush();


ww = w;
    wh = h;


glutPostRedisplay();




}


void point_size(int id)
{




switch(id)
{
case 1:size++;
break;

case 2:if(size>1)
size--;
break;
}



}


void right(int id) /* to QUIT the editor */
{

if(id==2){
            /* change background color*/

}else if(id == 3){
   exit(0);
}

}




int main(int argc, char **argv)
{

image = malloc(3*1450*900*sizeof(char));


a[0][0]='$';
a[0][1]='$';
m=0;

b[0][0]='$';
b[0][1]='$';
n=0;


glutInit(&argc,argv);
    glutInitDisplayMode (GLUT_SINGLE| GLUT_RGB);

glutInitWindowSize(ww,wh);
glutInitWindowPosition(100, 100);
glutCreateWindow("Editor gráfico");

     /* MENU */
sub_menu=glutCreateMenu(point_size);
glutAddMenuEntry("Incrementar", 1);
glutAddMenuEntry("Decrementar", 2);



glutCreateMenu(right);
glutAddSubMenu("Tamaño de lapiz", sub_menu);
glutAddMenuEntry("Cambiar fondo",2);
glutAddMenuEntry("Salir",3);

glutAttachMenu(GLUT_RIGHT_BUTTON);


glutReshapeFunc(myReshape);

glutDisplayFunc(display);

glutMouseFunc(myMouse);


glutMainLoop();
}

Comentarios