Эпициклоидная анимация с Matplotlib в PythonPython

Программы на Python
Ответить
Anonymous
 Эпициклоидная анимация с Matplotlib в Python

Сообщение Anonymous »

Я хочу, чтобы анимация 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()
Остальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кода
Остальную часть кода я добавлю в комментариях, так как похоже, что мой пост в основном состоит из кода. Оставшуюся часть кода я вставлю в комментарии, так как похоже, что мой пост в основном состоит из кода. Оставшуюся часть кода я вставлю в комментарии, так как похоже, что мой пост в основном состоит из кода. остальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментариях, так как он похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я вставлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я вставлю в комментарии, так как похоже, что мой пост в основном кодОстальную часть кода я добавлю в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментарии, так как похоже, что мой пост в основном состоит из кодаОстальную часть кода я помещу в комментариях поскольку похоже, что мой пост в основном состоит из кода

Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»