{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Animáció készítése pythonnal\n",
    "\n",
    "A következőkben arra láthatunk példákat, hogy hogy hogyan tudunk egyszerű animációkat készíteni a már korábban megismert `python`, `numpy` és `matplotlib` segítségével. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.animation as animation\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "two_pi = np.pi * 2\n",
    "x_vals = np.arange(0.0, two_pi, 0.001)\n",
    "y_vals = np.sin(x_vals)\n",
    "ax = plt.axis([0, two_pi, -1.1, 1.1])\n",
    "moving_point, = plt.plot([0], [np.sin(0)], marker = 'o', markerfacecolor=\"#ffc819\", markeredgecolor='w', markersize = 100)\n",
    "\n",
    "def animate_point(i):\n",
    "    moving_point.set_data(i, np.sin(i))\n",
    "    return moving_point,\n",
    "\n",
    "fr = np.arange(0.0, two_pi, 0.1)\n",
    "myAnimation = animation.FuncAnimation(fig, animate_point, frames=fr, repeat=True, blit=True, interval=10)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![circle](data/circle.gif)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Az animációt `gif`-ként elmenteni a következő kóddal lehet, de ez nem végtelenített lejátszást generál.\n",
    "\n",
    "```python\n",
    "from matplotlib.animation import PillowWriter\n",
    "myAnimation.save(\"circle.gif\", writer=PillowWriter(fps=24))\n",
    "```\n",
    "\n",
    "### loop - végtelen lejátszású gif:\n",
    "\n",
    "A nem végtelen lejátszás ismert Issue a matplotlibben. Ezt később javítani fogják, de jelenleg a legjobb, amit thetünk, hogy a felüldefiniáljuk a `PillowWriter`-t egy `LoopingPillowWriter`-rel, valahogy így:\n",
    "\n",
    "Issue: https://github.com/t-makaro/animatplot/issues/24\n",
    "\n",
    "\n",
    "```python\n",
    "from matplotlib.animation import PillowWriter\n",
    "\n",
    "class LoopingPillowWriter(PillowWriter):\n",
    "    def finish(self):\n",
    "        self._frames[0].save(\n",
    "            self._outfile, save_all=True, append_images=self._frames[1:],\n",
    "            duration=int(1000 / self.fps), loop=0)\n",
    "\n",
    "\n",
    "myAnimation.save(\"line.gif\", writer=LoopingPillowWriter(fps=24))\n",
    "```\n",
    "\n",
    "\n",
    "### Nézzünk egy másik példát:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAA3FJREFUeJzt2aFRg0EURtEXBodAoFIMmiZQNIHEU0c6iaYOmmBm00HUzv0F5xTwzaor3p7WWgNA4+HoBwD8J6ILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIiS5ASHQBQqILEBJdgJDoAoREFyAkugAh0QUIPe4cu57fv2fmY+cmwMF+Xn8vb7vGtkZ3Zp5m5mXzJsCRnneOOS8AhEQXICS6ACHRBQjt/kj7nJmvzZsAR/rbOXZaa+3cA+AO5wWAkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCogsQEl2AkOgChEQXICS6ACHRBQiJLkBIdAFCN1taDuxN2OLyAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.animation as animation\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "ten_pi = np.pi * 10\n",
    "x_vals = np.arange(0.0, ten_pi, 0.001)\n",
    "y_vals = np.sin(x_vals)\n",
    "plt.ylim([-5, 5])\n",
    "plt.xticks([])\n",
    "plt.yticks([])\n",
    "ax.axis('off')\n",
    "\n",
    "line, = plt.plot(x_vals, color=\"#c2185b\", linewidth = 6)\n",
    "\n",
    "def animate_line(i):\n",
    "    if i > 10:\n",
    "        i = 20 - i\n",
    "    new_val = i / 5 * np.sin(x_vals)\n",
    "    line.set_ydata(new_val)\n",
    "    return [line]\n",
    "\n",
    "myAnimation = animation.FuncAnimation(fig, animate_line, 20, blit=True)\n",
    "# from matplotlib.animation import PillowWriter\n",
    "# myAnimation.save(\"line.gif\", writer=PillowWriter(fps=24))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![line](data/line.gif)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### _Used sources_ / Felhasznált források\n",
    "- [Shannon Turner: Python lessons repository](https://github.com/shannonturner/python-lessons) MIT license (c) Shannon Turner 2013-2014\n",
    "- [Siki Zoltán: Python mogyoróhéjban](http://www.agt.bme.hu/gis/python/python_oktato.pdf) GNU FDL license (c) Siki Zoltán\n",
    "- [BME AUT](https://github.com/bmeaut) MIT License Copyright (c) BME AUT 2016-2018\n",
    "- [Matplotlib animation API](https://matplotlib.org/3.1.1/api/animation_api.html)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}