/* Определение типа данных, представляющего точку
в трехмерном пространстве */ typedef struct { float x,y,z;} point3;
/* Исходный тетраэдр */ point3 vertices[4]={{0,0,0},{250,500,100}, {500,250,250},{250,100,250}};
int j;
point3 new, old={250,100,250};
/* -------------------------------*/
void clear() {
glClear(GL_COLOR_BUFFER_BIT);
}
/* ----------------------.....-. */
/* Вычисление и вывод на экран новой точки узора */
void display()
{
long rand(); int i;
j=rand()%4; /* Выбор вершины случайным образом */
/* Вычисление координат точки, стоящей на середине пути между вершиной и прежней точкой узора */ new.x = (old.x+vertices[j].х)/2; new.у = (old.y+vertices[j].у)/2; new.z = (old.z+vertices[j].z)/2;
/* Вывод точки на экран */ glBegin(GL_POINTS);
glColor3f(1.0-new.z/250.,new.z/250.,0.);
glVertex3f(new.x, new.y,new.z);
Приложение А. Демонстрационные программы
glEnd();
/* Заменить прежнюю точку новой */ old.x=new.x; old.y=new.y; old.z=new.z;
glFlush();
}
/*-------------------------------*/
void mouse(int btn, int state, int x, int y) {
if(btn==GLUT_LEFT_BUTTON&state==GLUT_DOWN)
glutldleFunc(display); if(btn==GLUT_MIDDLE_BUTTON&state==GLUT_DOWN)
glutldleFunc(NULL); if(btn==GLUT_RIGHT_BUTTON&state==GLUT_DOWN)
exit();
}
/*------------.....--------------*/
int main(int arge, char** argv) {
glutlnit(&argc,argv);
glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500,500); glutlnitWindowPosition(0,0); glutCreateWindow("Sierpinski Gasket");
glutldleFunc (display); glutMouseFunc (mouse);
glClearColor(1.0, 1.0, 1.0, 0.0); /* Цвет фона - белый */ glColor3f(1.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity();
glOrtho(0.0, 500.0, 0.0, 500.0, -500.0, 500.0); glMatrixMode(GL_MODELVIEW); glutDisplayFunc(clear);
glutMainLoop();
}
/*-------Конец файла-------*/
A.4. Рекурсивный алгоритм построения трехмерного узора Серпинского
/* Построение трехмерного узора Серпинского рекурсивным разбиением тетраэдра */ /* Количество циклов задается в командной строке А.4. Рекурсивный алгоритм построения трехмерного узора Серпинского 529