/* Определение типа данных, представляющего точку в трехмерном пространстве */ 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


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