{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "So I've been impressed with [IPython](http://ipython.org/) so far, it can be a little fiddly to install, but given the power I'm not going to complain. I'm now working on [graphics](https://code.google.com/p/skia) and in trying to get up to speed going back and learning, or relearning, some basics. Today was B\u00e9zier curves. Note that the below isn't actually educational, you should follow the links provided to really learn about these constructs, I just wanted an excuse to try out LaTeX and plot some interesting graphs." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%pylab inline" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Quadratic B\u00e9zier curve is a function of _t_, where _t_ ranges from 0 to 1.\n", "\n", "$$\\mathbf{B}(t) = (1 - t)^{2}\\mathbf{P}_0 + 2(1 - t)t\\mathbf{P}_1 + t^{2}\\mathbf{P}_2 \\mbox{ , } t \\in [0,1].$$\n", "\n", "Where $\\mathbf{P}_n$ are the control points. So if we define the function in a way we can use it, and then define some values for the control points:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def B(t):\n", " return (1-t)**2*p0 + 2*t*(1-t)*p1 + t**2*p2\n", "\n", "p0 = np.array([0, 0])\n", "p1 = np.array([1.5, 1])\n", "p2 = np.array([2, 0])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can then plot what that parametrized curve looks like." ] }, { "cell_type": "code", "collapsed": false, "input": [ "xy = np.array([B(t) for t in np.linspace(0, 1, 20)]).T\n", "plot(xy[0], xy[1])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nQ/8fwLldEzgNjY4AAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 18 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Cubic B\u00e9zier curve has the form of: \n", "\n", "$$\\mathbf{R}(t)=(1-t)^3\\mathbf{P}_0+3(1-t)^2t\\mathbf{P}_1+3(1-t)t^2\\mathbf{P}_2+t^3\\mathbf{P}_3 \\mbox{ , } t \\in [0,1].$$\n", "\n", "Again, we can define the function and plot it for a given set of points:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def R(t):\n", " return (1-t)**3 * p0 + 3 * t * (1-t)**2 * p1 + 3 * t**2 * (1-t) * p2 + t**3 * p3" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "p3 = np.array([1, -2])\n", "xy = np.array([R(t) for t in np.linspace(0, 1, 30)]).T\n", "plot(xy[0], xy[1])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nPxGRh/l/AkocpYxDbOQAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Also interesting are the [Uniform cubic B-splines](http://ipe7.sourceforge.net/manual/manual_16.html) or simply [Bezier splines](http://en.wikipedia.org/wiki/B%C3%A9zier_spline), which can be concatenated smoothly." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def Q(t, p0, p1, p2, p3):\n", " return (((1-t)**3)/(6)) * p0 + ((3*t**3 -6*t**2 + 4)/(6)) * p1 + ((-3*t**3 + 3*t**2 + 3*t + 1)/(6)) * p2 + ((t**3)/(6)) * p3" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "p4 = np.array([-1, -1])\n", "p5 = np.array([1, 3])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 32 }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we now use our 6 points and plot 4 at a time and keep shifting in one new control point then the spline closes itself." ] }, { "cell_type": "code", "collapsed": false, "input": [ "xy = np.array([Q(t, p0, p1, p2, p3) for t in np.linspace(0, 1, 30)]).T\n", "plot(xy[0], xy[1])\n", "xy = np.array([Q(t, p1, p2, p3, p4) for t in np.linspace(0, 1, 30)]).T\n", "plot(xy[0], xy[1])\n", "xy = np.array([Q(t, p2, p3, p4, p5) for t in np.linspace(0, 1, 30)]).T\n", "plot(xy[0], xy[1])\n", "xy = np.array([Q(t, p3, p4, p5, p0) for t in np.linspace(0, 1, 30)]).T\n", "plot(xy[0], xy[1])\n", "xy = np.array([Q(t, p4, p5, p0, p1) for t in np.linspace(0, 1, 30)]).T\n", "plot(xy[0], xy[1])\n", "xy = np.array([Q(t, p5, p0, p1, p2) for t in np.linspace(0, 1, 30)]).T\n", "plot(xy[0], xy[1])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 33, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 33 }, { "cell_type": "markdown", "metadata": {}, "source": [ "IPython made all the above possible, you can download the source for this page from [here]() and import it into your own IPython notebook and start working from there. Also, this blog page was generated from that same source with the nbconvert program." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }