A.4 Calcolo della lunghezza della sezione deformata della membrana
clear all; close all;%Definizione dei parametri di analisi (le dimensioni sono in SI ) N = input('Inserire il numero di segmenti longitudinali N='); for u = [0:1000] if (N= =0) | (N= =1) N = input('Inserire un valore di N>1, N='); u = 0; else u = 1000; end end
M = input('Inserire il numero di frazionamenti temporali M='); for u = [0:1000] if M==0 M = input('Inserire un valore di M>0, M='); u = 0; else u = 1000; end end
t = input('Inserire istante di analisi t=');
%Introduzione dei punti e costruzione della triangolazione
%La sezione anteriore del tratto di tubo simulato è posta in x=0.04 Vt_f =[linspace(0.04,0.04,N)', 0.015*cos(linspace(0,2*pi,N))', 0.015*sin(linspace(0,2*pi,N))'];
%La sezione posteriore del tratto di tubo simulato è posta in x=-0.04 Vt_r =[linspace(-0.04,-0.04,N)', 0.015*cos(linspace(0,2*pi,N))', 0.015*sin(linspace(0,2*pi,N))'];
%Quelle sotto sono le coordinate dei vertici delle zampe
%Si considera un incremento della posizione per ogni frame pari a 1/M*2*pi V_f = [0.025+0.020*sin(t/M*2*pi), 0, 0.015+0.015*cos(t/M*2*pi); 0.025+0.020*sin(t/M*2*pi+2*pi/3), -(0.015+0.015*cos(t/M*2*pi+2*pi/3))*sin(2*pi/3), (0.015+0.015*cos(t/M*2*pi+2*pi/3))*cos(2*pi/3); 0.025-0.020*sin(t/M*2*pi+4*pi/3), -(0.015+0.015*cos(t/M*2*pi+4*pi/3))*sin(4*pi/3), (0.015+0.015*cos(t/M*2*pi+4*pi/3))*cos(4*pi/3)];
%A seguire si seleziona la prima colonna di V_f e le si sottrae 5, %cioè si trasla indietro di 5 la posizione delle zampe definendo quelle %posteriori dotate dello stesso moto delle prime
V_f0 = V_f;
V_f0(:,1) = V_f(:,1)-0.05;
V_r = V_f0*[1, 0, 0; 0, cos(pi/3), sin(pi/3); 0, -sin(pi/3), cos(pi/3)]; %X è la matrice dei vertici
X = [Vt_f; V_f; V_r; Vt_r];
%Ciclo di approssimazione dei dati in ingresso dimx = size(X,1); for ii=[1:dimx] for jj=[1:3] w = round(X(ii,jj)*10^6)/10^6; X(ii,jj) = w; end end
%Si definisce quindi la matrice di triangolazione TR TR = convhulln(X);
%Si escludono i triangoli che chiudono le facce estreme del tubo. %Si selezionano quelli che connettono tre vertici della sezione di %estremità e si mette a zero la corrispondente riga di TR
TR(sum((TR<N+1),2)= =3,:) = []; TR(sum((TR>N+6),2)= =3,:) = []; vtr = size(TR,1);
%Vettore del numero dei punti di intersezione nint = [];
%Vettore delle coordinate dei punti di intersezione pint = [];
%Vettore delle lunghezze calcolate lsezione = [];
%CICLO DI CALCOLO DELLA LUNGHEZZA DELLE SEZIONI for f = [1:6];
%Si utilizzano le dimensioni delle matrici dei vertici e di quelle di %triangolazione
n = size(X,1); m = size(TR,1);
%Quindi si definisce il piano tramite un punto dello stesso ed un %vettore normale
p0 = X(N+f,:); p1 = [1, 0, 0];
%Si ordinano i vertici dei triangoli a = X(TR(:,1),:);
b = X(TR(:,2),:); c = X(TR(:,3),:);
%Si verifica la presenza di intersezioni utilizzando i valori assoluti %dei prodotti scalari
da = (a-repmat(p0, m, 1))*p1'; db = (b-repmat(p0, m, 1))*p1'; dc = (c-repmat(p0, m, 1))*p1';
%Si costruisce il vettore k in cui si ordinano tutti i triangoli cui %corrispondono intersezioni col piano
k = (da>0)+(db>0)+(dc>0); k = find((k= =1)|(k= =2));
%xyzp è il vettore dei punti di intersezione xyzp = [];
%CICLO PER LA DETERMINAZIONE DEI PUNTI DI INTERSEZIONE for i = k'
%Verifica dei primi due vertici if sum((da(i)= =0)+(db(i)= =0)= =2) xyz0 = [X(TR(i,1),:);X(TR(i,2),:)]; xyzp = [xyzp;xyz0]; elseif (da(i)*db(i)) <= 0 t = abs(da(i))/(abs(da(i))+(abs(db(i)))); xyz0 = X(TR(i,1),:)*(1-t)+X(TR(i,2),:)*t; xyzp = [xyzp;xyz0]; end
%Verifica dei vertici 1 e 3
if sum((da(i)= =0)+(dc(i)= =0)= =2) xyz0 = [X(TR(i,1),:);X(TR(i,3),:)]; xyzp = [xyzp;xyz0]; elseif (da(i)*dc(i)) <= 0 t = abs(da(i))/(abs(da(i))+(abs(dc(i)))); xyz0 = X(TR(i,1),:)*(1-t)+X(TR(i,3),:)*t; xyzp = [xyzp;xyz0]; end
%Verifica dei vertici 2 e 3
if sum((db(i)= =0)+(dc(i)= =0)= =2) xyz0 = [X(TR(i,2),:);X(TR(i,3),:)]; xyzp = [xyzp;xyz0]; elseif (db(i)*dc(i)) <= 0 t = abs(db(i))/(abs(db(i))+(abs(dc(i)))); xyz0 = X(TR(i,2),:)*(1-t)+X(TR(i,3),:)*t; xyzp = [xyzp;xyz0]; end end dimxyzp = size(xyzp,1); for ii=[1:dimxyzp] for jj=[1:3] w = round(xyzp(ii,jj)*10^6)/10^6; xyzp(ii,jj) = w; end end xyz = unique(xyzp,'rows'); dimxyz = size(xyz,1);
% Quindi si introducono una serie di vettori utilizzati da appoggio % per il processo di ordinamento
xyz11 = []; xyz21 = []; xyz22 = []; xyz12 = []; xyz01 = []; xyz10= []; xyz20 = []; xyz02 = [];
% Si entra in un ciclo che scorre le righe della matrice dei punti di intersezione % mandandole in una serie di sottomatrici in funzione del quadrante in cui % questi si trovano
for p = [1:dimxyz]
%Si utilizza la tg dell'angolo che ne definisce la posizione come criterio di %ordinamento dei punti d'intersezione
%Punti sull'asse Y positivo if (xyz(p,3)= =0 & xyz(p,2)>0) xyz01 = [xyz01;xyz(p,:)];
%Primo quadrante
elseif (xyz(p,3)>0 & xyz(p,2)>0) xyz11 = [xyz11;xyz(p,:)];
%Punti sull'asse Z positivo
elseif (xyz(p,3)>0 & xyz(p,2)= =0) xyz10 = [xyz10;xyz(p,:)];
%Secondo quadrante
elseif (xyz(p,3)>0 & xyz(p,2)<0) xyz21 = [xyz21;xyz(p,:)];
%Punti sull'asse Y negativo
elseif (xyz(p,3)= =0 & xyz(p,2)<0) xyz20 = [xyz20;xyz(p,:)];
%Terzo quadrante
elseif (xyz(p,3)<0 & xyz(p,2)<0) xyz22 = [xyz22;xyz(p,:)];
%Punti sull'asse Z negativo
elseif (xyz(p,3)<0 & xyz(p,2)= =0) xyz02 = [xyz02;xyz(p,:)];
%Quarto quadrante
elseif (xyz(p,3)<0 & xyz(p,2)>0) xyz12 = [xyz12;xyz(p,:)]; end
end
%Si ordinano i termini di ogni sottomatrice utilizzando due cicli for. %Il ciclo interno calcola il vettore delle tangenti, quello esterno ne %estrae l'indice della riga cui corrisponde il minimo per definire il %punto relativo %Primo quadrante q11 = size(xyz11,1); xyz11ord = []; for s = [1:q11] tg=[]; q1 = size(xyz11,1); for ra = [1:q1] tg1 = xyz11(ra,3)/xyz11(ra,2); tg = [tg; tg1]; end [k1,k] = min(tg); xyz11ord = [xyz11ord;xyz11(k,:)]; xyz11(k,:)=[]; end %Secondo quadrante q21 = size(xyz21,1); xyz21ord = []; for s = [1:q21] tg=[]; q2 = size(xyz21,1); for ra = [1:q2] tg1 = xyz21(ra,3)/xyz21(ra,2);
tg = [tg; tg1]; end [k1,k] = min(tg); xyz21ord = [xyz21ord;xyz21(k,:)]; xyz21(k,:)=[]; end %Terzo quadrante q22 = size(xyz22,1); xyz22ord = []; for s = [1:q22] tg=[]; q3 = size(xyz22,1); for ra = [1:q3] tg1 = xyz22(ra,3)/xyz22(ra,2); tg = [tg; tg1]; end [k1,k] = min(tg); xyz22ord = [xyz22ord;xyz22(k,:)]; xyz22(k,:)=[]; end %Quarto quadrante q12 = size(xyz12,1); xyz12ord = []; for s = [1:q12] tg=[]; q4 = size(xyz12,1); for ra = [1:q4] tg1 = xyz12(ra,3)/xyz12(ra,2); tg = [tg; tg1]; end [k1,k] = min(tg); xyz12ord = [xyz12ord;xyz12(k,:)];
xyz12(k,:)=[]; end
%Alla fine si definisce la matrice dei punti ordinati in senso antiorario a %partire dall'asse Y positivo
xyzord= [xyz01;xyz11ord;xyz10;xyz21ord;xyz20;xyz22ord;xyz02;xyz12ord;];
%Il vettore v1 è utilizzato per il calcolo della lunghezza della spezzata di intersezione dimxyzord = size(xyzord,1);
vl = 0;
%Detto calcolo si fa sommando le distanze tra i vari punti adiacenti in un ciclo for %quindi si somma a quanto ottenuto la distanza tra il primo e l'ultimo
%termine della serie b = 0; for i = [1:dimxyzord] if xyzord(i,:)==X(N+f,:) b = b+1; end end if b>0 for z = [1:dimxyzord-1] lun = sqrt((xyzord(z+1,1)-xyzord(z,1))^2+... (xyzord(z+1,2)-xyzord(z,2))^2+... (xyzord(z+1,3)-xyzord(z,3))^2); vl = [vl;lun]; end vl = [vl;sqrt((xyzord(1,1)-xyzord(dimxyzord,1))^2+... (xyzord(1,2)-xyzord(dimxyzord,2))^2+... (xyzord(1,3)-xyzord(dimxyzord,3))^2)]; lun = sum(vl); else lun = 0; end
%Si raccolgono i risultati in tre vettori già definiti sopra nint = [nint;dimxyzord];
pint = [pint;xyzord]; lsezione = [lsezione;lun];