ArchiRADAR Forum

ArchiRADAR Forum => GDL => Topic aperto da: marcomasetti - 09 Agosto 2012, 16:55

Titolo: Curve raccordate 3
Inserito da: marcomasetti - 09 Agosto 2012, 16:55
Per scrivere con una unica equazione una linea composta è possibile anche utilizzare archi di cerchio: in questo caso non avremo una funzione sul tipo y=y(x), ma una curva espressa in forma parametrica:
x=x(an)
y=y(an)
dove in questo caso il parametro an sarà un valore angolare.
Per prima cosa si deve disegnare con il compasso la curva composta di archi, segnando i rispettivi centri. Si tenga presente che i centri di due archi raccordati devono essere allineati con il vertice di collegamento tra gli archi stessi.  Prima si potranno scrivere i singoli archi in modo separato tramite un loop, per verificare se non si sono commessi errori. Infine si possono esprimere con una unica formula, tenendo presente che il valore an deve essere espresso in modo da crescere con continuità da un arco all’altro.

Per esempio un profilo a forma di pera può essere scritto nel seguente modo:

for i=0 to n-1
an=90/n*i            ![0,90) 90
x1=r1-r1*cos(an)
y1=-r1*sin(an)
put x1,y1
next i

for i=0 to n-1
an=(90+be)/n*i+90    ![90,180+be) 90+be, subtot=180+be
x2=r1-r2*cos(an)
y2=r2-r1-r2*sin(an)
put x2,y2
next i

for i=0 to n-1
an=be/n*i-be          ![180+be,180) orario be, subtot=180+2*be
x3=r1+(r2+r3)*cos(be)-r3*cos(an)
y3=r2-r1+(r2+r3)*sin(be)+r3*sin(an)
put x3,y3
next i

for i=0 to n
an=90/n*i+180     ![180,180+90)   90, tot=270+2*be
x4=-(r1+(r2+r3)*cos(be)-r3)*cos(an)
y4=r2-r1+(r2+r3)*sin(be)-(r1+(r2+r3)*cos(be)-r3)*sin(an)
put x4,y4
next i
poly2 nsp/2, 1, get (nsp)

Si tratta di una successione di 4 archi, antiorari ad esclusione del terzo.
Ogni volta che si aggiunge un arco, occorre segnare il suo valore angolare che deve essere aggiunto ai valori angolari precedenti, sia nel caso di andamento orario che antiorario. Questa operazione deve essere fatta al fine di inserire poi il valore an in un unico script in modo che an sia sempre crescente con continuità, anche per gli archi che invertono il senso di rotazione.
Da notare che soltanto l’ultimo loop termina con n invece che con n-1: tuttavia quando uniremo gli archi l’ultimo valore deve essere scartato ed inserito manualmente.  Se il primo valore che assume al all’inizio è diverso da 0, pure questo va scartato ed inserito manualmente: questo perché nella forma che usiamo tramite abs il primo ed ultimo valore si dimezzano.

for i=0 to n-1
an=(270+2*be)/n*i
x1=(r1-r1*cos(an))                                                                  *(sgn(an)        -(sgn(an-90))      )/2
y1=-r1*sin(an)                                                                        *(sgn(an)         -(sgn(an-90))      )/2
x2=(r1-r2*cos(an))                                                         *(sgn(an-90)          -(sgn(an-180-be))   )/2
y2=(r2-r1-r2*sin(an))                                                     *(sgn(an-90)          -(sgn(an-180-be))    )/2
x3=(r1+(r2+r3)*cos(be)-r3*cos(an-2*be-180))                 *(sgn(an-180-be)    -sgn(an-180-2*be)   )/2
y3=(r2-r1+(r2+r3)*sin(be)+r3*sin(an-2*be-180))             *(sgn(an-180-be)    -sgn(an-180-2*be)   )/2
x4=-(r1+(r2+r3)*cos(be)-r3)*cos(an-2*be)                                 *(sgn(an-180-2*be)-sgn(sgn(an-270-2*be)))/2
y4=(r2-r1+(r2+r3)*sin(be)-(r1+(r2+r3)*cos(be)-r3)*sin(an-2*be))*(sgn(an-180-2*be)-sgn(sgn(an-270-2*be)))/2
put x1+x2+x3+x4,y1+y2+y3+y4
next i
put 0,r2-r1+(r2+r3)*sin(be)+(r1+(r2+r3)*cos(be)-r3)

