Я хочу, чтобы анимация epicycloid.gif кадрировалась в зависимости от размера эпициклоиды, то есть в зависимости от радио вращающегося круга. Как вы видите, при соотношении = 2 анимация в формате .gif не показывает всю кривую.
[img]https: //i.sstatic.net/2f6Tp3sM.gif[/img]
from matplotlib.animation import FuncAnimation
import numpy as np
class Epicycloid:
def __init__(self, ratio, frames, ncycles):
self.frames = frames
self.ncycles = ncycles
self.fig, self.ax = plt.subplots()
self.ax.set_aspect('equal')
# Big circle (stationary):
theta = np.linspace(0, 2 * np.pi, 100)
x = np.cos(theta)
y = np.sin(theta)
self.big_circle, = self.ax.plot(x, y, 'b-')
# Small circle (rolling outside):
self.small_r = 1. / ratio
r = self.small_r
x = r * np.cos(theta) + (1 + r)
y = r * np.sin(theta)
self.small_circle, = self.ax.plot(x, y, 'k-')
# Line and dot:
self.line, = self.ax.plot([1 + r, 1], [0, 0], 'k-')
self.dot, = self.ax.plot([1 + r], [0], 'go', ms=5)
# Epicycloid curve:
self.epicycloid, = self.ax.plot([], [], 'r-')
# Create the animation
self.animation = FuncAnimation(
self.fig, self.animate,
frames=self.frames * self.ncycles,
interval=50, blit=False,
repeat_delay=2000,
)
def update_small_circle(self, phi):
# Update the small rolling circle (outside the big circle)
theta = np.linspace(0, 2 * np.pi, 100)
x = self.small_r * np.cos(theta) + (1 + self.small_r) * np.cos(phi)
y = self.small_r * np.sin(theta) + (1 + self.small_r) * np.sin(phi)
self.small_circle.set_data(x, y)
def update_epicycloid(self, phis):
# Update the epicycloid path based on current phase phi
R = 1
r = self.small_r
x = (R + r) * np.cos(phis) - r * np.cos((R + r) / r * phis + np.pi)
y = (R + r) * np.sin(phis) - r * np.sin((R + r) / r * phis + np.pi)
self.epicycloid.set_data(x, y)
# Update the line connecting the center of the small circle to the point
center = [(R + r) * np.cos(phis[-1]), (R + r) * np.sin(phis[-1])]
self.line.set_data([center[0], x[-1]], [center[1], y[-1]])
self.dot.set_data([x[-1]], [y[-1]])
def animate(self, frame):
frame = frame + 1
phi = 2 * np.pi * frame / self.frames
self.update_small_circle(phi)
self.update_epicycloid(np.linspace(0, phi, frame))
# Create the Epicycloid with a ratio, frames, and cycles
epicycloid = Epicycloid(ratio=3, frames=50, ncycles=4)
# Uncomment the next line if you want to save the animation as a gif
epicycloid.animation.save('epicycloid.gif', writer='imagemagick', fps=10, dpi=75)
# Show the animation
plt.show()
Остальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кода
Остальную часть кода я добавлю в комментариях, так как похоже, что мой пост в основном состоит из кода. Оставшуюся часть кода я вставлю в комментарии, так как похоже, что мой пост в основном состоит из кода. Оставшуюся часть кода я вставлю в комментарии, так как похоже, что мой пост в основном состоит из кода. остальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментариях, так как он похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я вставлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я вставлю в комментарии, так как похоже, что мой пост в основном кодОстальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментариях поскольку похоже, что мой пост в основном состоит из кода
Я хочу, чтобы анимация epicycloid.gif кадрировалась в зависимости от размера эпициклоиды, то есть в зависимости от радио вращающегося круга. Как вы видите, при соотношении = 2 анимация в формате .gif не показывает всю кривую. [img]https: //i.sstatic.net/2f6Tp3sM.gif[/img]
Вот модифицированный код гипоцилоида Томаса Куна [code]from matplotlib.animation import FuncAnimation import numpy as np
# Big circle (stationary): theta = np.linspace(0, 2 * np.pi, 100) x = np.cos(theta) y = np.sin(theta)
self.big_circle, = self.ax.plot(x, y, 'b-')
# Small circle (rolling outside): self.small_r = 1. / ratio r = self.small_r x = r * np.cos(theta) + (1 + r) y = r * np.sin(theta) self.small_circle, = self.ax.plot(x, y, 'k-')
def update_small_circle(self, phi): # Update the small rolling circle (outside the big circle) theta = np.linspace(0, 2 * np.pi, 100) x = self.small_r * np.cos(theta) + (1 + self.small_r) * np.cos(phi) y = self.small_r * np.sin(theta) + (1 + self.small_r) * np.sin(phi) self.small_circle.set_data(x, y)
def update_epicycloid(self, phis): # Update the epicycloid path based on current phase phi R = 1 r = self.small_r x = (R + r) * np.cos(phis) - r * np.cos((R + r) / r * phis + np.pi) y = (R + r) * np.sin(phis) - r * np.sin((R + r) / r * phis + np.pi) self.epicycloid.set_data(x, y)
# Update the line connecting the center of the small circle to the point center = [(R + r) * np.cos(phis[-1]), (R + r) * np.sin(phis[-1])] self.line.set_data([center[0], x[-1]], [center[1], y[-1]]) self.dot.set_data([x[-1]], [y[-1]])
# Create the Epicycloid with a ratio, frames, and cycles epicycloid = Epicycloid(ratio=3, frames=50, ncycles=4)
# Uncomment the next line if you want to save the animation as a gif epicycloid.animation.save('epicycloid.gif', writer='imagemagick', fps=10, dpi=75)
# Show the animation plt.show() [/code] Остальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кода Остальную часть кода я добавлю в комментариях, так как похоже, что мой пост в основном состоит из кода. Оставшуюся часть кода я вставлю в комментарии, так как похоже, что мой пост в основном состоит из кода. Оставшуюся часть кода я вставлю в комментарии, так как похоже, что мой пост в основном состоит из кода. остальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментариях, так как он похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я вставлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я вставлю в комментарии, так как похоже, что мой пост в основном кодОстальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментариях поскольку похоже, что мой пост в основном состоит из кода