Matlab - Interpolation de coordonnées
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Matlab - Interpolation de coordonnées



  1. #1
    invite1038f851

    Matlab - Interpolation de coordonnées


    ------

    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 *.txt joint à ce message :

    Code:
    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
    Un grand merci d'avance,

    Cordialement.

    -----
    Fichiers attachés Fichiers attachés

  2. #2
    inviteae4072e1

    Re : Matlab - Interpolation de coordonnées

    Des commentaires sur ton code serait pas mal...

  3. #3
    invite1038f851

    Re : Matlab - Interpolation de coordonnées

    Mon code peut également être écris de la manière suivante si l'on vectorise :

    Code:
    M=dlmread('essai.txt');
    D2 = sqrt(sum((M(2:end,:)-M(1:end-1,:)).^2,2));
    Dcumul = cumsum(D2);
    indice = find(Dcumul-5>0,1,'first');
    Dtot=Dcumul(indice)-Dcumul(indice-1);
    Dint=5-Dcumul(indice-1);
           
    Final = M(indice,:)+(M(indice+1,:)-M(indice,:))*Dint/Dtot;
    Ceci est certainement plus explicite que le précédent code. Sinon quels commentaires attends-tu ?

    Merci d'avance

  4. #4
    inviteae4072e1

    Re : Matlab - Interpolation de coordonnées

    Pas évident de comprendre ce que tu veux faire.

    Connais-tu les structures en Matlab ? Ceci pourrait bien t'aider
    Par exemple (en ayant adapté tes lignes de code aux structures) :

    Code:
    for i = 1 : Nombre Total de points
    Final{i} = M{i}(indice,:)+(M{i}(indice+1,:)-M{i}(indice,:))*Dint/Dtot;
    end

  5. A voir en vidéo sur Futura
  6. #5
    invite28cfa908

    Re : Matlab - Interpolation de coordonnées

    Citation Envoyé par stick25 Voir le message
    Sinon quels commentaires attends-tu ?
    Il est assez difficile de comprendre ce que tu veut faire: des commentaires (avec "%") au sein de ton code pour, par exemple, expliquer le rôle des diverses variables permettraient de mieux comprendre ce que tu fais.

    Sinon, une remarque générale: préfère toujours l'écriture matricielle/vectorielle. En plus d'être plus joli/compact/lisible, ça permet d'accélérer les calculs.

  7. #6
    invite1038f851

    Re : Matlab - Interpolation de coordonnées

    Bon maintenant j'ai un code qui marche :

    Code:
    M=dlmread('essai.txt');
    
    D2 = sqrt(sum((M(2:end,:)-M(1:end-1,:)).^2,2));
    % distance entre chaque point
    
    Dcumul = cumsum(D2);
    % distance cumulée
    
    Final=M(1,:);
    
    compteur = 2;
    
    for m=5:5:Dcumul(end)
        
        indice = find(Dcumul-m>0,1,'first');
        Dtot=Dcumul(indice)-Dcumul(indice-1);
        Dint=m-Dcumul(indice-1);
        
        Final(compteur,:) = M(indice,:)+(M(indice+1,:)-M(indice,:))*Dint/Dtot;
        compteur = compteur +1;
        
    %on interpole grâce à Dtot et Dint
    
    end
    Cependant un dernier détail à régler, et j'espère que vous allez pouvoir m'aider.

    Maintenant le fichier de points en entrée a 4 colonnes. La 4e colonne est remplie de 0 sauf pour quelques lignes. J'aimerais que le calcul d'interpolation insère ces lignes au bon endroit dans le fichier de point final.

    C'est à dire que l'on parcourt le fichier de points via la liste des distances cumulée de 5 en 5 et il faudrait que dès que l'on rencontre un point dont la 4e colonne n'est pas égale à 0, on insère ce point dans la liste de coordonnées final (quelqu'en soit la distance par rapport aux points voisins).

    J'espère que c'est pas trop flou ce que je raconte.

    J'ai déjà adapter le code pour calculer les distance sur les trois première colonne, mais je ne vois pas comment tenir compte de la 4e...
    Mon code est le suivant (la valeur di est la valeur d'interpolation ; 5 par exemple) :

    Code:
    function[]=interpol(txt,di)
    
    M=dlmread(txt);
    
    D2 = sqrt(sum((M(2:end,1:3)-M(1:end-1,1:3)).^2,2));
    Dcumul = cumsum(D2);
    Final=M(1,:);
    compteur = 2;
    
    for m=di:di:Dcumul(end)
        
        indice = find(Dcumul-m>0,1,'first');
        Dtot=Dcumul(indice)-Dcumul(indice-1);
        Dint=m-Dcumul(indice-1);
        
        Final(compteur,1:3) = M(indice,1:3)+(M(indice+1,1:3)-M(indice,1:3))*Dint/Dtot;
        compteur = compteur +1;
        
    end
    
    
    Final
    
    Test_dist = sqrt(sum((Final(2:end,1:3)-Final(1:end-1,1:3)).^2,2))

    Je joins également à ce post un fichier de points avec 4 colonnes.


    J'espère vraiment que vous allez pouvoir m'aider pour cette étape finale.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/07/2009, 08h25
  2. interpolation sous matlab
    Par invitea255964f dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 29/05/2009, 09h38
  3. interpolation avec matlab
    Par inviteb30475d2 dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 30/08/2008, 14h08
  4. Interpolation MNT sous Matlab
    Par invitea24f1a90 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 14/04/2008, 10h39
  5. Interpolation en MATLAB
    Par invite42d0c639 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 26/11/2007, 07h47