Génération et mise à jour de l'animation
// 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
est utilisé pour obtenir le nombre de points dans la trame d'animation actuelle, calculé à partir de la section de code précédente. index
est le nombre de points générés précédemment.
-
La boucle externe for (int frame = 0; frame < frames; ++frame)
est utilisée pour parcourir chaque trame de l'animation, et frames
spécifie le nombre total de trames.
-
La boucle interne for (index = 0; index < points_size; ++index)
est utilisée pour traiter chaque point dans la trame actuelle. Dans chaque trame, elle effectue les opérations suivantes :
- Tout d'abord, calculez la nouvelle position de chaque point. Cela se fait en utilisant la formule suivante :
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;
Ces calculs sont utilisés pour mettre à jour les coordonnées x et y du point afin d'obtenir le mouvement du point dans l'animation. distance_increase
contrôle la vitesse à laquelle le point se déplace, qui varie en fonction de la distance par rapport à la position originale du point.
- Dessinez les points à l'aide des fonctions
XSetForeground
et XFillArc
. Cela dessine le point sur l'écran, XSetForeground
pour définir la couleur de peinture, XFillArc
pour dessiner un point rempli, et les coordonnées du centre du cercle sont converties par les fonctions screen_x
et screen_y
.
- La deuxième partie de la boucle interne
for (double size = 17; size < 23; size += 0.3)
est utilisée pour générer des points supplémentaires dans la trame actuelle. Dans cette boucle, chaque point est généré, coloré et dessiné sur l'écran.
- Les coordonnées et les couleurs des nouveaux points sont générées aléatoirement selon les conditions suivantes :
Si size >= 20
et que le nombre aléatoire est supérieur à 0.6
, ou size < 20
et que le nombre aléatoire est supérieur à 0.95
, un nouveau point est généré.
- Les coordonnées x et y des points générés sont calculées à partir de la position du point d'origine et de certains décalages aléatoires.
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);
}
- Enfin, utilisez les fonctions
XSetForeground
et XFillArc
pour dessiner le point généré sur l'écran, tout comme le point précédent.