1{
2 "cells": [
3  {
4   "cell_type": "markdown",
5   "metadata": {},
6   "source": [
7    "# Smoothing paths"
8   ]
9  },
10  {
11   "cell_type": "code",
12   "execution_count": 1,
13   "metadata": {},
14   "outputs": [
15    {
16     "data": {
17      "image/png": "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\n",
18      "image/svg+xml": [
19       "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n",
20       "<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" version=\"1.1\" viewBox=\"-1 -57.6929 115.386 58.6929\" x=\"-1pt\" y=\"-57.6929pt\" width=\"115.386pt\" height=\"58.6929pt\" stroke-width=\"0.566929\" stroke-miterlimit=\"10.000000\">\n",
21       " <path d=\"M0 -0L56.6929 -56.6929C56.6929 -0 85.0394 -0 113.386 -0\" stroke=\"black\"/>\n",
22       " <path d=\"M0 -0L36.6489 -36.6489C40.3056 -40.3056 52.9617 -52.9617 59.9811 -28.6288C68.2398 1.06581e-14 90.8128 -7.10543e-15 113.386 -3.55271e-15\" stroke=\"#00f\"/>\n",
23       " <path d=\"M0 -0L16.605 -16.605C26.5436 -26.5436 47.3258 -22.8681 75.9827 -6.10352C86.4159 2.66454e-15 99.9009 -1.77636e-15 113.386 8.88178e-16\" stroke=\"#f00\"/>\n",
24       "</svg>\n"
25      ]
26     },
27     "execution_count": 1,
28     "metadata": {},
29     "output_type": "execute_result"
30    }
31   ],
32   "source": [
33    "from pyx import *\n",
34    "\n",
35    "c = canvas.canvas()\n",
36    "p = path.line(0, 0, 2, 2)\n",
37    "p.append(path.curveto(2, 0, 3, 0, 4, 0))\n",
38    "c.stroke(p)\n",
39    "c.stroke(p, [deformer.smoothed(1.0), color.rgb.blue])\n",
40    "c.stroke(p, [deformer.smoothed(2.0), color.rgb.red])\n",
41    "c"
42   ]
43  },
44  {
45   "cell_type": "markdown",
46   "metadata": {},
47   "source": [
48    "This example shows how to use the `deformer` class. A deformer takes an\n",
49    "original path and return a modified one, which is here a smoothed variant. The\n",
50    "deformer can be used like any other attribute when stroking or filling a path.\n",
51    "\n",
52    "Here, we show the use of `deformer.smoothed`, which smoothes away corners in\n",
53    "the original path.  It operates on the `pathitem`s of the original path and\n",
54    "cuts out pieces of a given length (`1.0` in the example) surrounding a corner\n",
55    "and replaces them by a smooth curve. This new curve is determined to be\n",
56    "*geometrically smooth*, exhibiting the same tangents and curvatures as the\n",
57    "original path at the connection points. Alltogether, the smoothing is performed\n",
58    "not in a strictly *geometrical* sense but also depends on the\n",
59    "parameterization of the path. If you try to smooth a path consisting of many\n",
60    "short path elements, nothing will really change.\n",
61    "\n",
62    "<img src=\"http://pyx.sourceforge.net/bend.png\" align=\"left\"> In all deformers, the deformed path can be accessed directly by\n",
63    "\n",
64    "    ps = deformer.smoothed(1.0).deform(p)\n"
65   ]
66  }
67 ],
68 "metadata": {
69  "language": "python"
70 },
71 "nbformat": 4,
72 "nbformat_minor": 2
73}