function Scala=dscala(p) % Cube

global HPRIMOPIANO;            
global HSOFFITTI;              
global HTETTO;                 
global PROFONDITA;             
global LARGHEZZA;              
global SPESSOREMURIPORTANTI;   
global SPESSORETRAMEZZE;
global NSCALINI;      
global ALZATASCALINI; 
global LARGHEZZASCALA;
global BATTUTASCALINI;
global SPESSORESCALINIAGGIUNTO;
global ASCISSATRAMEZZA3;
global SPESSORETRAMEZZE;
global ORDINATATRAMEZZA4;

Scala=dcube(p,PROFONDITA-SPESSOREMURIPORTANTI-LARGHEZZASCALA,PROFONDITA-SPESSOREMURIPORTANTI,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-BATTUTASCALINI,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA,0,ALZATASCALINI);
Scala=dunion(Scala,dcube(p,PROFONDITA-SPESSOREMURIPORTANTI-LARGHEZZASCALA,PROFONDITA-SPESSOREMURIPORTANTI,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA,LARGHEZZA-SPESSOREMURIPORTANTI,0,2*ALZATASCALINI));

for i=1:9
    Scala=dunion(Scala,dcube(p,PROFONDITA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-i*BATTUTASCALINI,PROFONDITA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-(i-1)*BATTUTASCALINI,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA,LARGHEZZA-SPESSOREMURIPORTANTI,(i+1)*ALZATASCALINI-SPESSORESCALINIAGGIUNTO,(i+2)*ALZATASCALINI));
end

GradinoPrisma1=prisma1(p,SPESSOREMURIPORTANTI,PROFONDITA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-i*BATTUTASCALINI,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA,LARGHEZZA-SPESSOREMURIPORTANTI,(i+2)*ALZATASCALINI-SPESSORESCALINIAGGIUNTO,(i+3)*ALZATASCALINI);
GradinoPrisma2=prisma2(p,SPESSOREMURIPORTANTI,PROFONDITA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-i*BATTUTASCALINI,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA,LARGHEZZA-SPESSOREMURIPORTANTI,(i+3)*ALZATASCALINI-SPESSORESCALINIAGGIUNTO,(i+4)*ALZATASCALINI);
SottoScala=dsottoscala(p,PROFONDITA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-i*BATTUTASCALINI,PROFONDITA-SPESSOREMURIPORTANTI-LARGHEZZASCALA,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA,LARGHEZZA-SPESSOREMURIPORTANTI,0,i*ALZATASCALINI,ALZATASCALINI);

Scala=dunion(dunion(Scala,GradinoPrisma1),GradinoPrisma2);
Scala=ddiff(Scala,SottoScala);

Scala=dunion(Scala,dcube(p,SPESSOREMURIPORTANTI,PROFONDITA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-i*BATTUTASCALINI,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-BATTUTASCALINI,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA,(i+4)*ALZATASCALINI-SPESSORESCALINIAGGIUNTO,(i+5)*ALZATASCALINI));
Scala=dunion(Scala,dcube(p,SPESSOREMURIPORTANTI,PROFONDITA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-i*BATTUTASCALINI,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-2*BATTUTASCALINI,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-BATTUTASCALINI,(i+5)*ALZATASCALINI-SPESSORESCALINIAGGIUNTO,(i+6)*ALZATASCALINI));
Scala=dunion(Scala,dcube(p,SPESSOREMURIPORTANTI,PROFONDITA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-i*BATTUTASCALINI,ASCISSATRAMEZZA3+SPESSORETRAMEZZE/2,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA-2*BATTUTASCALINI,(i+6)*ALZATASCALINI-SPESSORESCALINIAGGIUNTO,(i+7)*ALZATASCALINI));

Scala=dunion(Scala,prisma3(p,ORDINATATRAMEZZA4-SPESSORETRAMEZZE/2,PROFONDITA-SPESSOREMURIPORTANTI-LARGHEZZASCALA,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA,LARGHEZZA-SPESSOREMURIPORTANTI-LARGHEZZASCALA+SPESSORETRAMEZZE,0,4*ALZATASCALINI));

function d=dcube(p,x1,x2,y1,y2,z1,z2) % Cubo
[N b]=size(p);
d=-min(min(min(min(min(-y1*ones(N,1)+p(:,2),y2*ones(N,1)-p(:,2)),-x1*ones(N,1)+p(:,1)),x2*ones(N,1)-p(:,1)),-z1*ones(N,1)+p(:,3)),z2*ones(N,1)-p(:,3));

function d=prisma1(p,x1,x2,y1,y2,z1,z2)
m=(y1-y2)/(x2-x1);
q=y2-m*x1;
[N b]=size(p);
d=-min(min(min(min(min(-(m*p(:,1)+q*ones(N,1))+p(:,2),y2*ones(N,1)-p(:,2)),-((1/m)*p(:,2)-(q/m)*ones(N,1))+p(:,1)),x2*ones(N,1)-p(:,1)),-z1*ones(N,1)+p(:,3)),z2*ones(N,1)-p(:,3));

function d=prisma2(p,x1,x2,y1,y2,z1,z2)
m=(y1-y2)/(x2-x1);
q=y2-m*x1;
[N b]=size(p);
d=-min(min(min(min(min(-y1*ones(N,1)+p(:,2),(m*p(:,1)+q*ones(N,1))-p(:,2)),-x1*ones(N,1)+p(:,1)),((1/m)*p(:,2)-(q/m)*ones(N,1))-p(:,1)),-z1*ones(N,1)+p(:,3)),z2*ones(N,1)-p(:,3));

function d=dsottoscala(p,x1,x2,y1,y2,z1,z2,H)
m=(z1-z2)/(x2-x1);
q=z2-m*x1;
[N b]=size(p);
d=-min(min(min(min(min(-y1*ones(N,1)+p(:,2),y2*ones(N,1)-p(:,2)),-x1*ones(N,1)+p(:,1)),x2*ones(N,1)-p(:,1)),-(m*p(:,1)+q*ones(N,1))+p(:,3)),(m*p(:,1)+(q+H)*ones(N,1))-p(:,3));

function d=prisma3(p,x1,x2,y1,y2,z1,z2)
m=(z1-z2)/(x2-x1);
q=z2-m*x1;
[N b]=size(p);
d=-min(min(min(min(min(-y1*ones(N,1)+p(:,2),y2*ones(N,1)-p(:,2)),-x1*ones(N,1)+p(:,1)),x2*ones(N,1)-p(:,1)),-z1*ones(N,1)+p(:,3)),(m*p(:,1)+(q+0.4)*ones(N,1))-p(:,3));

