Le interfacce dei vari programmi CAD in voga prevedono il disegno di curve e superfici, mediante semplici operazioni manuali, senza scomodare l’algebra. E’ il programma che si preoccupa di tradurre in termini algebrici o numerici i comandi. Se ciò da un lato facilita l’utilizzo dei programmi, per cui è possibile con una conoscenza minima o nulla dell’algebra vettoriale e della programmazione costruire oggetti tridimensionali, dall’altro lato questa impostazione è limitativa. E’ infatti possibile utilizzare soltanto le procedure o le forme previste dall’interfaccia intuitiva. Il linguaggio GDL se da un lato risulta piuttosto rigido, dall’altro lato, proprio per l’uso degli script, risulta molto più versatile e permette applicazioni difficilmente ottenibili tramite le interfacce intuitive. Una delle operazioni più frequenti nelle interfacce intuitive è disegnare profili curvi mediante il raccordo di diverse linee. Per esprimere con una unica formula algebrica una linea formata da diverse curve raccordate, occorre considerare soltanto un intervallo specifico per ogni tipo di curva. Infatti per costruire una linea formata da diversi “pezzi” ottenuti con funzioni diverse, dovremo fare in modo che ciascuna funzione si annulli al di fuori dell’intervallo previsto per la funzione stessa.
Sia [a,b] un intervallo sull’asse x, con ovviamente a<b.
La funzione:
y=(sgn(x-a)-sgn(x-b))/2
vale 0 esternamente all’intervallo[a,b], vale 1 all’interno e vale ½ per x=a o x=b.
Se vogliamo ad esempio raccordare due curve:
y1=y1(x) e y2=y2(x)
rispettivamente negli intervalli:
[a,b], [b,c]
scriveremo l’unica funzione:
y= y1(x)* (sgn(x-a)-sgn(x-b))/2+ y2(x) *(sgn(x-b)-sgn(x-c))/2
ricordando però che risulta:
y(a)= y1(a)/2 e y(c)= y2(c)/2
Analogamente se le funzioni fossero tre:
y1=y1(x) y=y2(x) y=y3(x)
con intervalli:
[a,b], [b,c], [c,d]
scriveremo l’unica funzione:
y= y1(x)* (sgn(x-a)-sgn(x-b))/2+ y2(x) *(sgn(x-b)-sgn(x-c))/2 + y3(x) *(sgn(x-c)-sgn(x-d))/2
ricordando che risulta:
y(a)= y1(a)/2 e y(d)= y3(d)/2
Naturalmente perché le curve siano effettivamente raccordate occorre che nel punto di unione abbiano sia lo stesso valore che la stessa tangente. In tal modo quando la curva risultante verrà divisa in pezzetti non ci saranno discontinuità. Tale tipo di curva serve per costruire primitive con profili a piacere partendo da una superficie primitiva deformabile, come la sfera.
Per costruire un profilo si parte da un disegno a mano libera, poi lo si suddivide in parti ragionando su quale tipo di curva semplice possa essere utilizzata per ciascuna parte. Nei punti di raccordo è necessario disegnare la tangente, per misurarne l’inclinazione.
Ho definito gli scripts per vari tipi di curve semplici che possono essere utilizzate:
1) arco su quadrante 1; (xo,yo)=vertice alto sinistra
t= !pendenza nel punto basso dex.(ellisse su I)
h= !altezza
L= !base (semiluce)
xo=
yo=
a=sqr(abs((h^2/t^2+L^2-2*L*h/t)/(1-2*h/L/t)))
b=a*t/L*sqr(abs(a^2-L^2))
y=yo-b+b/a*sqr(abs(a^2-(x-xo)^2)) ![xo,xo+L],[yo-h,yo]
quarto di ellisse (t verticale):
h= !altezza,semiasse vert.(ellisse/4 su I)
L= !base,semiasse orizz.
xo= !estremo semiasse vert. :alto sin
yo=
y=yo-h+h/L*sqr(abs(L^2-(x-xo)^2)) ![xo,xo+L],[yo-h,yo]
2) arco su quadrante 2; (xo,yo)=vertice basso sinistra
t= !pendenza nel punto basso sin.(ellisse su II)
h= !altezza
L= !base (semiluce)
xo=
yo=
a=sqr(abs((h^2/t^2+L^2-2*L*h/t)/(1-2*h/L/t)))
b=a*t/L*sqr(abs(a^2-L^2))
y=yo-b+h+b/a*sqr(abs(a^2-(x-xo-L)^2)) ![xo,xo+L],[yo,yo+h]
quarto di ellisse (t verticale):
h= !altezza,semiasse vert.(ellisse/4 su II)
L= !base,semiasse orizz.
xo= !estremo semiasse orizz.:basso sinistra
yo=
y=yo+h/L*sqr(abs(L^2-(x-xo-L)^2)) ![xo,xo+L],[yo,yo+h]
3) arco su quadrante 3; (xo,yo)=vertice alto sinistra
t= !pendenza nel punto alto sin.(ellisse su III)
h= !altezza
L= !base (semiluce)
xo=
yo=
a=sqr(abs((h^2/t^2+L^2-2*L*h/t)/(1-2*h/L/t)))
b=a*t/L*sqr(abs(a^2-L^2))
y=-b/a*sqr(abs(a^2-(x-xo-L)^2))+yo+b-h ![xo,xo+L],[yo-h,yo]
quarto di ellisse (t verticale):
h= !altezza,semiasse vert.(ellisse/4 su III)
L= !base,semiasse orizz.
xo= !estremo semiasse orizz.:alto sin
yo=
y=yo-h/L*sqr(abs(L^2-(x-xo-L)^2)) ![xo,xo+L],[yo-h,yo]
4) arco su quadrante 4; (xo,yo)=vertice basso sinistra
t= !pendenza nel punto alto dex.(ellisse su IV)
h= !altezza
L= !base (semiluce)
xo=
yo=
a=sqr(abs((h^2/t^2+L^2-2*L*h/t)/(1-2*h/L/t)))
b=a*t/L*sqr(abs(a^2-L^2))
y=yo+b-b/a*sqr(abs(a^2-(x-xo)^2)) ![xo,xo+L],[yo,yo+h]
quarto di ellisse (t verticale):
h= !altezza,semiasse vert.(ellisse/4 su IV)
L= !base,semiasse orizz.
xo= !estremo semiasse vert.:basso sin
yo=
y=yo+h-h/L*sqr(abs(L^2-(x-xo)^2)) ![xo,xo+L],[yo,yo+h]
I) Semiellisse su y+: (xo,yo)=vertice basso sinistra
h= !altezza=semiasse vert.(ellisse/2 su y+)
L= !semiluce=semiasse orizz.
xo= !estremo semiasse orizz.:basso sin
yo=
y=yo+h/L*sqr(abs(L^2-(x-xo-L)^2)) ![xo,xo+2*L],[yo,yo+h]
II) Semiellisse su y-: (xo,yo)=vertice alto sinistra
h= !altezza=semiasse vert.(ellisse/2 su y-)
L= !semiluce=semiasse orizz.
xo= !estremo semiasse orizz.:alto sin
yo=
y=yo-h/L*sqr(abs(L^2-(x-xo-L)^2)) ![xo,xo+2*L],[yo-h,yo]
A) Flesso sinus discendente (t orizz.): (xo,yo)=alto sinistra
h= !altezza tot.(sinus discendente)
L= !larghezza
xo= !estremo alto sin
yo=
y=yo-h/2+h/2*cos((x-xo)*180/L) ![xo,xo+L],[yo-h,yo]
B) Flesso sinus ascendente (t orizz.): (xo,yo)=basso sinistra
h= !altezza tot.(sinus ascendente)
L= !larghezza
xo= !estremo basso sin
yo=
y=yo+h/2-h/2*cos((x-xo)*180/L) ![xo,xo+L],[yo,yo+h]
Come esempio costruisco un profilo a goccia:
!inizio script
ht= 7 !altezzagoccia
h1=1.5 !altezza punto rigonfiamento goccia
r1=1.5 !semilarghezza goccia alla base
r2=2.3 !semilarghezza rigonfiamento
it=50 !inclinazione tangente alla base: non tutti i valori sono validi!
!2) arco su quadrante 2; (xo,yo)=vertice basso sinistra
t=tan(it) !pendenza nel punto basso sin.(ellisse su II)
h=r2-r1 !altezza
L=h1 !base (semiluce)
a=sqr(abs((h^2/t^2+L^2-2*L*h/t)/(1-2*h/L/t)))
b=a*t/L*sqr(abs(a^2-L^2))
!y1=r1-b+h+b/a*sqr(abs(a^2-(x -L)^2)) ![0, L],[r1,r1+h] !xo=0,yo=r1
h2=ht-h1
be=40
am=r2/(1- cos(90+be))
!y2=am*cos( (x-h1)/h2*(90+be) )- am*cos(90+be)
n=20 !suddivisioni curva
put 0,r1
for i=1 to n-1
x=ht/n*i
y1=r1-b+h+b/a*sqr(abs(a^2-(x -L)^2))
y2=am*cos( (x-h1)/h2*(90+be) )- am*cos(90+be)
yy1= y1* (sgn(x)-sgn(x-h1))/2
yy2= y2* (sgn(x-h1)-sgn(x-ht))/2
y=yy1+yy2
put x,y
next i
put ht,0
poly2 nsp/2, 1,get (nsp)
!fine script
La curva y1 è formata da un arco di ellisse, con un vertice (estremo di un asse) in (h1,r2).
La curva y2 è una porzione di sinusoide così ottenuta;
La funzione:
y2=am*cos( x/h2*(90+be) )
è un arco di sinusoide che per be compreso tra 0 e 90 presenta in x=h2 una tangente negativa,
con flesso in: x/h2*(90+be)=90 x=90/(90+be)*h2<h2.
L’ampiezza totale dell’arco in [0,h2] risulta: am-am*cos(90+be)
Dato che tale ampiezza deve eguagliare r2:
am=r2/(1- cos(90+be))
Inoltre la curva va spostata in alto per valere 0 in h2:
y2= am*cos( x/h2*(90+be) )+ am*cos(90+be)
La curva deve poi essere traslata di h1 verso x+:
y2= am*cos( (x-h1)/h2*(90+be) )+ am*cos(90+be)
Come si vede, il procedimento per costruire anche un semplice profilo è piuttosto laborioso.
Però abbiamo così una idea della complessità dei calcoli che elabora l’elaboratore elettronico quando si disegnano semplici curve.