Анимированная ёлка на Python

Анимированная ёлка на Python Статьи

Введение

В ходе статьи напишем код на языке программирования 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
Анимированная ёлка на Python

Так же можете посмотреть видео о создании анимированной Новогодней открытки на Python:

Анимированная Новогодняя открытка на python

Заключение

В ходе статьи мы с Вами создали гифку анимированной ёлки на Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂

Admin
Admin
IT Start