Génération et mise à jour d'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.