HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: Curve raccordate  (Letto 2365 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
Curve raccordate
« il: 07 Agosto 2012, 23:38 »
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.








oneby

  • Newbie
    ...sono qui da poco, il mio miglior amico è il pulsante RICERCA
  • *
  • Post: 177
Re:Curve raccordate
« Risposta #1 il: 08 Agosto 2012, 23:00 »
ciao... ma non è piu facile imparare 3d studio max????? e usare 3d studio in???     :whew:

ZioBob

  • Che pacchia un forum senza spocchia!
  • ADMIN
    ...ho creato questo spazio e lo amo
  • *
  • Post: 5.099
Re:Curve raccordate
« Risposta #2 il: 09 Agosto 2012, 09:27 »
Prima di tutto non credo che basterebbe solo "impararlo". Immagino che occorrerebbe anche "comprarlo". Mentre il GDL è già compreso in ArchiCAD.
Ma per le finalità di questi interventi, è addirittura superfluo lo stesso ArchiCAD... A Marco interessa mostrare la matematica che c'è dietro le forme geometriche, e quanto possa essere affascinante vedere come una formula possa generare curve, superfici e solidi.
Può essere benissimo un'attività fine a sé stessa.
Per imparare a usare il GDL basta molto meno, non occorre essere dei matematici (e nemmeno esperti programmatori). Ma, come ho già detto, a marcomasetti interessa mostrare aspetti originali e molto interessanti dell'uso dei linguaggi di programmazione.
Come sempre, chi non condivide gli stessi interessi non deve mica leggere tutto per forza...
-Roberto Corona-
archiradar  Staff



Jonathan

  • User
    ...frequento e metto a disposizione le mie conoscenze
  • *
  • Post: 1.587
Re:Curve raccordate
« Risposta #3 il: 09 Agosto 2012, 17:00 »
Magari qualche immagine potrebbe contribuire a rendere gli interventi più appassionanti.  :ok:
ArchiCAD 18 - AutoCAD 2016

ZioBob

  • Che pacchia un forum senza spocchia!
  • ADMIN
    ...ho creato questo spazio e lo amo
  • *
  • Post: 5.099
Re:Curve raccordate
« Risposta #4 il: 09 Agosto 2012, 17:52 »
concordo assolutamente.
-Roberto Corona-
archiradar  Staff



marcomasetti

  • Newbie
    ...sono qui da poco, il mio miglior amico è il pulsante RICERCA
  • *
  • Post: 183
Re:Curve raccordate
« Risposta #5 il: 10 Agosto 2012, 18:11 »
Dal momento che inserisco gli oggetti, mi farebbe piacere se qualcuno li utilizzasse per fare sperimentazioni, cambiando i parametri ed inserendoli in un contesto. Anche se li ho elaborati io, non mi dispiace vederli utilizzare,  Per il momento soltanto una signora se ne è servita per "comunicare" con gli ufo, tramite i cerchi di grano.  E' un uso fantasioso che non mi dispiace, ma un po' improprio.   Marco