• Non ci sono risultati.

A.4 Calcolo della lunghezza della sezione deformata della membrana

N/A
N/A
Protected

Academic year: 2021

Condividi "A.4 Calcolo della lunghezza della sezione deformata della membrana"

Copied!
10
0
0

Testo completo

(1)

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))'];

(2)

%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

(3)

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

(4)

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

(5)

%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 = [];

(6)

% 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,:)];

(7)

%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);

(8)

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,:)];

(9)

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

(10)

%Si raccolgono i risultati in tre vettori già definiti sopra nint = [nint;dimxyzord];

pint = [pint;xyzord]; lsezione = [lsezione;lun];

Riferimenti

Documenti correlati