function Tetto=dtetto(p) % Cube

global HPRIMOPIANO;            
global HSECONDOPIANO;
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;
global SPESSORETETTO;
global ALTEZZASOTTOTETTO;
global SPORGENZATETTODAVANTI;
global SPORGENZATETTOLATO;
global ALTEZZASOTTOCOSI;

Teg1=Tegole1(p,PROFONDITA/2,PROFONDITA+SPORGENZATETTODAVANTI,-SPORGENZATETTOLATO,LARGHEZZA+SPORGENZATETTOLATO,HPRIMOPIANO+HSOFFITTI+HSECONDOPIANO- ALTEZZASOTTOTETTO*(SPORGENZATETTODAVANTI/(PROFONDITA/2)),HPRIMOPIANO+HSOFFITTI+HSECONDOPIANO+ALTEZZASOTTOTETTO,SPESSORETETTO);
Teg2=Tegole2(p,-SPORGENZATETTODAVANTI,PROFONDITA/2,-SPORGENZATETTOLATO,LARGHEZZA+SPORGENZATETTOLATO,HPRIMOPIANO+HSOFFITTI+HSECONDOPIANO- ALTEZZASOTTOTETTO*(SPORGENZATETTODAVANTI/(PROFONDITA/2)),HPRIMOPIANO+HSOFFITTI+HSECONDOPIANO+ALTEZZASOTTOTETTO,SPESSORETETTO);
SC1=SottoCoso1(p,PROFONDITA,PROFONDITA+SPORGENZATETTODAVANTI,-SPORGENZATETTOLATO,LARGHEZZA+SPORGENZATETTOLATO,HPRIMOPIANO+HSOFFITTI+HSECONDOPIANO- ALTEZZASOTTOTETTO*(SPORGENZATETTODAVANTI/(PROFONDITA/2)),HPRIMOPIANO+HSOFFITTI+HSECONDOPIANO,ALTEZZASOTTOCOSI);
SC2=SottoCoso2(p,-SPORGENZATETTODAVANTI,0,-SPORGENZATETTOLATO,LARGHEZZA+SPORGENZATETTOLATO,HPRIMOPIANO+HSOFFITTI+HSECONDOPIANO-ALTEZZASOTTOTETTO*(SPORGENZATETTODAVANTI/(PROFONDITA/2)),HPRIMOPIANO+HSOFFITTI+HSECONDOPIANO,ALTEZZASOTTOCOSI);
P1=prisma1(p,0,PROFONDITA,0,LARGHEZZA,HPRIMOPIANO+HSOFFITTI+HSECONDOPIANO,ALTEZZASOTTOTETTO);
P2=prisma1(p,SPESSOREMURIPORTANTI,PROFONDITA-SPESSOREMURIPORTANTI,SPESSOREMURIPORTANTI,LARGHEZZA-SPESSOREMURIPORTANTI,HPRIMOPIANO+2*HSOFFITTI+HSECONDOPIANO,ALTEZZASOTTOTETTO-HSOFFITTI);
Tetto=dunion(dunion(dunion(dunion(Teg1,Teg2),SC1),SC2),P1);
%Tetto=ddiff(Tetto,P2);

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,z,H)
m1=2*H/(x2-x1);
m2=-m1;
q1=-m1*x1+z;
q2=-m2*x2+z;
[N b]=size(p);
d=dunion(-min(min(min(min(min(-y1*ones(N,1)+p(:,2),y2*ones(N,1)-p(:,2)),-x1*ones(N,1)+p(:,1)),((x1+x2)/2)*ones(N,1)-p(:,1)),-z*ones(N,1)+p(:,3)),(m1*p(:,1)+q1*ones(N,1))-p(:,3)),-min(min(min(min(min(-y1*ones(N,1)+p(:,2),y2*ones(N,1)-p(:,2)),-((x1+x2)/2)*ones(N,1)+p(:,1)),x2*ones(N,1)-p(:,1)),-z*ones(N,1)+p(:,3)),(m2*p(:,1)+q2*ones(N,1))-p(:,3)));

function d=Tegole1(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=SottoCoso1(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)),-(z1-H)*ones(N,1)+p(:,3)),(m*p(:,1)+q*ones(N,1))-p(:,3));

function d=SottoCoso2(p,x1,x2,y1,y2,z1,z2,H)
m=(z2-z1)/(x2-x1);
q=z2-m*x2;
[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-H)*ones(N,1)+p(:,3)),(m*p(:,1)+q*ones(N,1))-p(:,3));

function d=Tegole2(p,x1,x2,y1,y2,z1,z2,H)
m=(z2-z1)/(x2-x1);
q=z2-m*x2;
[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));