poly2 nsp/2, 1, get (nsp)

Da notare che nelle espressioni contenenti sgn per ogni coppia di valori x,y la seconda parte di intervallo diventa la prima per la coppia successiva.

Vediamo ora come applicare al profilo di una primitiva questa formula.
Prima ho provato ad utilizzare la forma predefinita REVOLVE :

for i=0 to n-1
an=(270+2*be)/n*i
x1=(r1-r1*cos(an))*(sgn(an)-(sgn(an-90)))/2
y1=-r1*sin(an)*(sgn(an)-(sgn(an-90)))/2
x2=(r1-r2*cos(an))*(sgn(an-90)-(sgn(an-180-be)))/2
y2=(r2-r1-r2*sin(an))*(sgn(an-90)-(sgn(an-180-be)))/2
x3=(r1+(r2+r3)*cos(be)-r3*cos(an-2*be-180))*(sgn(an-180-be)-sgn(an-180-2*be))/2
y3=(r2-r1+(r2+r3)*sin(be)+r3*sin(an-2*be-180))*(sgn(an-180-be)-sgn(an-180-2*be))/2
x4=-(r1+(r2+r3)*cos(be)-r3)*cos(an-2*be)*(sgn(an-180-2*be)-sgn(sgn(an-270-2*be)))/2
y4=(r2-r1+(r2+r3)*sin(be)-(r1+(r2+r3)*cos(be)-r3)*sin(an-2*be))*(sgn(an-180-2*be)-sgn(sgn(an-270-2*be)))/2
put y1+y2+y3+y4,x1+x2+x3+x4,0
next i
put r2-r1+(r2+r3)*sin(be)+(r1+(r2+r3)*cos(be)-r3),0,0

REVOLVE nsp/3, 360, 1+2+4+8+64*j2 , get (nsp)

Da notare che sono state scambiate le y con le x perché così richiede questo tipo di primitiva.
Occorre sempre confrontare il modo con cui è espressa la curva con la forma con cui è richiesto il suo inserimento nella primitiva.  Per costruire script corretti è necessario orientarsi nello spazio e saper cambiare il sistema di riferimento, ove necessario.

Naturalmente tale primitiva preconfezionata permette la sola rotazione.
Per deformare secondo il mio capriccio tale superficie a pera mi sono servito della mia primitiva:
sfera prim.gsm
utilizzando non lo script 3D, ma quello che ho inserito nel commento.

La parte relativa ai vertici è:

Vert x0,y0,z0  !Polo S

for j=1 to m-1
for i=0 to n-1
u=2*r/m*j                             !j=0: u=0 polo S,   j=m: u=2*r polo N
v=360/n*i
f=sqr(r^2-(u-r)^2)                !f=f(u,v)
x=f*cos(v)
y=f*sin(v)
Vert x0+x,y0+y,z0+u
next i
next j

Vert x0,y0,z0+2*r

Se la curva del profilo fosse scritta come funzione        y=f(x),
basterebbe sostituire la parte     sqr(r^2-(u-r)^2)         con   f(u),
questo perché la lettera u indica le quote interne z della sfera che variano in modo lineare da 0 (corrispondente al vertice inferiore) a  2*r  (corrispondente al vertice superiore).
La curva che voglio inserire qui è però espressa in forma parametrica. Osserviamo che mentre u sulla sfera (quote) corrisponde alla lettera y della curva, il raggio dei paralleli (orizzontale con stessa giacitura del piano coordinato xy)
corrisponde alla lettera x della curva. Pertanto lo script dei vertici diventa:

Vert x0,y0,z0  !Polo S

for j=1 to m-1
for i=0 to n-1
al=al(j)
u=u(al)
v=360/n*i
f=f(al)               
x=f*cos(v)
y=f*sin(v)
Vert x0+x,y0+y,z0+u
next i
next j

Vert x0,y0,z0+f(al_finale)

