Это - скриншот из Chrome. В хроме это программируется очень легко:
file_util::AppendToPath(&path, L"sspipes.scr");
CreateProcess(NULL, ...
или: откройте файл заставки Windows Pipe и запустите его.
Источник версии xscreensaver: xscreensaver-4.16 / hacks / glx / pipe.c в xscreensaver-4.16.tar.bz2 (или другой версии того же пакета). Онлайн версия файла .
ОБНОВЛЕНИЕ: Как это работает: он использует OpenGL, чтобы сделать вещи красивыми
Каждая трубка добавляется в виде цилиндра и сферы:
glBegin(GL_QUAD_STRIP);
for (an = 0.0; an <= 2.0 * M_PI; an += M_PI / 12.0) {
glNormal3f((COSan_3 = cos(an) / 3.0), (SINan_3 = sin(an) / 3.0), 0.0);
glVertex3f(COSan_3, SINan_3, one_third);
glVertex3f(COSan_3, SINan_3, -one_third);
}
glEnd();
Вращение в пространстве осуществляется glRotatef
до glBegin
. Все повороты только на 90 градусов.
Конечная сфера является объектом:
quadObj = gluNewQuadric();
gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
gluSphere(quadObj, radius, 16, 16);
gluDeleteQuadric(quadObj);
Для изгибов много кода используется для рисования (функция myElbow).
Чтобы не пересекаться, используется массив 3d с флагами "эта точка пространства содержит трубу". Все трубы имеют целочисленные координаты и параллельны оси. Коррекция перспективы из библиотеки 3d (opengl / direct3d).
Основная функция с логикой: draw_pipes
.
Рисует сферу, выбирает направление в случайном порядке, и начинается запуск трубы. На каждом шаге наблюдается случайное отклонение (с вероятностью 20%) изгиба. Кроме того, neiborhods проверяется на каждом этапе, чтобы предотвратить столкновения. Если нет свободного места для продолжения трубы, или труба достаточно длинная (может быть и случайной), она остановится, и новая труба начнется со случайной точки.