при вызове программы */

!include <stdlib.h> finclude <GL/glut.h>
typedef float point3[3];

/* Исходный тетраэдр */

point3 v[]={{0.0, 0.0, 1.0}, {0.0, 0.942809, -0.33333}, {-0.816497, -0.471405, -0.333333}, {0.816497, -0.471405, -0.333333}};
static GLfloat theta[] = {0.0,0.0,0.0}; int n;
/*............................... */

/* Отображение треугольника.

В режиме проволочного изображения вычерчивается контур из трех отрезков.

Для закрашивания фиксированным цветом используется нормаль в одной точке.

Для закрашивания изменяющимся цветом используются три нормали в вершинах. */ void triangle( point3 a, point3 b, point3 с) {

glBegin(GL_POLYGON);
glNormal3fv(a);
glVertex3fv(a);
glVertex3fv(b);
glVertex3fv(c); glEnd();
}
/*...............................*/

/* Разбиение треугольника. */

void divide triangle(point3 a, point3 b, point3 c, int m) {
point3 vl, v2, v3; int j; if(m>0) {
for(j=0; j<3; vl[j]=(a[j]+b[j])/2; for(j=0; j<3; v2[j]=(a[j]+c[j])/2; for(j=0; j<3; j++) v3[j]=(b[j]+c[j])/2; divide_triangle(a, vl, v2, m-1); divide_triangle(c, v2, v3, m-1); divide triangle(b, v3, vl, m-1);
}

else(triangle(a,b,c)); /* Вычертить треугольник */

Приложение А. Демонстрационные программы

}
/*...............................*/

/* Применение алгоритма разбиения треугольника к граням тетраэдра */ void tetrahedron( int m) {

glColor3f(l.О,0.0,0.0);

divide triangle(v[0], v[l], v[2], m);
glColor3f(0.0,1.0,0.0);
divide triangle(v[3), v[2], v[l], m);
glColor3f(0.0,0.0,1.0);
divide triangle(v[0], v[3], v[l], m);
glColor3f(0.0,0.0,0.0);
divide triangle(v[0], v[2], v[3], m);
}
/* ............................... */
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); tetrahedron(n); glFlush();
}
/* ...............................*/
void myReshape(int w, int h)
{
glViewport(0, 0, w, h); glMatrixMode(GL_PR0JECTI0N); glLoadIdentity(); if (w <= h)
glOrtho(-2.0, 2.0, -2.0*(GLfloat)h/(GLfloat)w, 2.0*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
else
glOrtho(-2.0*(GLfloat)w/(GLfloat)h, 2.0 *(GLfloat)w/(GLfloat)h, -2.0, 2.0, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glutPostRedisplay();

⇐ Предыдущая| |Следующая ⇒