Генерация и обновление анимации
// Inside the create_data() function
int points_size = index;
for (int frame = 0; frame < frames; ++frame) {
for (index = 0; index < points_size; ++index) {
// The position of the calculated point is increased and the coordinates are updated
double x = points[index].x, y = points[index].y;
double distance = sqrt(pow(x, 2) + pow(y, 2));
double distance_increase = -0.0009 * distance * distance + 0.35714 * distance + 5;
double x_increase = distance_increase * x / distance / frames;
double y_increase = distance_increase * y / distance / frames;
points[index].x += x_increase;
points[index].y += y_increase;
// Draw points using XSetForeground and XFillArc
XSetForeground(display, gc, points[index].color);
XFillArc(display, win, gc, screen_x(points[index].x), screen_y(points[index].y), 2, 2, 0, 360 * 64);
}
for (double size = 17; size < 23; size += 0.3) {
for (index = 0; index < quantity; ++index) {
// Randomly generate the coordinates and color of the point according to the condition, and draw the point using XSetForeground and XFillArc
if ((create_random(0, 100) / 100.0 > 0.6 && size >= 20) || (size < 20 && (double)create_random(0, 100) / 100.0 > 0.95)) {
double x, y;
if (size >= 20) {
x = origin_points[index].x * size + create_random(-frame * frame / 5 - 15, frame * frame / 5 + 15);
y = origin_points[index].y * size + create_random(-frame * frame / 5 - 15, frame * frame / 5 + 15);
} else {
x = origin_points[index].x * size + create_random(-5, 5);
y = origin_points[index].y * size + create_random(-5, 5);
}
XSetForeground(display, gc, colors[create_random(0, 6)]);
XFillArc(display, win, gc, screen_x(x), screen_y(y), 2, 2, 0, 360 * 64);
}
}
}
}
-
points_size используется для получения количества точек в текущем кадре анимации, которое вычисляется на основе предыдущего раздела кода. index - это количество ранее сгенерированных точек.
-
Внешний цикл for (int frame = 0; frame < frames; ++frame) используется для перебора каждого кадра анимации, а frames определяет общее количество кадров.
-
Внутренний цикл for (index = 0; index < points_size; ++index) используется для обработки каждой точки в текущем кадре. В каждом кадре выполняются следующие действия:
- Сначала вычисляется новая позиция каждой точки. Это делается по следующей формуле:
double x = points[index].x, y = points[index].y;
double distance = sqrt(pow(x, 2) + pow(y, 2));
double distance_increase = -0.0009 * distance * distance + 0.35714 * distance + 5;
double x_increase = distance_increase * x / distance / frames;
double y_increase = distance_increase * y / distance / frames;
points[index].x += x_increase;
points[index].y += y_increase;
Эти вычисления используются для обновления координат x и y точки, чтобы достичь движения точки в анимации. distance_increase контролирует скорость движения точки, которая изменяется в зависимости от расстояния от исходной позиции точки.
- Точки рисуются с использованием функций
XSetForeground и XFillArc. Это рисует точку на экране, XSetForeground используется для установки цвета рисования, XFillArc - для рисования заполненной точки, а координаты центра круга преобразуются функциями screen_x и screen_y.
- Второй раздел внутреннего цикла
for (double size = 17; size < 23; size += 0.3) используется для генерации дополнительных точек в текущем кадре. В этом цикле каждая точка генерируется, окрашивается и рисуется на экране.
- Координаты и цвета новых точек генерируются случайным образом в соответствии с следующими условиями:
Если size >= 20 и случайное число больше 0.6, или size < 20 и случайное число больше 0.95, то генерируется новая точка.
- Координаты x и y сгенерированных точек вычисляются на основе положения исходной точки и некоторых случайных смещений.
double x, y;
if (size >= 20) {
x = origin_points[index].x * size + create_random(-frame * frame / 5 - 15, frame * frame / 5 + 15);
y = origin_points[index].y * size + create_random(-frame * frame / 5 - 15, frame * frame / 5 + 15);
} else {
x = origin_points[index].x * size + create_random(-5, 5);
y = origin_points[index].y * size + create_random(-5, 5);
}
- Наконец, используются функции
XSetForeground и XFillArc для рисования сгенерированной точки на экране, как и в случае с предыдущей точкой.