A = [1,2,3; 2,5,7; 5,8,9]
D = eig(A) % retorna en un vector els valors propis (l'ordre de magnitud pot variar)
[V,D] = eig(A) % retorna en dues matrius els vectors i els valors propis. Les columnes de V
-0.2339 -0.5871 -0.3235
-0.5524 0.7364 -0.6608
-0.8001 -0.3362 0.6772
15.9853 0 0
0 0.2094 0
0 0 -1.1947
% son els vectors propis associats a cada valor propi.
% verifiquem que son vectors i valors propis dins la tolerància numèrica:
% apliquem la definició pel primer vector propi (1a columna de la matriu V)
error = A*V(:,1)-D(1,1)*V(:,1) %El que importa és l'exponent del resultat!!!
A = magic(5) % matriu especial en la que totes les files i columnes sumen el mateix
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
[V,D] = eig(A)
-0.4472 0.0976 -0.6330 0.6780 -0.2619
-0.4472 0.3525 0.5895 0.3223 -0.1732
-0.4472 0.5501 -0.3915 -0.5501 0.3915
-0.4472 -0.3223 0.1732 -0.3525 -0.5895
-0.4472 -0.6780 0.2619 -0.0976 0.6330
65.0000 0 0 0 0
0 -21.2768 0 0 0
0 0 -13.1263 0 0
0 0 0 21.2768 0
0 0 0 0 13.1263
% Per donar els vaps ordenats podem fer servir la comanda sort de Matlab
[variableInutil,permutacio] = sort(diag(D)); %determinem l'ordre creixent dins de permutacio
D = D(permutacio,permutacio) %reordenem les matrius corresponents
-21.2768 0 0 0 0
0 -13.1263 0 0 0
0 0 13.1263 0 0
0 0 0 21.2768 0
0 0 0 0 65.0000
V = V(:,permutacio)
0.0976 -0.6330 -0.2619 0.6780 -0.4472
0.3525 0.5895 -0.1732 0.3223 -0.4472
0.5501 -0.3915 0.3915 -0.5501 -0.4472
-0.3223 0.1732 -0.5895 -0.3525 -0.4472
-0.6780 0.2619 0.6330 -0.0976 -0.4472
A = [1,2,3; 2,5,7; 3,7,9] %matriu simètrica
[V,D] = eig(A) %els vectors V formen b.o.n.
0.3944 0.8855 0.2459
0.6712 -0.4603 0.5810
-0.6277 0.0641 0.7758
-0.3707 0 0
0 0.1776 0
0 0 15.1931
V(:,1)'*V(:,2) %veiem per exemple que <V1,V2>=0
% Coordenades en referència R1 (restem respecte del nou origen que és el centroid)
centroid=mean(punts); %fa les mitjanes per columnes
coord1=[punts(:,1)-centroid(1), punts(:,2)-centroid(2), punts(:,3)-centroid(3)];
% Calculem la matriu de covariances (és simètrica)
C(1,1)=sum(xx.*xx); % aquí fem la suma i producte de les x per les x
% Calculem les components principals (PCA)
% (son els eixos de la OBB)
% Expressem els punts en la referència R2 = {centroid; v1,v2,v3}. El canvi
% de referència R1 a referència R2 es fa, simplement, multiplicant per la
% inversa de V que coincideix amb la seva transposada: inv(V)=V' (perquè V
coord2=V'*coord1'; %transposem coord1 per poder multiplicar i després ho refem.
coord2=coord2'; %les mides de la matriu coord2 son com les de la matriu de punts original.
% Ara el càlcul de la OBB és equivalent al càlcul de la ABB en la nova
% referència (repetim les instruccions anteriors)
% centre de la caixa en la referència R2
centre2=0.5*[maxX+minX,maxY+minY,maxZ+minZ];
% Finalmet cal expressar els punts en la referència ordinària.
% Trobem les coordenades del centre en referència ordinària.
centre = centroid + (V*centre2')';
%Ara visualitzem la caixa.
eixos=V; %els eixos son els de la nova base de Veps
plotBB(punts, midaX, midaY, midaZ, eixos, centre);
view([23.31 -2.66]) %punt de vista de la càmera 3D
function plotBB(punts, midaX, midaY, midaZ, eixos, centre)
% Plot the BB of a set of points according to the directions and
% (c) Numerical Factory 2020
figure() %obrim una nova finestra de dibuix
plot3(punts(:,1),punts(:,2),punts(:,3),'.'); % visualitzem els punts
plot3(centre(:,1),centre(:,2),centre(:,3),'ro'); % visualitzem els punts
%-------------------------------------
% Calculem els 8 vertex de la caixa
%-------------------------------------
cv1=cm+0.5*(-midaX*v1-midaY*v2-midaZ*v3);
cv2=cm+0.5*( midaX*v1-midaY*v2-midaZ*v3);
cv3=cm+0.5*( midaX*v1+midaY*v2-midaZ*v3);
cv4=cm+0.5*(-midaX*v1+midaY*v2-midaZ*v3);
cv5=cm+0.5*(-midaX*v1-midaY*v2+midaZ*v3);
cv6=cm+0.5*( midaX*v1-midaY*v2+midaZ*v3);
cv7=cm+0.5*( midaX*v1+midaY*v2+midaZ*v3);
cv8=cm+0.5*(-midaX*v1+midaY*v2+midaZ*v3);
%-------------------------------------
%pintem les arestes de la caixa
%-------------------------------------
plot3(aresta(:,1),aresta(:,2),aresta(:,3),'r');
plot3(aresta(:,1),aresta(:,2),aresta(:,3),'r');
plot3(aresta(:,1),aresta(:,2),aresta(:,3),'r');
plot3(aresta(:,1),aresta(:,2),aresta(:,3),'r');
plot3(aresta(:,1),aresta(:,2),aresta(:,3),'r');
plot3(aresta(:,1),aresta(:,2),aresta(:,3),'r');
plot3(aresta(:,1),aresta(:,2),aresta(:,3),'r');
plot3(aresta(:,1),aresta(:,2),aresta(:,3),'r');
plot3(aresta(:,1),aresta(:,2),aresta(:,3),'r');
plot3(aresta(:,1),aresta(:,2),aresta(:,3),'r');
plot3(aresta(:,1),aresta(:,2),aresta(:,3),'r');
plot3(aresta(:,1),aresta(:,2),aresta(:,3),'r');