Введение
В ходе статьи напишем код на языке программирования Python, который создаст анимированную ёлку.
Написание кода анимированной ёлки на Python
Для написания кода нам понадобятся такие модули, как matplotlib, math, random,
mpl_toolkits.mplot3d. Устанавливать нам нужно только matplotlib, т.к. остальные входят в стандартную библиотеку Python. Для инсталляции модуля нужно перейти в терминал, или же командную строку, прописать pip install matplotlib, нажать Enter и ждать установки.
Теперь можем перейти к написанию кода, и для начала импортируем всё, что нам понадобится:
import math
import random
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
Создадим фигуру размерами 8 на 8 дюймов:
import math
import random
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 8))
Создадим список, в который будем генерировать 8 рандомных цветов (в последствии эти цвета будут предназначены для украшений):
import math
import random
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 8))
number_of_colors = 8
colors = ["#" + ''.join([random.choice('0123456789ABCDEF') for j in range(6)]) for i in range(number_of_colors)]
Перейдём к написанию функции animate(), в которой для начала будем удалять предыдущую фигуру для прорисовки новой:
import math
import random
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 8))
number_of_colors = 8
colors = ["#" + ''.join([random.choice('0123456789ABCDEF') for j in range(6)]) for i in range(number_of_colors)]
def animate(f):
fig.clear()
Добавим область Axes:
import math
import random
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 8))
number_of_colors = 8
colors = ["#" + ''.join([random.choice('0123456789ABCDEF') for j in range(6)]) for i in range(number_of_colors)]
def animate(f):
fig.clear()
ax = fig.add_subplot(111, projection="3d")
Создадим переменную k, которая будет отвечать за ширину ёлки:
import math
import random
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 8))
number_of_colors = 8
colors = ["#" + ''.join([random.choice('0123456789ABCDEF') for j in range(6)]) for i in range(number_of_colors)]
def animate(f):
fig.clear()
ax = fig.add_subplot(111, projection="3d")
k = 300
Зададим координаты по X, Y, Z:
import math
import random
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 8))
number_of_colors = 8
colors = ["#" + ''.join([random.choice('0123456789ABCDEF') for j in range(6)]) for i in range(number_of_colors)]
def animate(f):
fig.clear()
ax = fig.add_subplot(111, projection="3d")
k = 300
X = [math.cos(i / 5 + f / 10) * (k - i) for i in range(k)]
Y = [math.sin(i / 5 + f / 10) * (k - i) for i in range(k)]
Z = [i for i in range(k)]
Добавим листву ёлке:
import math
import random
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 8))
number_of_colors = 8
colors = ["#" + ''.join([random.choice('0123456789ABCDEF') for j in range(6)]) for i in range(number_of_colors)]
def animate(f):
fig.clear()
ax = fig.add_subplot(111, projection="3d")
k = 300
X = [math.cos(i / 5 + f / 10) * (k - i) for i in range(k)]
Y = [math.sin(i / 5 + f / 10) * (k - i) for i in range(k)]
Z = [i for i in range(k)]
ax.scatter(X, Y, Z, c="green", marker="^")
Теперь нам нужно добавить украшения, для этого в переменную step сохраним их плотность, после чего зададим их координаты:
import math
import random
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 8))
number_of_colors = 8
colors = ["#" + ''.join([random.choice('0123456789ABCDEF') for j in range(6)]) for i in range(number_of_colors)]
def animate(f):
fig.clear()
ax = fig.add_subplot(111, projection="3d")
k = 300
X = [math.cos(i / 5 + f / 10) * (k - i) for i in range(k)]
Y = [math.sin(i / 5 + f / 10) * (k - i) for i in range(k)]
Z = [i for i in range(k)]
ax.scatter(X, Y, Z, c="green", marker="^")
step = 3
Z = [i for i in range(1, k, step)]
X = [math.cos(i / 5 + 2 + f / 10) * (k - i + 10) for i in range(1, k, step)]
Y = [math.sin(i / 5 + 2 + f / 10) * (k - i + 10) for i in range(1, k, step)]
Добавим украшения на ёлку, выбирая рандомные цвета из списка color:
import math
import random
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 8))
number_of_colors = 8
colors = ["#" + ''.join([random.choice('0123456789ABCDEF') for j in range(6)]) for i in range(number_of_colors)]
def animate(f):
fig.clear()
ax = fig.add_subplot(111, projection="3d")
k = 300
X = [math.cos(i / 5 + f / 10) * (k - i) for i in range(k)]
Y = [math.sin(i / 5 + f / 10) * (k - i) for i in range(k)]
Z = [i for i in range(k)]
ax.scatter(X, Y, Z, c="green", marker="^")
step = 3
Z = [i for i in range(1, k, step)]
X = [math.cos(i / 5 + 2 + f / 10) * (k - i + 10) for i in range(1, k, step)]
Y = [math.sin(i / 5 + 2 + f / 10) * (k - i + 10) for i in range(1, k, step)]
ax.scatter(X, Y, Z, c=colors[random.randint(0, 7)], marker="o", s=40)
Зададим значения xlim и ylim, чтобы у нас получался вид конуса и вернём fig:
import math
import random
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 8))
number_of_colors = 8
colors = ["#" + ''.join([random.choice('0123456789ABCDEF') for j in range(6)]) for i in range(number_of_colors)]
def animate(f):
fig.clear()
ax = fig.add_subplot(111, projection="3d")
k = 300
X = [math.cos(i / 5 + f / 10) * (k - i) for i in range(k)]
Y = [math.sin(i / 5 + f / 10) * (k - i) for i in range(k)]
Z = [i for i in range(k)]
ax.scatter(X, Y, Z, c="green", marker="^")
step = 3
Z = [i for i in range(1, k, step)]
X = [math.cos(i / 5 + 2 + f / 10) * (k - i + 10) for i in range(1, k, step)]
Y = [math.sin(i / 5 + 2 + f / 10) * (k - i + 10) for i in range(1, k, step)]
ax.scatter(X, Y, Z, c=colors[random.randint(0, 7)], marker="o", s=40)
plt.xlim(-500, 500)
plt.ylim(-500, 500)
return fig,
Отлично, нам осталось только сохранить анимацию, и итоговый результат в виде гифки:
import math
import random
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 8))
number_of_colors = 8
colors = ["#" + ''.join([random.choice('0123456789ABCDEF') for j in range(6)]) for i in range(number_of_colors)]
def animate(f):
fig.clear()
ax = fig.add_subplot(111, projection="3d")
k = 300
X = [math.cos(i / 5 + f / 10) * (k - i) for i in range(k)]
Y = [math.sin(i / 5 + f / 10) * (k - i) for i in range(k)]
Z = [i for i in range(k)]
ax.scatter(X, Y, Z, c="green", marker="^")
step = 3
Z = [i for i in range(1, k, step)]
X = [math.cos(i / 5 + 2 + f / 10) * (k - i + 10) for i in range(1, k, step)]
Y = [math.sin(i / 5 + 2 + f / 10) * (k - i + 10) for i in range(1, k, step)]
ax.scatter(X, Y, Z, c=colors[random.randint(0, 7)], marker="o", s=40)
plt.xlim(-500, 500)
plt.ylim(-500, 500)
return fig,
ani = animation.FuncAnimation(fig, animate, frames=100, interval=50, blit=True)
ani.save("Ёлочка.gif")
Анимированная ёлка на Python:
![Анимированная ёлка на Python](https://it-start.online/wp-content/uploads/2022/12/jolochka.gif)
Так же можете посмотреть видео о создании анимированной Новогодней открытки на Python:
Заключение
В ходе статьи мы с Вами создали гифку анимированной ёлки на Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