1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
% valeurs de SF et de TabDel pour lesquelles ça fonctionne
%SF = [ 2 3 ; 3 4 ; 4 5 ; 5 6 ; 6 7 ; 7 2]
%NB : lorsqu'on exécute , on obtient bien D = [9 ; 0 ; 10 ; 11 ; 12 ; 8 ]
%TabDel = [ 7 8 2 ; 2 9 3 ; 4 10 5 ; 5 11 6 ; 6 12 7 ]
% valeurs de SF et de TabDel pour lesquelles ça ne fonctionne pas
SF = [ 2 9 ; 9 3 ; 3 4 ; 4 10 ; 10 5 ; 5 11 ; 11 6 ; 6 12 ; 12 7 ; 7 8 ; 8 2 ]
TabDel = [ 7 13 8 ; 9 14 3 ; 4 15 10 ; 10 5 16 ; 5 16 11 ; 11 17 6 ; 6 17 12 ; 12 18 7]
% NB : TabDel correspond aux triangles à l'extérieur du polyligne frontière
[mm nn]=size(TabDel);
[pp qq]=size(SF);
% On cherche les pairs exactes de couple de colonnes de TabDel et de SF (lignes triées par ordre croissant)
D = []; % D correspondra au final aux points frontieres à integrer dans la table SF (il ne s'agit pas de tout les points du Segment !)
sTabDel=sort([TabDel(:,[1 2]);TabDel(:,[1 3]);TabDel(:,[2 3])],2);
for i=1:pp,
idx=ismember(sTabDel,sort(SF(i,:),2),'rows'); % on decompose TabDel de deux éléments en deux éléments (par ordre croissant) et on le compare avec SF classé par ordre croissant de lignes
idx=find(idx); % idx est compris entre 1 et 3*size(A,1), idx correspond maintenant aux nums de lignes qui présentent la valeur 1 ci-dessus (donc TabDel et SF correspondent)
% On transforme idx pour retrouver les indices entre 1 et size(TabDel,1)
rr=idx-mm*floor(idx/mm);
rr=rr+mm*(rr==0); % là où r est égal à 0 on remplace par le nombre de lignes de TabDel
% On détermine à quelle colonne appartenait la troisième valeur (pas dans B)
% On utilise le rangement [TabDel(:,[1 2]);TabDel(:,[1 3]);TabDel(:,[2 3])]
cc=(idx<=mm)+(idx<=2*mm)+(idx<=3*mm);
% On transforme r et c en indices linéraires
idx=sub2ind([mm nn],rr,cc);
% On sépare les valeurs qui ne doivent pas être dans Segment et on conserve
% toutes les valeurs des itérations !
tempD = setdiff(TabDel(idx),Segment(:,1));
% NB : si pas d'élément intégré par ligne de B, on met comme code 0 pour
% pouvoir spécifier après qu'on ne doit pas prendre en compte cet élément
if isempty(tempD),
D = [D; 0];
end
D = [D; tempD]
% PROB : je devrai trouver normalement comme vecteur D = [ 8 ; 14 ; 0 ; 15 ; 16 ; 16 ; 17 ; 17 ; 18 ; 13 ; 9 ]
end
PFAIntegrer = D;
% Je réactualise maintenant ma table SF
SF=reshape([SF(:,1) PFAIntegrer PFAIntegrer SF(:,2)].',2,[]).';
SF=[SF(SF(:,1)~=0,1) SF(SF(:,2)~=0,2)] |
Partager