python nuage - Comment redistribuer les points uniformément sur une courbe




2 Answers

J'utiliserais interparc , un de mes outils conçus pour faire exactement cela. Il adapte une spline à travers une courbe d'espace générale en 2 dimensions ou plus, puis choisit des points qui sont équidistants en termes de distance le long de cette courbe. Dans le cas d'une spline cubique, la solution utilise un odesolver pour faire ce qui doit être une intégration numérique donc c'est un peu plus lent, mais c'est quand même raisonnablement rapide. Dans de nombreux cas, une simple interpolation linéaire (comme je l'ai utilisé ici) sera entièrement adéquate et extrêmement rapide.

La courbe peut être complètement générale, se croisant même sur elle-même. Je vais donner un exemple simple pour une courbe spatiale de 3 jours:

t = linspace(0,1,500).^3;
x = sin(2*pi*t);
y = sin(pi*t);
z = cos(3*x + y);
plot3(x,y,z,'o')
grid on
box on
view(-9,12)

xyzi = interparc(100,x,y,z,'lin');
plot3(xyzi(:,1),xyzi(:,2),xyzi(:,3),'o')
box on
grid on
view(-9,12)

de matplotlib

J'ai une courbe arbitraire en 3 dimensions composée d'une liste de points cartésiens XYZ. Les points ne sont pas répartis uniformément (il y a un facteur temps). Comment puis-je "reconstruire" la courbe avec un nombre donné de points qui devraient constituer la courbe. Je vois cela fait dans les programmes de modélisation 3D donc je suis assez sûr que c'est possible, je ne sais pas comment.

Basé sur la réponse, j'avais besoin de ça en python, j'ai donc commencé à travailler pour convertir interparc en python. Je suis allé jusqu'à l'interpolation linéaire. Il est probablement inefficace et a des redondances, mais peut-être que cela sera utile à quelqu'un http://pastebin.com/L9NFvJyA




Tout d'abord, merci à M. John D'Errico pour interparc. Quel beau travail!

Moi aussi je faisais face à ce problème mais je ne suis pas familier avec l'API du moteur MATLAB. Compte tenu de cela, j'ai essayé de convertir une partie du code Matlab interparc en Python (en incluant simplement l'interpolant linéaire car cela suffirait à résoudre mon problème).

Et donc voici mon code; espérons qu'il peut aider tous les pythoniens à chercher quelque chose de similaire:

import numpy as np

def interpcurve(N,pX,pY):
#equally spaced in arclength
N=np.transpose(np.linspace(0,1,N))

#how many points will be uniformly interpolated?
nt=N.size

#number of points on the curve
n=pX.size
pxy=np.array((pX,pY)).T
p1=pxy[0,:]
pend=pxy[-1,:]
last_segment= np.linalg.norm(np.subtract(p1,pend))
epsilon= 10*np.finfo(float).eps

#IF the two end points are not close enough lets close the curve
if last_segment > epsilon*np.linalg.norm(np.amax(abs(pxy),axis=0)):
    pxy=np.vstack((pxy,p1))
    nt = nt + 1
else:
    print('Contour already closed')

pt=np.zeros((nt,2))

#Compute the chordal arclength of each segment.
chordlen = (np.sum(np.diff(pxy,axis=0)**2,axis=1))**(1/2)
#Normalize the arclengths to a unit total
chordlen = chordlen/np.sum(chordlen)
#cumulative arclength
cumarc = np.append(0,np.cumsum(chordlen))

tbins= np.digitize(N,cumarc) # bin index in which each N is in

#catch any problems at the ends
tbins[np.where(tbins<=0 | (N<=0))]=1
tbins[np.where(tbins >= n | (N >= 1))] = n - 1      

s = np.divide((N - cumarc[tbins]),chordlen[tbins-1])
pt = pxy[tbins,:] + np.multiply((pxy[tbins,:] - pxy[tbins-1,:]),(np.vstack([s]*2)).T)

return pt 



Related

python math 3d

Tags

python   math   3d