Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Discretize path with numpy array and equal distance between points

Tags:

python

numpy

Lets say I have a path in a 2d-plane given by a parametrization, for example the archimedian spiral:

x(t) = a*φ*cos(φ), y(t) = a*φ*sin(φ)

Im looking for a way to discretize this with a numpy array, the problem is if I use

a = 1
phi = np.arange(0, 10*np.pi, 0.1)
x = a*phi*np.cos(phi)
y = a*phi*np.sin(phi)
plt.plot(x,y, "ro")

I get a nice curve but the points don't have the same distance, for growing φ the distance between 2 points gets larger. Im looking for a nice and if possible fast way to do this.

like image 914
jrsm Avatar asked Sep 19 '25 01:09

jrsm


1 Answers

It might be possible to get the exact analytical formula for your simple spiral, but I am not in the mood to do that and this might not be possible in a more general case. Instead, here is a numerical solution:

import matplotlib.pyplot as plt
import numpy as np
a = 1
phi = np.arange(0, 10*np.pi, 0.1)
x = a*phi*np.cos(phi)
y = a*phi*np.sin(phi)

dr = (np.diff(x)**2 + np.diff(y)**2)**.5 # segment lengths
r = np.zeros_like(x)
r[1:] = np.cumsum(dr) # integrate path
r_int = np.linspace(0, r.max(), 200) # regular spaced path
x_int = np.interp(r_int, r, x) # interpolate
y_int = np.interp(r_int, r, y)

plt.subplot(1,2,1)
plt.plot(x, y, 'o-')
plt.title('Original')
plt.axis([-32,32,-32,32])

plt.subplot(1,2,2)
plt.plot(x_int, y_int, 'o-')
plt.title('Interpolated')
plt.axis([-32,32,-32,32])
plt.show()

It calculates the length of all the individual segments, integrates the total path with cumsum and finally interpolates to get a regular spaced path. You might have to play with your step-size in phi, if it is too large you will see that the spiral is not a smooth curve, but instead built from straight line segments. Result: enter image description here

like image 118
Bas Swinckels Avatar answered Sep 20 '25 16:09

Bas Swinckels