Dove u(al)  e  f(al)   sono in effetti rispettivamente le espressioni parametriche in al della curva:
y(al)  e  x(al) 
le quali in riferimento alla curva in esame sono rappresentate rispettivamente da:
y1+y2+y3+y4
x1+x2+x3+x4
Poichè nello script della curva si è usato i con valore finale n mentre qui il parametro al va espresso in funzione di j con valore finale m, bisogna scambiare queste lettere.  In più si è sostituito an con al, che ora esprime il parametro.  Come sosteneva il prof. Malferrari al corso di Analisi Matematica, l’importante è avere ben chiaro in mente il significato che attribuiamo alle lettere, per il resto potremmo anche usare i simboli delle carte da gioco.

Vert x0,y0,z0  !Polo S
for j=1 to m-1
for i=0 to n-1
al=(270+2*be)/m*j
x1=(r1-r1*cos(al))                                                *(sgn(al)-(sgn(al-90)))/2
y1=-r1*sin(al)                                                      *(sgn(al)-(sgn(al-90)))/2
x2=(r1-r2*cos(al))                                                *(sgn(al-90)-(sgn(al-180-be)))/2
y2=(r2-r1-r2*sin(al))                                            *(sgn(al-90)-(sgn(al-180-be)))/2
x3=(r1+(r2+r3)*cos(be)-r3*cos(al-2*be-180))        *(sgn(al-180-be)-sgn(al-180-2*be))/2
y3=(r2-r1+(r2+r3)*sin(be)+r3*sin(al-2*be-180))    *(sgn(al-180-be)-sgn(al-180-2*be))/2
x4=-(r1+(r2+r3)*cos(be)-r3)*cos(al-2*be)                                 *(sgn(al-180-2*be)-sgn(sgn(al-270-2*be)))/2
y4=(r2-r1+(r2+r3)*sin(be)-(r1+(r2+r3)*cos(be)-r3)*sin(al-2*be))*(sgn(al-180-2*be)-sgn(sgn(al-270-2*be)))/2
u=y1+y2+y3+y4
v=360/n*i
f=x1+x2+x3+x4+am*(1-4/m^2*(j-m/2)^2)*sin(v*k+t*j/m*360/k)
x=cos(v)*f
y=sin(v)*f
Vert x0+x,y0+y,z0+u
next i
next j
Vert x0,y0,z0+r2-r1+(r2+r3)*sin(be)+(r1+(r2+r3)*cos(be)-r3)  !Polo N

Si rilevi che al valore di f abbiamo aggiunto l’espressione:
am*(1-4/m^2*(j-m/2)^2)*sin(v*k+t*j/m*360/k)
La funzione aggiunta al valore del raggio f del parallelo:
am* sin(v*k)
introduce una onda sinusoidale facendo diminuire o aumentare di am/2 tale raggio  f .
La parte t*j/m*360/k sposta i picchi di tale onda con la quota, generando un andamento a spirale.
Dato che la torsione viene applicata alla funzione e non alle facce della primitiva, la suddivisione che ho operato sui PGON in funzione di k non cambia.  Infatti le fasce di divisione dei materiali rimangono verticali anche durante la torsione.
La parte:
1-4/m^2*(j-m/2)^2
è l’equazione di una parabola che azzera agli estremi (j=0 e j=m) l’effetto d’onda, che assume valore massimo per j intermedio.

Sarebbe possibile introdurre profili irregolari anche per i paralleli, ma preferisco simmetrie rotatorie.
L’ importante è aver dimostrato che usando analisi e geometria non ci sono limiti per la creazione di forme,
anche se il procedimento è piuttosto laborioso.

Accenno qui ad un altro concetto importante: non è possibile ottenere qualsiasi superficie dalla semplice distorsione di una forma.  Esiste una branca della geometria, nota come TOPOLOGIA che classifica le forme geometriche in base a caratteristiche che non cambiano con la semplice deformazione.  In pratica si considerano le superfici come se fossero di gomma e le linee come se fossero elastici.   Tagliare o incollare parti equivale a cambiare tipologia, ma la semplice deformazione elastica non cambia, entro il campo topologico, il tipo di forma.  Quindi la sfera equivale al cubo o al cilindro, ma non corrisponde al toro, che ha la forma di ciambella e presenta un buco tridimensionale (cioè senza bordo).   Pertanto deformando una sfera non posso ottenere una ciambella, ma soltanto superfici chiuse da un involucro semplice.