Лабораторнblй практикум по курсу «Компьютерная графика на OpenGL»
Лабораторная работа 1.
Вblчислительная компьютерная геометрия с использованием библиотеки OpenGL.
Задание 1. Построение куба.
#include "glut.h" #include
douBLe rho=З., theta=45., phi=45., v11,v12, vlЗ, v21, v22, v23,v32, vЗЗ, v43; douBLe screen_dist=2., h=0.5;
void
coeff(douBLe rho,douBLe theta, double phi) { douBLe th, ph, costh, sinth, cosph, sinph, factor;
factor=atan(l.0)/45.0; th=theta*factor; ph=phi*factor; costh=cos(th); sinth=sin(th); cosph=cos(ph); sinph=sin(ph);
vll=-sinth; v12=-cosph*costh; v21=costh; v22=-cosph*sinth;
v32=sinph;
}
v13=-sinph*costh; v23=-sinph*sinth; v33=-cosph; v43=rho;
void
{
}
perspective(douBLe x,douBLe dou e хе, уе, ze;
// Координатbl глаза xe=vll*x+v21*y; ye=v12*x+v22*y+v32*z; ze=v13*x+v23*y+v33*z+v43;
// Экраннblе координатbl
*pX=screen_dist*xe/ze;
*pY=screen_dist*ye/ze;
y,douBLe z, douBLe *рХ, douBLe *рУ)
void dw(douBLe xl,douBLe yl,douBLe zl,douBLe x2,douBLe y2,douBLe z2){ douBLe Х1,У1,Х2,У2;
perspective(xl,yl,zl, &Xl, &Yl); perspective(x2,y2,z2, &Х2, &У2); glBegin(GL_LINES);
g1Vertex2f(Xl,Yl); g1Vertex2f(X2,Y2);
glEnd();
}
void Display(void){ glClearColor(0,0,0,1);
glClear(GL_COLOR_BUFFER_BIT); g1Color3ub(255,0,0);
dw(h,-h,-h,h,h,-h);
dw(h,h,-h,-h,h,-h);
dw(-h,h,-h,-h,-h,-h);
dw(-h,-h,-h,h,-h,-h); dw(h,-h,h,h,h,h);
dw(h,h,h,-h,h,h);
dw(-h,h,h,-h,-h,h);
dw(-h,-h,h,h,-h,h);
dw(h,-h,-h,h,-h,h);
dw(h,h,-h,h,h,h);
dw(-h,h,-h,-h,h,h);
dw(-h,-h,-h,-h,-h,h); glFinish();
}
void Reshape(GLint w, GLint h) { g1Viewport(0,0,w,h);
}
void main(int argc, char *argv[]) {
coeff(rho,theta,phi); glutinit(&argc, argv); glutinitDisplayMode(GLUT_RGB); glutinitWindowPosition(50,10); glutinitWindowSize(640, 480); glutCreateWindow("Kpacнblй кубик");
glutDisplayFunc(Display); glutReshapeFunc(Reshape); glutMainloop();
}
Задание 2. Построение тора.
#include "stdio.h" #include "glut.h" #include
int k, 11,12,13,14;
douBLe rho=25., theta=45., phi=45., vll,v12, vlЗ, v21, v22, v23,v31, v32, vЗЗ, v43; douBLe screen_dist=З.;
void main_w(){
FILE *fp; int i,j,n; float r, R;
douBLe pi, alpha, beta, cosa, sina, х, xl, yl, zl, delta; printf("Input n:");
scanf("%d", &n);
printf("Input (R) and (r):"); scanf("%f %f", &R, &r);
fp= fopen("torus.dat","w"); pi=4.0*atan(l.0); delta=2.0*pi/n; fprintf(fp, "%d\n", n);
for (i=0; ialpha=i*delta; cosa=cos(alpha); sina=sin(alpha); for (j=0; jbeta=j*delta; x=R+r*cos(beta); xl=cosa*x; yl=sina*x; zl=r*sin(beta);
fprintf(fp, "%d %f %f %f\n", i*n+j, xl, yl, zl);
}
}
for (i=0; i
for (j=0; jfprintf(fp, "%d %d %d %d\n",
i*n+j, (i+1)%n*n+j, (i+1)%n*n+(j+1)%n, i*n+(j+1)%n);
}
fclose(fp);
}
void coeff(douBLe rho,douBLe theta, douBLe phi) { douBLe th, ph, costh, sinth, cosph, sinph, factor;
factor=atan(l.0)/45.0; //коэфф.для пересч та в радианbl th=theta*factor; ph=phi*factor;
costh=cos(th); sinth=sin(th); cosph=cos(ph); sinph=sin(ph);
// элементbl матрицbl V
vll=-sinth; v12=-cosph*costh; v21=costh; v22=-cosph*sinth;
v32=sinph;
}
v13=-sinph*costh; v23=-sinph*sinth; v33=-cosph;
v43=rho;
void perspective(douBLe x,douBLe y,douBLe z, douBLe *рХ, douBLe *рУ) { douBLe хе, уе, ze;
// Координатbl глаза xe=vll*x+v21*y; ye=v12*x+v22*y+v32*z; ze=v13*x+v23*y+v33*z+v43;
*pX=screen_dist*xe/ze;
*pY=screen_dist*ye/ze;
}
void dw(douBLe xl,douBLe yl,douBLe zl,douBLe x2,douBLe y2,douBLe z2)
{ douЬle Xl,Yl,X2,Y2; perspective(xl,yl,zl, &Xl, &Yl); perspective(x2,y2,z2, &Х2, &У2); glBegin(GL_LINES);
g1Vertex2f(Xl,Yl); g1Vertex2f(X2,Y2);
glEnd();
}
Do'stlaringiz bilan baham: |