Animationsgenerierung und -aktualisierung
// 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
wird verwendet, um die Anzahl der Punkte im aktuellen Animationsframe zu erhalten, die aus dem vorherigen Codeabschnitt berechnet wird. index
ist die Anzahl der zuvor generierten Punkte.
-
Die äußere Schleife for (int frame = 0; frame < frames; ++frame)
wird verwendet, um jeden Frame der Animation zu durchlaufen. frames
gibt an, wie viele Frames es insgesamt gibt.
-
Die innere Schleife for (index = 0; index < points_size; ++index)
wird verwendet, um jeden Punkt im aktuellen Frame zu verarbeiten. In jedem Frame wird Folgendes durchgeführt:
- Zunächst wird die neue Position jedes Punktes berechnet. Dies geschieht mit der folgenden Formel:
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;
Diese Berechnungen werden verwendet, um die x- und y-Koordinaten des Punktes zu aktualisieren, um die Bewegung des Punktes in der Animation zu erreichen. distance_increase
steuert die Geschwindigkeit, mit der der Punkt sich bewegt, die sich je nach Entfernung von der ursprünglichen Position des Punktes ändert.
- Punkte werden mit den Funktionen
XSetForeground
und XFillArc
gezeichnet. Dadurch wird der Punkt auf den Bildschirm gezeichnet. XSetForeground
wird verwendet, um die Zeichenfarbe festzulegen, XFillArc
um einen gefüllten Punkt zu zeichnen, und die Koordinaten des Kreismittelpunkts werden von den Funktionen screen_x
und screen_y
umgewandelt.
- Der zweite Teil der inneren Schleife
for (double size = 17; size < 23; size += 0.3)
wird verwendet, um zusätzliche Punkte im aktuellen Frame zu generieren. In dieser Schleife wird jeder Punkt generiert, eingefärbt und auf den Bildschirm gezeichnet.
- Die Koordinaten und Farben der neuen Punkte werden zufällig gemäß den folgenden Bedingungen generiert:
Wenn size >= 20
und die Zufallszahl größer als 0.6
ist, oder size < 20
und die Zufallszahl größer als 0.95
ist, wird ein neuer Punkt generiert.
- Die x- und y-Koordinaten der generierten Punkte werden aus der Position des ursprünglichen Punktes und einigen zufälligen Abweichungen berechnet.
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);
}
- Schließlich werden die Funktionen
XSetForeground
und XFillArc
verwendet, um den generierten Punkt auf den Bildschirm zu zeichnen, genau wie der vorherige Punkt.