Appendici A-4
A.2
Funzione di slice
%Si assuma che il piano sia rappresentato attraverso un suo punto(P0) ed il vettore ad esso %ortogonale (P1) e che P0 e P1 siano vettori riga (1x3). Si suppone inoltre di conoscere %l’insieme dei punti su cui è basata la triangolazione come una matrice XYZ (nx3). %Infine, Si è assunto che la triangolazione stessa sia rappresentabile attraverso una matrice %(mx3) di interi dati dagli indici delle righe di XYZ.
%Detta matrice è chiamata TRI.
[x, y, z] = meshgrid([-1, 1], [-1, 1], [-1, 1]); XYZ = [x(:), y(:), z(:)]; tri = [1, 5, 6; 2, 1, 6; 3, 1, 5; 2, 3, 4; 2, 3, 1; 7, 5, 6; 7, 3, 5;… 8, 7, 6; 8, 2, 6; 8, 2, 4; 8, 3, 4; 8, 7, 3]; n = size(XYZ,1); m = size(tri,1); p0 = [0, 0, 0]; p1 = [sqrt(3)/2, 0, 0.5];
%Per prima cosa si determinano i triangoli che attraversano il piano %Il vertice 1 di ogni triangolo è:
a = XYZ(tri(:, 1), :);
%Allo stesso modo per i vertici 2 e 3: b = XYZ(tri(:, 2), :);
c = XYZ(tri(:, 3), :);
%Da quale parte del piano sono a, b e c? %Si usa il prodotto scalare:
da = (a – repmat(p0, m, 1))*p1’; db = (b – repmat(p0, m, 1))*p1’; dc = (c – repmat(p0, m, 1))*p1’;
%Se solo 1 o 2 degli angoli stanno dalla parte positiva del piano, allora quella faccia %attraversa il piano. k è una lista dei triangoli che attraversano il piano:
Appendici A-5
k = (da>0) + (db>0) + (dc>0); k = find ((k = = 1) | (k = = 2));
%Se k non è vuota, allora il piano ha delle intersezioni con l’oggetto: edgelist = [];
xyzp = []; j = 0; for i = k’; edgei = [];
%Did we cross edge ab? if (da(i)*db(i)) <= 0 j = j+1; edgei = [edgei,j]; t = abs(da(i))/(abs(da(i))+(abs(db(i)))); xyz0 = XYZ(tri(i,1),:)*(1-t)+XYZ(tri(i,2),:)*t; xyzp = [xyzp;xyz0]; end if (da(i)*dc(i)) <= 0 j = j+1; edgei = [edgei,j]; t = abs(da(i))/(abs(da(i))+(abs(dc(i)))); xyz0 = XYZ(tri(i,1),:)*(1-t)+XYZ(tri(i,3),:)*t; xyzp = [xyzp;xyz0]; end if (db(i)*dc(i)) <= 0 j = j+1; edgei = [edgei,j]; t = abs(db(i))/(abs(db(i))+(abs(dc(i)))); xyz0 = XYZ(tri(i,2),:)*(1-t)+XYZ(tri(i,3),:)*t; xyzp = [xyzp;xyz0]; end
edgelist = [edgelist; edgei]; end
Appendici A-6
%Edgelist è una lista delle coppie dei punti di estremità di segmenti sul piano di taglio. %Si riferisce alle righe della matrice xyzp. Tali estremi non sono ordinati
%HTH,