Last active
April 21, 2017 15:31
-
-
Save benbovy/f41dad2efdb3610decd75e8e168e494d to your computer and use it in GitHub Desktop.
Uniform Interpolation on a 2-dimensional parametric curve
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# \"Uniform\" interpolation on a 2-dimensional parametric curve" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"from scipy import interpolate\n", | |
"from scipy import optimize\n", | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Original data\n", | |
"\n", | |
"A parametric 2-dimensional curve defined from non-equally spaced points on both axes" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"n_points = 20\n", | |
"\n", | |
"x = np.arange(n_points) + np.random.normal(scale=1.3, size=n_points)\n", | |
"y = np.arange(n_points) + np.random.normal(scale=1.3, size=n_points)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x11af114a8>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig = plt.figure(figsize=(8, 8))\n", | |
"plt.plot(x, y, marker='.')\n", | |
"_ = plt.axis('equal')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Spline interpolation\n", | |
"\n", | |
"We want to choose the interpolation points such that the euclidean distance between to consecutive points is constant (spacing $r$ = cst).\n", | |
"\n", | |
"The method is the following:\n", | |
"\n", | |
"- We start from the 1st point $p_0$ on the curve, which has the internal coordinate $u = 0$.\n", | |
"- The next point will be the point on the curve that intersect the circle centered on $p_0$ with radius $r$. This is equivalent of finding the root of the function:\n", | |
"\n", | |
"$$f(u) = (x(u) − x(p_0))^2 + (y(u) − y(p_0))^2 − r^2$$\n", | |
"\n", | |
"- We repeat the operation above for each next point, as long as $u <= 1$." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def dist2circle(u, uc, r, tck):\n", | |
" \"\"\"Returns the euclidean distance between a point on the spline curve\n", | |
" given by `u` and the circle with radius `r` and centered\n", | |
" on another, fixed point of the curve given by `uc`. The spline is defined\n", | |
" by `tck`. Also return the 1st derivative.\n", | |
" \"\"\"\n", | |
" x, y = interpolate.splev(u, tck)\n", | |
" #x_prim, y_prim = interpolate.splev(u, tck, der=1)\n", | |
" xc, yc = interpolate.splev(uc, tck)\n", | |
" \n", | |
" dist = (x - xc)**2 + (y - yc)**2 - r**2\n", | |
" #dist_prim = 2 * (-xc + x) * x_prim + 2 * (-yc + y) * y_prim\n", | |
" \n", | |
" return dist #, dist_prim" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def find_intersect(uc, r, tck):\n", | |
" \"\"\"find the internal coordinate `u` that is the intersection\n", | |
" between a parametric curve and a circle of radius `r`\n", | |
" centered on the internal coordinate `uc`.\n", | |
" \"\"\"\n", | |
" #u = optimize.newton(dist2circle, uc, args=(uc, r, tck), maxiter=1000)\n", | |
" u = optimize.brentq(dist2circle, uc, uc + 0.2, args=(uc, r, tck))\n", | |
" return u" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def interpolate_uniform(x, y, spacing):\n", | |
" \"\"\"Interpolate a 2-d parametric curve such that the\n", | |
" resulting points are equidistant (euclidean distance in the\n", | |
" (x, y) space).\"\"\"\n", | |
" \n", | |
" # total curve distance and initial number of new points\n", | |
" dist = np.sqrt((x[1:] - x[:-1])**2 + (y[1:] - y[:-1])**2)\n", | |
" total_dist = np.sum(dist)\n", | |
" n = int(total_dist / spacing)\n", | |
" \n", | |
" # initialize internal coordinates\n", | |
" u = np.zeros(n)\n", | |
" \n", | |
" # interpolator\n", | |
" tck, _ = interpolate.splprep([x, y], k=1, s=0)\n", | |
" \n", | |
" # find next equidistant point on the curve (loop)\n", | |
" uc = 0.\n", | |
" i = 1\n", | |
" while uc <= 1:\n", | |
" u1 = find_intersect(uc, spacing, tck)\n", | |
" u[i] = u1\n", | |
" uc = u1\n", | |
" i += 1\n", | |
" \n", | |
" x_new, y_new = interpolate.splev(u[:i], tck)\n", | |
" \n", | |
" return x_new, y_new" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"spacing = 0.8\n", | |
"x_new, y_new = interpolate_uniform(x, y, spacing)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\neHY+3gvkAAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x11d10cc88>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig = plt.figure(figsize=(8, 8))\n", | |
"plt.plot(x_new, y_new, marker='.')\n", | |
"_ = plt.axis('equal')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"check the distances between each new interpolated points" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"True" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"dist = np.sqrt((x_new[1:] - x_new[:-1])**2 + (y_new[1:] - y_new[:-1])**2)\n", | |
"np.allclose(dist, spacing)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"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.6.0" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment