Interpolation de coordonnées

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
stick25
Membre Naturel
Messages: 19
Enregistré le: 02 Juin 2010, 08:41

Interpolation de coordonnées

par stick25 » 22 Juin 2010, 13:37

Bonjour,

j'espère que je vais être clair dans l'exposition de mon problème et que vous allez prendre le temps de me lire, car j'ai besoin d'aide d'experts comme vous.

J'ai une série de points en 3D, formant une courbe. Ces points sont séparés d'environ 1 (mètre par exemple, valeurs variables). Je souhaiterais avoir au final un fichier de points distants de 5 (mètres). Cette dernière valeur est alors calculée en faisant la somme des distances partielles (distance entre chaque point). Ainsi pour avoir la valeur 5 exactement, il faudra donc créer des interpolations. C'est-à-dire, lorsque cette valeur se trouve entre deux points connus, on interpolera linéairement pour avoir les coordonnées du point recherché. Ce dernier sera alors par la suite intégré à la liste de points pour calculer les distances partielles

J'arrive à programmer ceci mais pour créer un seul point, je ne vois pas comment faire une boucle qui se répèterait jusqu'à la fin de la liste original.

Je pense que vous comprendrez mieux en exécutant le code suivant avec le fichier de points suivant :
Code: Tout sélectionner
function[]=interpolation(txt)

M=dlmread(txt);

Final = [M(1,1) M(1,2) M(1,3)];


for i=1:length(M)-1
    D(i,1)=sqrt((M(i,1)-M(i+1,1))^2+(M(i,2)-M(i+1,2))^2+(M(i,3)-M(i+1,3))^2);
end

for j=1:length(D)
    Dpro(j,1)=D(j,1);
    Dcumul(j,1)=sum(Dpro);
end
 

for k=1:length(Dcumul)

    if Dcumul(k,1)>5 && Dcumul(k-1,1)<5
        Dtot=Dcumul(k,1)-Dcumul(k-1,1);
        Dint=5-Dcumul(k-1,1);
       
        Final(k,1)= M(k,1)+(M(k+1,1)-M(k,1))*Dint/Dtot;
        Final(k,2)= M(k,2)+(M(k+1,2)-M(k,2))*Dint/Dtot;
        Final(k,3)= M(k,3)+(M(k+1,3)-M(k,3))*Dint/Dtot;
       
        M(k+1,1)=Final(k,1);
        M(k+1,2)=Final(k,2);
        M(k+1,3)=Final(k,3);

    end
end


%on supprime les 0
ligneasupprimer = [];
for l=1:length(Final)
    if (Final(l,1)==0) & (Final(l,2)==0) & (Final(l,3)==0)
    ligneasupprimer = [ligneasupprimer l];   
    end
end
Final(ligneasupprimer,:) = [];

Final


Fichier de points :
35 47 1
34.486 46.837 1.5204
33.857 46.68 2.1674
33.125 46.525 2.9271
32.302 46.368 3.7857
31.4 46.206 4.7291
30.431 46.035 5.7434
29.407 45.852 6.8148
28.34 45.653 7.9293
27.242 45.434 9.0729
26.125 45.193 10.232
25 44.925 11.392
23.88 44.627 12.539
22.778 44.295 13.66
21.704 43.926 14.741
20.671 43.516 15.767
19.69 43.062 16.724
18.775 42.56 17.6
17.936 42.006 18.379
17.186 41.397 19.048
16.537 40.73 19.593
16 40 20


Un grand merci d'avance,

Cordialement.



mathelot

par mathelot » 22 Juin 2010, 13:54

salut,

on peut considérer la ligne brisée joignant les points et
calculer les coordonnées des points de 5 en 5

s'il y a très peu de points, on fait deux passages

1er passage
calcul de la longueur totale L
calcul unité de longueur u=L/(n-1) où n est le nombre de points
2eme passage
on calcule les points de 5u en 5u

stick25
Membre Naturel
Messages: 19
Enregistré le: 02 Juin 2010, 08:41

par stick25 » 22 Juin 2010, 15:38

Oui en fait c'est ça ; je considère que c'est une ligne brisée (passant par tout les points) et je calcul des coordonnées de points tout les 5.

Mais pour traduire ceci en lignes de code c'est plus difficile.

Si quelqu'un peut m'éclairer... merci d'avance

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 41 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite