{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "7dac7da5",
"metadata": {
"tags": [
"remove-cell"
]
},
"outputs": [],
"source": [
"import diplotocus as dpl\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"def plot(ease,ease_str,lims=(-0.1,1.1)):\n",
" x = np.linspace(0,1,200)\n",
" y = [ease.ease(el) for el in x]\n",
"\n",
" tl = dpl.Timeline(quiet=True,figsize=(6,5),xlim=lims,ylim=lims,noaxis=True)\n",
" ax = tl.main_axis\n",
" ax.plot(x,y,alpha=0.5)\n",
" ax.text(0.1,0.8,ease_str)\n",
" ax.text(0.1,0.3,'Linear',alpha=0.5)\n",
" e = dpl.plot(x=0,y=0.75,c='k',marker='o',markersize=10,easing=ease)\n",
" l = dpl.plot(x=0,y=0.25,c='k',marker='o',markersize=10,alpha=0.5)\n",
" p = dpl.plot(x=x,y=y,c='C0')\n",
" e.translate((0,0),(1,0),200)\n",
" l.translate((0,0),(1,0),200)\n",
" p.draw(200)\n",
" tl.animate((e,l,p))\n",
" tl.wait(25)\n",
" tl.save_video(path='../_static/easings/{}.mp4'.format(ease_str),speed=4)"
]
},
{
"cell_type": "markdown",
"id": "b2e0a313",
"metadata": {},
"source": [
"# Easing functions\n",
"\n",
"By default, all animations are rendered with a linear time progression. If your video has multiple steps, the transition between them will appear abrupt as you end one and start another. This can be fixed by using **easing functions**. Easing functions are mappings between *frame number* and a *time parameter*. For example, you might want to start your animations slowly, and end very fast; in this case you'd want to use a non-linear easing function.\n",
"\n",
"There are multiple ways to use an easing function in diplotocus. You can either set an easing for a whole *timeline*, a *plot object*, a *seq.animate() function* or an *animation function*. If multiple easings are set, the priority goes from the more specific to the more general, i.e. the easing is selected in this order :\n",
"- an easing set on the *animation function*, or if not set :\n",
"- an easing set on the *seq.animate() function*, or if not set :\n",
"- an easing set on the *plot object*, or if not set :\n",
"- an easing set on the *timeline*, or if not set :\n",
"- no easing (i.e. `dpl.easeLinear()`).\n",
"\n",
"Here are all the easing functions implemented in diplotocus:"
]
},
{
"cell_type": "markdown",
"id": "40f2ec9e",
"metadata": {},
"source": [
"## easeLinear\n",
"\n",
"```\n",
" f(x) = x\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "c89efe3c",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeLinear(),'easeLinear')"
]
},
{
"cell_type": "markdown",
"id": "43e52796",
"metadata": {},
"source": [
"## Sine\n",
"### easeInSine:\n",
"\n",
"```\n",
" f(x) = 1 - cos((x * π) / 2)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "7be552c4",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInSine(),'easeInSine')"
]
},
{
"cell_type": "markdown",
"id": "c4f7c6c1",
"metadata": {},
"source": [
"### easeOutSine():\n",
"\n",
"```\n",
" f(x) = sin((x * π) / 2)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "33067726",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeOutSine(),'easeOutSine')"
]
},
{
"cell_type": "markdown",
"id": "009eb22a",
"metadata": {},
"source": [
"### easeInOutSine():\n",
"\n",
"```\n",
" f(x) = -(cos(π * x) - 1) / 2\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "e6d0238d",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInOutSine(),'easeInOutSine')"
]
},
{
"cell_type": "markdown",
"id": "a3163255",
"metadata": {},
"source": [
"## Quadratic\n",
"### easeInQuad():\n",
"\n",
"```\n",
" f(x) = x^2\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "9928adac",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInQuad(),'easeInQuad')"
]
},
{
"cell_type": "markdown",
"id": "e0f77dc5",
"metadata": {},
"source": [
"### easeOutQuad():\n",
"\n",
"```\n",
" f(x) = 1 - (1 - x) * (1 - x)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "7cd9cab3",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeOutQuad(),'easeOutQuad')"
]
},
{
"cell_type": "markdown",
"id": "0659b981",
"metadata": {},
"source": [
"### easeInOutQuad():\n",
"\n",
"```\n",
" f(x) = x < 0.5 ? 2 * x^2 : 1 - (-2 * x + 2)^2 / 2\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "0ddee08c",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInOutQuad(),'easeInOutQuad')"
]
},
{
"cell_type": "markdown",
"id": "767f078b",
"metadata": {},
"source": [
"## Cubic\n",
"### easeInCubic():\n",
"\n",
"```\n",
" f(x) = x^3\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "158f852b",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInCubic(),'easeInCubic')"
]
},
{
"cell_type": "markdown",
"id": "e04138c3",
"metadata": {},
"source": [
"### easeOutCubic():\n",
"\n",
"```\n",
" f(x) = 1 - (1 - x)^3\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "ef03b09d",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeOutCubic(),'easeOutCubic')"
]
},
{
"cell_type": "markdown",
"id": "aa55c2c4",
"metadata": {},
"source": [
"### easeInOutCubic():\n",
"\n",
"```\n",
" f(x) = x < 0.5 ? 4 * x^3 : 1 - (-2 * x + 2)^3 / 2\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "0888eda0",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInOutCubic(),'easeInOutCubic')"
]
},
{
"cell_type": "markdown",
"id": "aa27642e",
"metadata": {},
"source": [
"## Quartic\n",
"### easeInQuart():\n",
"\n",
"```\n",
" f(x) = x^4\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "56660979",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInQuart(),'easeInQuart')"
]
},
{
"cell_type": "markdown",
"id": "081b7b83",
"metadata": {},
"source": [
"### easeOutQuart():\n",
"\n",
"```\n",
" f(x) = 1 - (1 - x)^4\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "d32bc32f",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeOutQuart(),'easeOutQuart')"
]
},
{
"cell_type": "markdown",
"id": "b931d13f",
"metadata": {},
"source": [
"### easeInOutQuart():\n",
"\n",
"```\n",
" f(x) = x < 0.5 ? 8 * x^4 : 1 - (-2 * x + 2)^4 / 2\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "de170f5c",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInOutQuart(),'easeInOutQuart')"
]
},
{
"cell_type": "markdown",
"id": "8acb4760",
"metadata": {},
"source": [
"## Quintic\n",
"### easeInQuint():\n",
"\n",
"```\n",
" f(x) = x^5\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "c8f3fca2",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInQuint(),'easeInQuint')"
]
},
{
"cell_type": "markdown",
"id": "7148b591",
"metadata": {},
"source": [
"### easeOutQuint():\n",
"\n",
"```\n",
" f(x) = 1 - (1 - x)^5\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "d5bdc9aa",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeOutQuint(),'easeOutQuint')"
]
},
{
"cell_type": "markdown",
"id": "e0b4cfad",
"metadata": {},
"source": [
"### easeInOutQuint():\n",
"\n",
"```\n",
" f(x) = x < 0.5 ? 16 * x^5 : 1 - (-2 * x + 2)^5 / 2\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "b4ceafb7",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInOutQuint(),'easeInOutQuint')"
]
},
{
"cell_type": "markdown",
"id": "65603806",
"metadata": {},
"source": [
"## Exponential\n",
"### easeInExpo():\n",
"\n",
"```\n",
" f(x) = x === 0 ? 0 : 2^(10 * x - 10)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "4b704b90",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInExpo(),'easeInExpo')"
]
},
{
"cell_type": "markdown",
"id": "3d70d383",
"metadata": {},
"source": [
"### easeOutExpo():\n",
"\n",
"```\n",
" f(x) = x === 1 ? 1 : 1 - 2^(-10 * x)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "342b16a7",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeOutExpo(),'easeOutExpo')"
]
},
{
"cell_type": "markdown",
"id": "07d6ffab",
"metadata": {},
"source": [
"### easeInOutExpo():\n",
"\n",
"```\n",
" f(x) = x === 0\n",
" ? 0\n",
" : x === 1\n",
" ? 1\n",
" : x < 0.5 ? Math.pow(2, 20 * x - 10) / 2\n",
" : (2 - Math.pow(2, -20 * x + 10)) / 2\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "0d07d175",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInOutExpo(),'easeInOutExpo')"
]
},
{
"cell_type": "markdown",
"id": "7f7c4712",
"metadata": {},
"source": [
"## Circular\n",
"### easeInCirc():\n",
"\n",
"```\n",
" f(x) = 1 - sqrt(1 - x^2)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "1f1776ef",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInCirc(),'easeInCirc')"
]
},
{
"cell_type": "markdown",
"id": "5125a1fc",
"metadata": {},
"source": [
"### easeOutCirc():\n",
"\n",
"```\n",
" f(x) = sqrt(1 - (x - 1)^2)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "dd01f5a1",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeOutCirc(),'easeOutCirc')"
]
},
{
"cell_type": "markdown",
"id": "9afda920",
"metadata": {},
"source": [
"### easeInOutCirc():\n",
"\n",
"```\n",
" f(x) = x < 0.5\n",
" ? (1 - sqrt(1 - (2 * x)^2)) / 2\n",
" : (sqrt(1 - (-2 * x + 2)^2) + 1) / 2\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "8bb07213",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInOutCirc(),'easeInOutCirc')"
]
},
{
"cell_type": "markdown",
"id": "ababb15f",
"metadata": {},
"source": [
"## Back\n",
"### easeInBack():\n",
"\n",
"```\n",
" c1 = 1.70158\n",
" c3 = c1 + 1\n",
" \n",
" f(x) = c3 * x * x * x - c1 * x * x\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "ba1fe8fd",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInBack(),'easeInBack',lims=(-0.15,1.15))"
]
},
{
"cell_type": "markdown",
"id": "d14a822f",
"metadata": {},
"source": [
"### easeOutBack():\n",
"\n",
"```\n",
" c1 = 1.70158\n",
" c3 = c1 + 1\n",
" \n",
" f(x) = 1 + c3 * (x - 1)^3 + c1 * (x - 1)^2\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "5afa85f8",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeOutBack(),'easeOutBack',lims=(-0.15,1.15))"
]
},
{
"cell_type": "markdown",
"id": "6cd16b5b",
"metadata": {},
"source": [
"### easeInOutBack():\n",
"\n",
"```\n",
" c1 = 1.70158\n",
" c2 = c1 * 1.525\n",
" \n",
" f(x) = x < 0.5\n",
" ? ((2 * x)^2 * ((c2 + 1) * 2 * x - c2)) / 2\n",
" : ((2 * x - 2)^2 * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "828555e7",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInOutBack(),'easeInOutBack',lims=(-0.15,1.15))"
]
},
{
"cell_type": "markdown",
"id": "05f9cef4",
"metadata": {},
"source": [
"## Elastic\n",
"### easeInElastic():\n",
"\n",
"```\n",
" c4 = (2 * π) / 3\n",
"\n",
" f(x) = x === 0\n",
" ? 0\n",
" : x === 1\n",
" ? 1\n",
" : -2^(10 * x - 10) * sin((x * 10 - 10.75) * c4)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "d74ea318",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInElastic(),'easeInElastic',lims=(-0.4,1.1))"
]
},
{
"cell_type": "markdown",
"id": "f3ea107f",
"metadata": {},
"source": [
"### easeOutElastic():\n",
"\n",
"```\n",
" c4 = (2 * π) / 3\n",
"\n",
" f(x) = x === 0\n",
" ? 0\n",
" : x === 1\n",
" ? 1\n",
" : 2^(-10 * x) * sin((x * 10 - 0.75) * c4) + 1\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "cb30cdb2",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeOutElastic(),'easeOutElastic',lims=(-0.1,1.4))"
]
},
{
"cell_type": "markdown",
"id": "823c568d",
"metadata": {},
"source": [
"### easeInOutElastic():\n",
"\n",
"```\n",
" c4 = c5 = (2 * π) / 4.5\n",
"\n",
" f(x) = x === 0\n",
" ? 0\n",
" : x === 1\n",
" ? 1\n",
" : x < 0.5\n",
" ? -(2^(20 * x - 10) * sin((20 * x - 11.125) * c5)) / 2\n",
" : (2^(-20 * x + 10) * sin((20 * x - 11.125) * c5)) / 2 + 1\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "085400ca",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInOutElastic(),'easeInOutElastic',lims=(-0.4,1.4))"
]
},
{
"cell_type": "markdown",
"id": "08597675",
"metadata": {},
"source": [
"## Bounce\n",
"### easeInBounce():\n",
"\n",
"```\n",
" f(x) = 1 - f_easeOutBounce(1 - x)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "820dc152",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInBounce(),'easeInBounce')"
]
},
{
"cell_type": "markdown",
"id": "fa76aa08",
"metadata": {},
"source": [
"### easeOutBounce():\n",
"\n",
"```\n",
" n1 = 7.5625\n",
" d1 = 2.75\n",
"\n",
" if (x < 1 / d1) {\n",
" f(x) = n1 * x * x\n",
" } else if (x < 2 / d1) {\n",
" f(x) = n1 * (x -= 1.5 / d1) * x + 0.75\n",
" } else if (x < 2.5 / d1) {\n",
" f(x) = n1 * (x -= 2.25 / d1) * x + 0.9375\n",
" } else {\n",
" f(x) = n1 * (x -= 2.625 / d1) * x + 0.984375\n",
" }\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "9a7a5874",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeOutBounce(),'easeOutBounce')"
]
},
{
"cell_type": "markdown",
"id": "116166ee",
"metadata": {},
"source": [
"### easeInOutBounce():\n",
"\n",
"```\n",
" f(x) = 1 - f_easeOutBounce(1 - x)\n",
" f(x) = x < 0.5\n",
" ? (1 - f_easeOutBounce(1 - 2 * x)) / 2\n",
" : (1 + f_easeOutBounce(2 * x - 1)) / 2\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "7531eee4",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot(dpl.easings.easeInOutBounce(),'easeInOutBounce')"
]
},
{
"cell_type": "markdown",
"id": "d390ac6a",
"metadata": {},
"source": [
"## easeCubicBezier(x1,y1,x2,y2)\n",
"\n",
"This function lets you define a custom easing function, as a [cubic Bézier curve](https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Cubic_B%C3%A9zier_curves). The implementation is similar to the CSS one, i.e. it is inverting the x(t)=t relation to find a y(t) solution, given the positions of the control points P1=(x1,y1) and P2=(x2,y2).\n",
"\n",
"```{note}\n",
"You can use [cubic-bezier.com](https://cubic-bezier.com) to find the right easing for you.\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5fbe493c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ease = dpl.easings.easeCubicBezier(.43,-0.5,.56,1.5)\n",
"\n",
"x = np.linspace(0,1,200)\n",
"y = [ease.ease(el) for el in x]\n",
"\n",
"ease_str = 'Cubic Bézier'\n",
"\n",
"lims = (-0.1,1.1)\n",
"\n",
"tl = dpl.Timeline(quiet=True,figsize=(6,5),xlim=lims,ylim=lims,noaxis=True)\n",
"ax = tl.main_axis\n",
"ax.plot(x,y,alpha=0.5)\n",
"ax.text(0.1,0.8,ease_str)\n",
"ax.text(0.1,0.3,'Linear',alpha=0.5)\n",
"e = dpl.plot(x=0,y=0.75,c='k',marker='o',markersize=10,easing=ease)\n",
"l = dpl.plot(x=0,y=0.25,c='k',marker='o',markersize=10,alpha=0.5)\n",
"p = dpl.plot(x=x,y=y,c='C0')\n",
"e.translate((0,0),(1,0),200)\n",
"l.translate((0,0),(1,0),200)\n",
"p.draw(200)\n",
"tl.animate((e,l,p))\n",
"tl.wait(25)\n",
"tl.save_video(path='../_static/easings/cubicBezier.mp4',speed=4)"
]
},
{
"cell_type": "markdown",
"id": "ff16f5c6",
"metadata": {},
"source": [
"## custom easing function\n",
"For more complicated easing functions than cubic Bézier curves, you can define your own by creating a child class of the `diplotocus.easings.Easing` class. All you have to do is define its `ease(self,x)` method so it returns a time parameter for a given linear time `x`. Here's an example:"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "f2f08f89",
"metadata": {},
"outputs": [],
"source": [
"class myEase(dpl.easings.Easing):\n",
" def ease(self,x):\n",
" if x < 0.75:\n",
" return np.abs(np.sin(x*4/.75*np.pi))/(x*5+1)\n",
" else:\n",
" return ((x-.75)/.25)**2"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5fa09b39",
"metadata": {
"tags": [
"remove-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ease = myEase()\n",
"\n",
"x = np.linspace(0,1,200)\n",
"y = [ease.ease(el) for el in x]\n",
"\n",
"ease_str = 'My ease'\n",
"\n",
"lims = (-0.1,1.1)\n",
"\n",
"tl = dpl.Timeline(quiet=True,figsize=(6,5),xlim=lims,ylim=lims,noaxis=True)\n",
"ax = tl.main_axis\n",
"ax.plot(x,y,alpha=0.5)\n",
"ax.text(0.1,0.8,ease_str)\n",
"ax.text(0.1,0.3,'Linear',alpha=0.5)\n",
"e = dpl.plot(x=0,y=0.75,c='k',marker='o',markersize=10,easing=ease)\n",
"l = dpl.plot(x=0,y=0.25,c='k',marker='o',markersize=10,alpha=0.5)\n",
"p = dpl.plot(x=x,y=y,c='C0')\n",
"e.translate((0,0),(1,0),200)\n",
"l.translate((0,0),(1,0),200)\n",
"p.draw(200)\n",
"tl.animate((e,l,p))\n",
"tl.wait(25)\n",
"tl.save_video(path='../_static/easings/customEase.mp4',speed=4)"
]
}
],
"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.13.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}