HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: Funzioni somma e prodotto.  (Letto 1863 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

marcomasetti

  • Newbie
    ...sono qui da poco, il mio miglior amico è il pulsante RICERCA
  • *
  • Post: 183
Funzioni somma e prodotto.
« il: 14 Luglio 2012, 18:30 »
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)