Un modo per costruire funzioni da R*R a R (cioè dal piano cartesiano a due dimensioni xy alla retta unidimensionale z) è costruire la funzione somma o prodotto, a partire da due funzioni da R a R. In altri termini è possibile costruire una superficie a partire da due profili piani.
La funzione somma permette di costruire una superficie facendo scorrere una linea curva generatrice su una curva direttrice disposta ortogonalmente alla prima.
Infatti la funzione definita in 2D:
z= z1(x) + z2(y)
può essere immaginata come realizzata dal profilo parallelo al piano xz definito da:
z= z1(x)
che cambia di quota in funzione dei valori z2(y) assunti dall’ordinata y.
La funzione prodotto permette di definire un intervallo rettangolare [x1,x2]*[y1,y2] sui bordi del quale la superficie ha quota zero. Ciò può essere utile per realizzare coperture dalla forma curva, sul tipo della volta a padiglione. Per semplificare immaginiamo un intervallo rettangolare su xy che esca dall’origine: [0,Lx]*[0,Ly]. Scegliendo due funzioni z1(x) e z2(x) che si annullano rispettivamente in
z1(0), z1(Lx) e z2(0),z2(Ly), la funzione definita in 2D:
z= z1(x) * z2(y) si annulla sul contorno del rettangolo [0,Lx]*[0,Ly].
Per costruire esempi di tali superfici utilizzo una primitiva sul tipo della MESH che ho costruito.
A differenza della MESH vera e propria, che ha la parte inferiore piana, questa primitiva presenta un reticolo di triangolazioni anche nella base, che può essere deformata.
Lo script è piuttosto lungo, perché la superficie è stata suddivisa in 8 moduli triangolari, definiti dalla 2 mediane e dalle 2 diagonali di un modulo quadrato di partenza. Il calcolatore non ha però nessuna difficoltà a leggere velocemente lo script.
Inserire una funzione z1=z1(x,y) per l’estradosso e una funzione z2=z2(x,y) per l’ intradosso.
Per tutti i punti compresi in [0,Lx]*[0,Ly] deve risultare z1>z2,
un esempio elementare è costruire l’estradosso traslando in alto l’intradosso:
z1=z2+dz, con dz costante (spessore).
Lx= !dimensione //x
Ly= !dimensione //y
m= !divisioni x
n= !divisioni y
dz= !spessore
z0= !offset z estradosso
s1= !bit nascondi spigoli contorno
j1= !bit nascondi spigoli mesh
j2= !bit sup. mesh liscia
base
for j=0 to 2*n
for i=0 to 2*m
x=Lx*i/(2*m)
y=Ly*j/(2*n)
z1= !!!definire funzione z1 in x,y
vert x,y,z0+z1
next i
next j !estradosso
for j=0 to 2*n
for i=0 to 2*m
x=Lx*i/(2*m)
y=Ly*j/(2*n)
z2= !!!definire funzione z2 in x,y
vert x,y,z0+z2
next i
next j !intradosso
!EDGES: inizio estradosso
for i=1 to 2*m
edge i,i+1,-1,-1, s1 !//assex, bordo anteriore
next i
for j=1 to 2*n-1
for i=1 to 2*m
edge i+j*(2*m+1),i+1+j*(2*m+1),-1,-1, j1+2*j2 !//assex intermedi
next i
next j
for i=1 to 2*m !j=2*n
edge i+2*n*(2*m+1),i+1+2*n*(2*m+1),-1,-1,s1 !//assex, bordo posteriore
next i
for j=0 to 2*n-1
edge 1+j*(2*m+1),1+(j+1)*(2*m+1),-1,-1,s1 !//assey bordo sin
for i=2 to 2*m
edge i+j*(2*m+1),i+(j+1)*(2*m+1),-1,-1, j1+2*j2 !//assey intermedi
next i
edge (j+1)*(2*m+1),(j+2)*(2*m+1),-1,-1,s1 !//assey bordo dex
next j
for j=0 to n-1
for i=0 to m-1
edge 2*i+1+j*(4*m+2),2*i+2+(2*j+1)*(2*m+1),-1,-1, j1+2*j2 !diagonale x+ y+
next i
next j
for j=0 to n-1
for i=0 to m-1
edge 2*i+3+j*(4*m+2),2*i+2+(2*j+1)*(2*m+1),-1,-1, j1+2*j2 !diagonale x- y+
next i
next j
for j=0 to n-1
for i=0 to m-1
edge 2*i+3+(j+1)*(4*m+2),2*i+2+(2*j+1)*(2*m+1),-1,-1, j1+2*j2 !diagonale x- y-
next i
next j
for j=0 to n-1
for i=0 to m-1
edge 2*i+1+(j+1)*(4*m+2),2*i+2+(2*j+1)*(2*m+1),-1,-1, j1+2*j2 !diagonale x+ y-
next i
next j
!inizio intradosso
for i=1 to 2*m
edge i+(2*m+1)*(2*n+1),i+1+(2*m+1)*(2*n+1),-1,-1, s1
next i
for j=1 to 2*n-1
for i=1 to 2*m
edge i+(2*m+1)*(j+2*n+1),i+1+(2*m+1)*(j+2*n+1),-1,-1, j1+2*j2
next i
next j
for i=1 to 2*m !j=2*n
edge i+(2*m+1)*(4*n+1),i+1+(2*m+1)*(4*n+1),-1,-1,s1
next i !//assex
for j=0 to 2*n-1
edge 1+(2*m+1)*(j+2*n+1),1+(2*m+1)*(j+2*n+2),-1,-1,s1
for i=2 to 2*m
edge i+(2*m+1)*(j+2*n+1),i+(2*m+1)*(j+2*n+2),-1,-1, j1+2*j2
next i
edge (j+2*n+2)*(2*m+1),(2*m+1)*(j+2*n+3),-1,-1,s1
next j !//assey
for j=0 to n-1
for i=0 to m-1
edge 2*i+1+(2*m+1)*(2*j+2*n+1),2*i+2+(2*m+1)*(2*j+2*n+2),-1,-1, j1+2*j2 !diagonale x+ y+ # m*n tot=9*m*n+2*m+2*n
next i
next j
for j=0 to n-1
for i=0 to m-1
edge 2*i+3+(2*m+1)*(2*j+2*n+1),2*i+2+(2*m+1)*(2*j+2*n+2),-1,-1, j1+2*j2 !diagonale x- y+ # m*n tot=10*m*n+2*m+2*n
next i
next j
for j=0 to n-1
for i=0 to m-1
edge 2*i+3+(2*m+1)*(2*(j+1)+2*n+1),2*i+2+(2*m+1)*(2*j+2*n+2),-1,-1, j1+2*j2 !diagonale x- y- # m*n tot=11*m*n+2*m+2*n
next i
next j
for j=0 to n-1
for i=0 to m-1
edge 2*i+1+(2*m+1)*(2*(j+1)+2*n+1),2*i+2+(2*m+1)*(2*j+2*n+2),-1,-1, j1+2*j2 !diagonale x+ y- # m*n tot=12*m*n+2*m+2*n
next i
next j
!inizio edges verticali
edge 1+(2*m+1)*(2*n+1),1,-1,-1, s1
edge 2*m+1+(2*m+1)*(2*n+1),2*m+1,-1,-1, s1
edge 1+(2*m+1)*(2*n+1)+(2*m+1)*2*n,1+(2*m+1)*2*n,-1,-1, s1
edge 2*m+1+(2*m+1)*(2*n+1)+(2*m+1)*2*n,(2*m+1)*(2*n+1),-1,-1, s1
!PGON: inizio estradosso
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,1+i*2+j*4*m,2*m*(2*n+1)+i*2+2+j*(4*m+2),
-(8*m*n+2*m+2*n+i+1+j*m)
next i
next j !#1
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,2+i*2+j*4*m,9*m*n+2*m+2*n+i+1+j*m,
-(2*m*(2*n+1)+i*2+2+j*(4*m+2))
next i
next j !#2
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,2*m*(2*n+1)+i*2+3+j*(4*m+2),
-(2*m+2*i+2+j*4*m),-(9*m*n+2*m+2*n+i+1+j*m)
next i
next j !#3
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,2*m*(2*n+2)+i*2+4+j*(4*m+2),
10*m*n+2*m+2*n+i+1+j*m,2*m+2*i+2+j*4*m
next i
next j !#4
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,-(4*m+2*i+2+j*4*m),-(2*m*(2*n+2)+i*2+j*(4*m+2)+3),
-(10*m*n+2*m+2*n+i+1+j*m)
next i
next j !#5
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,-(4*m+2*i+1+j*4*m),11*m*n+2*m+2*n+i+1+j*m,
2*m*(2*n+2)+i*2+3+j*(4*m+2)
next i
next j !#6
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,-(2*m*(2*n+2)+i*2+2+j*(4*m+2)),2*m+2*i+1+j*4*m,
-(11*m*n+2*m+2*n+i+1+j*m)
next i
next j !#7
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,-(2*m*(2*n+1)+i*2+1+j*(4*m+2)),8*m*n+2*m+2*n+i+1+j*m,
-(2*m+2*i+1+j*4*m)
next i
next j !#8
!inizio intradosso
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,-(1+i*2+j*4*m+12*m*n+2*m+2*n),20*m*n+4*m+4*n+i+1+j*m,
-(i*2+2+j*(4*m+2)+16*m*n+4*m+2*n)
next i
next j !#1
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,-(2+i*2+j*4*m+12*m*n+2*m+2*n),
16*m*n+4*m+2*n+i*2+2+j*(4*m+2),-(21*m*n+4*m+4*n+i+1+j*m)
next i
next j !#2
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,-(16*m*n+4*m+2*n+i*2+3+j*(4*m+2)),21*m*n+4*m+4*n+i+1+j*m,
2*i+2+j*4*m+12*m*n+4*m+2*n
next i
next j !#3
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,-(i*2+4+j*(4*m+2)+16*m*n+6*m+2*n),-(2*i+2+j*4*m+12*m*n+4*m+2*n),
-(22*m*n+4*m+4*n+i+1+j*m)
next i
next j !#4
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,2*i+2+j*4*m+12*m*n+6*m+2*n,i+1+j*m+22*m*n+4*m+4*n,
i*2+3+j*(4*m+2)+16*m*n+6*m+2*n
next i
next j !#5
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,4*m+2*i+1+j*4*m+12*m*n+2*m+2*n,
-(i*2+3+j*(4*m+2)+16*m*n+6*m+2*n),
-(i+1+j*m+23*m*n+4*m+4*n)
next i
next j !#6
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,i*2+2+j*(4*m+2)+16*m*n+6*m+2*n,
23*m*n+4*m+4*n+i+1+j*m,-(2*i+1+j*4*m+12*m*n+4*m+2*n)
next i
next j !#7
for j=0 to n-1
for i=0 to m-1
pgon 3,0,-1,i*2+1+j*(4*m+2)+16*m*n+4*m+2*n,2*i+1+j*4*m+12*m*n+4*m+2*n,
-(i+1+j*m+20*m*n+4*m+4*n)
next i
next j !#8
!sup. laterale
put 24*m*n+4*m+4*n+2
for i=1 to 2*m
put -(2*m-i+1)
next i
put -(24*m*n+4*m+4*n+1)
for i=1 to 2*m
put i+12*m*n+2*m+2*n
next i
pgon nsp,0,-1,get (nsp)!anteriore
put 24*m*n+4*m+4*n+3
for i=1 to 2*m
put i+2*m*2*n
next i
put -(24*m*n+4*m+4*n+4)
for i=1 to 2*m
put -(1-i+16*m*n+4*m+2*n)
next i
pgon nsp,0,-1,get (nsp)!posteriore
put 24*m*n+4*m+4*n+4
for i=0 to 2*n-1
put -(8*m*n+2*m+2*n-i*(2*m+1))
next i
put -(24*m*n+4*m+4*n+2)
for i=0 to 2*n-1
put 1+i*(2*m+1)+16*m*n+6*m+2*n
next i
pgon nsp,0,-1,get (nsp) !dex
put 24*m*n+4*m+4*n+1
for i=0 to 2*n-1
put 2*m*(2*n+1)+1+i*(2*m+1)
next i
put -(24*m*n+4*m+4*n+3)
for i=0 to 2*n-1
put -(20*m*n+2*m+4*n-i*(2*m+1))
next i
pgon nsp,0,-1,get (nsp) !sin
body -1
Come esempio di funzione somma allego l’oggetto:
MESH2b prim vela2.gsm
Si tratta di una volta a vela con profilo a semicerchio.
Dove:
z1(x)= z2(x) = sqr(r^2-(x-r)^2)
z= z1(x) + z2(y) = sqr(r^2-(x-r)^2) + sqr(r^2-(y-r)^2)
L’altezza totale della volta è pari al diametro del cerchio.
In realtà la funzione nello script è più complessa, perché prevede la possibilità di arco a semiellisse.
Allego anche un altro esempio di volta a vela, costruita direttamente con l’equazione della sfera, che dà maggiori possibilità di intervento ed è più chiaro:
MESH2b prim vela.gsm
Tuttavia il primo esempio permette di inserire ogni tipo di profilo, non soltanto a semicerchio, con anche curve generatrice e direttrice di forma diversa.
Come esempio di funzione prodotto allego l’oggetto:
MESH2a prim.gsm
Si tratta di una volta a padiglione con profilo sinusoidale.
Dove:
z1(x) = z2(x) = sqr(h) * sin(x*180/L)
Ovvero entrambe le funzioni sono un arco di sinusoide di altezza sqr(h) che si annulla in 0 e in L.
Dato che verranno moltiplicate, l’altezza massima diverrà h:
z= z1(x) * z2(y) = h*sin(x*180/L)*sin(y*180/L)