Generación y actualización de animación
// 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 se utiliza para obtener el número de puntos en el cuadro actual de la animación, calculado a partir de la sección de código anterior. index es el número de puntos generados previamente.
-
El bucle externo for (int frame = 0; frame < frames; ++frame) se utiliza para iterar sobre cada cuadro de la animación, y frames especifica cuántos cuadros hay en total.
-
El bucle interno for (index = 0; index < points_size; ++index) se utiliza para procesar cada punto en el cuadro actual. En cada cuadro, se realiza lo siguiente:
- Primero, se calcula la nueva posición de cada punto. Esto se hace mediante la siguiente fórmula:
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;
Estos cálculos se utilizan para actualizar las coordenadas x e y del punto para lograr el movimiento del punto en la animación. distance_increase controla la velocidad a la que se mueve el punto, que varía con la distancia desde la posición original del punto.
- Se dibujan puntos utilizando las funciones
XSetForeground y XFillArc. Esto dibuja el punto en la pantalla, XSetForeground para establecer el color de pintura, XFillArc para dibujar un punto relleno, y las coordenadas del centro del círculo se convierten mediante las funciones screen_x y screen_y.
- La segunda parte del bucle interno
for (double size = 17; size < 23; size += 0.3) se utiliza para generar puntos adicionales en el cuadro actual. En este bucle, se genera, se colorea y se dibuja cada punto en la pantalla.
- Las coordenadas y los colores de los nuevos puntos se generan aleatoriamente según las siguientes condiciones:
Si size >= 20 y el número aleatorio es mayor que 0.6, o size < 20 y el número aleatorio es mayor que 0.95, se genera un nuevo punto.
- Las coordenadas x e y de los puntos generados se calculan a partir de la posición del punto original y algunos desplazamientos aleatorios.
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);
}
- Finalmente, se utilizan las funciones
XSetForeground y XFillArc para dibujar el punto generado en la pantalla, al igual que el punto anterior.