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
Publicar un comentario