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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
|
Points = csvread('points artificiels.txt');
A = [85 70 90; 30 85 70; 30 70 90; 120 85 90; 55 30 90;110 80 90; 40 55 30; 40 55 90; 75 110 90; 75 40 90]
B = [90 55; 55 70; 70 85; 85 90]
C = [90 ; 55; 70]
[m,n]=size(A);
[p q]=size(B);
% On cherche les pairs exactes de couple de colonnes de A et de B (lignes triées par ordre croissant)
D = [];
sA=sort([A(:,[1 2]);A(:,[1 3]);A(:,[2 3])],2);
for i=1:p,
idx=ismember(sA,sort(B(i,:),2),'rows');
% idx=ismember(sort([A(:,[1 2]);A(:,[1 3]);A(:,[2 3])],2),sort(B,2),'rows') % on decompose A de deux éléments en deux éléments (par ordre croissant) et on le compare avec B 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 A et B correspondent)
% On transforme idx pour retrouver les indices entre 1 et size(A,1)
r=idx-m*floor(idx/m);
r=r+m*(r==0); % là où r est égal à 0 on remplace par le nombre de lignes de A
% On détermine à quelle colonne appartenait la troisième valeur (pas dans B)
% On utilise le rangement [A(:,[1 2]);A(:,[1 3]);A(:,[2 3])]
c=(idx<=m)+(idx<=2*m)+(idx<=3*m);
% On transforme r et c en indices linéraires
idx=sub2ind([m n],r,c);
% On sépare les valeurs qui ne doivent pas être dans C et on conserve
% toutes les valeurs des itérations !
tempD = setdiff(A(idx),C(:))
% PROBLEME 1 : 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) % j'arrive pas à traduire cette condition
D = [D; 0];
% OK -> PROB résolu !
% PROBLEME 2 : si deux éléments intégrés par ligne de B (le nombre max de points intégrés ne peut être que 2), on ne garde que l'élément qui
% figure le plus près du Segment (je fais simplement la moyenne des
% distances du points aux deux extrémités du segment!)
elseif numel(tempD)>1 % j'arrive pas à traduire cette condition
indice1 = tempD (1,1);
indice2 = tempD (2,1);
% remplacer tous les D par tempD
% indice1 et indice2 correspondent aux indices des points
% semblables dans la matrice D (il faudrait un truc pour les
% retrouver) --> normalement indice2 = indice1 + 1 (on peut garder
% cela vu qu'on supprimera un des deux DONC la concordance des
% lignes entre B et D sera conservée !
% calcul des 2 distances
%Prob pour B --> il faut retrouver son indice --> i ???
Dist1a = sqrt((Points(indice1,1)-Points(B(i,1),1))^2+(Points(indice1,2)-Points(B(i,1),2))^2+(Points(indice1,3)-Points(B(i,1),3))^2);
Dist1b = sqrt((Points(indice1,1)-Points(B(i,1),1))^2+(Points(indice1,2)-Points(B(i,1),2))^2+(Points(indice1,3)-Points(B(i,1),3))^2);
Dist1 = (Dist1a + Dist1b)/2;
Dist2a = sqrt((Points(indice2,1)-Points(B(i,1),1))^2+(Points(indice2,2)-Points(B(i,1),2))^2+(Points(indice2,3)-Points(B(i,1),3))^2);
Dist2b = sqrt((Points(indice2,1)-Points(B(i,1),1))^2+(Points(indice2,2)-Points(B(i,1),2))^2+(Points(indice2,3)-Points(B(i,1),3))^2);
Dist2 = (Dist2a + Dist2b)/2;
% on élimine dans D l'élément qui présente la plus grande distance
if Dist1 > Dist2,
tempD = tempD (2,1)
else
%if Dist2 > Dist1,
tempD = tempD (1,1)
end
% end
end
D = [D; tempD]
end
% % PROBLEME 3 : si plusieurs éléments de D sont semblables, on ne conserve que le point le
% % plus proche du segment et on attribue le code 0 à l'autre.
% je crée une table valeur - fréquence d'apparition et je ferai des tests
% de distance selon que fréquence = 2, 3 (je suppose qu'il n'est pas
% possible qu'il y en ait +)
uniqD=unique(D)
nD=histc(D,uniqD)
TabD = [uniqD(:) nD(:)]
% SI 2 OCCURRENCES
nD2 = find (nD ==2)
nD2Tab = TabD(nD2,1)
% il faut connaître les deux points du segment voisin à partir desquels on
% fait les mesures de distance --> on doit donc retrouver la ligne dans D
% où figure la valeur (nD1Tab) et on aura les points voisins en prenant les
% points correspondant de B
nD2TabTest = ismember(D,nD2Tab)
Tamp2 = nD2TabTest*1; % car plus loin on aimerait changer la matrice logique mais on peut pas directement
[dd ddd] = size (D)
for i=1:dd,
if D(i,1) == 0,
Tamp2 (i,1) = 9999 % de cette façon on est certain que il considere tjs le passage d'une ligne mais que cette valeur ne sera jamais prise dans les conditions ci-dessous
end
end
Indice2Tab = find (Tamp2 == 1)
D2 = D([Indice2Tab],:)
Coord2PtsVoisins = B([Indice2Tab],:)
% les lignes de D1 correspondent à celles de Coord2PtsVoisins
% on fait maintenant le test pour les distances
TabDist2a = ((Points([Coord2PtsVoisins(:,1)],1)-Points([D2],1)).^2+(Points([Coord2PtsVoisins(:,1)],2)-Points([D2],2)).^2+(Points([Coord2PtsVoisins(:,1)],3)-Points([D2],3)).^2).^(1/2);
TabDist2b = ((Points([Coord2PtsVoisins(:,2)],1)-Points([D2],1)).^2+(Points([Coord2PtsVoisins(:,2)],2)-Points([D2],2)).^2+(Points([Coord2PtsVoisins(:,2)],3)-Points([D2],3)).^2).^(1/2);
TabDist2 = (TabDist2a + TabDist2b)/2
MinTabDist2 = min(TabDist2)
% % on sélectionne l'indice qui se réfère à le plus petite distance
% % et on garde celui là alors qu'on attribue le code 0 aux autres
% % points.
xxx2 = find (Tamp2 == 1)
indices = xxx2((find (TabDist2 == MinTabDist2))',1)
D ((indices)',1) = 0
% SI 3 OCCURRENCES
nD3 = find (nD ==3)
nD3Tab = TabD(nD3,1)
% il faut connaître les deux points du segment voisin à partir desquels on
% fait les mesures de distance --> on doit donc retrouver la ligne dans D
% où figure la valeur (nD1Tab) et on aura les points voisins en prenant les
% points correspondant de B
nD3TabTest = ismember(D,nD3Tab)
Tamp3 = nD3TabTest*1; % car plus loin on aimerait changer la matrice logique mais on peut pas directement
[dd ddd] = size (D)
for i=1:dd,
if D(i,1) == 0,
Tamp3 (i,1) = 9999 % de cette façon on est certain que il considere tjs le passage d'une ligne mais que cette valeur ne sera jamais prise dans les conditions ci-dessous
end
end
Indice3Tab = find (Tamp3 == 1)
D3 = D([Indice3Tab],:)
Coord3PtsVoisins = B([Indice3Tab],:)
% les lignes de D3 correspondent à celles de Coord1PtsVoisins
% pour envisager tous les cas, je décide de rajouter 2 lignes artificielles
% (faudra supprimer)
% on fait maintenant le test pour les distances
TabDist3a = ((Points([Coord3PtsVoisins(:,1)],1)-Points([D3],1)).^2+(Points([Coord3PtsVoisins(:,1)],2)-Points([D3],2)).^2+(Points([Coord3PtsVoisins(:,1)],3)-Points([D3],3)).^2).^(1/2);
TabDist3b = ((Points([Coord3PtsVoisins(:,2)],1)-Points([D3],1)).^2+(Points([Coord3PtsVoisins(:,2)],2)-Points([D3],2)).^2+(Points([Coord3PtsVoisins(:,2)],3)-Points([D3],3)).^2).^(1/2);
TabDist3 = (TabDist3a + TabDist3b)/2
MinTabDist3 = min(TabDist3)
% % on sélectionne l'indice qui se réfère à le plus petite distance
% % et on garde celui là alors qu'on attribue le code 0 aux autres
% % points.
xxx3 = find (Tamp3 == 1)
indices = xxx3((find (TabDist3 == MinTabDist3))',1)
D ((indices)',1) = 0 |
Partager