HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: Fasci di curve  (Letto 2273 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
Fasci di curve
« il: 05 Marzo 2013, 11:14 »
Considerate due funzioni f(x) e g(x)
si può passare dall'una all'altra utilizzando la nuova funzione:
y=f(x)+t*(g(x)-f(x))
Per t=0 si ha f(x) e per t=1 si ha g(x).
Per i valori intermedi di t si avranno curve che i avvicinano all’una o all’altra forma.
Il fascio di m+1 curve che passano dalla forma di  f(x) a quella g(x) si ottiene con il loop:

for j=0 to m
t=1/m*j

for i=0 to n !risoluzione curva=n
x=x1+(x2-x1)/n*i !curva definita per x in (x1,x2)
y=f(x)+t*(g(x)-f(x))
...
next i

next j

Volendo introdurre nuove curve con valori di t<0 e >1:

for j=-m1 to m+m2
t=1/m*j
...
next j

Si aggiungeranno così m1 curve con valori di t<0 e m2 curve con valori di t>1.
La prima curva corrisponderà al valore   t1=-m1/m
La seconda curva corrisponderà al valore t2=(m+m2)/m

Volendo invece partire da una curva corrispondente al valore arbitrario t1,
per arrivare a quella corrispondente al valore arbitrario t2 si deve operare in questo modo:

curva di partenza:
y1=f(x)+t1*(g(x)-f(x))
curva di arrivo:
y1=f(x)+t2*(g(x)-f(x))

for j=0 to m
t=t1+(t2-t1)/m*j    !per j=0: t=t1; per j=m: t=t2

for i=0 to n !risoluzione curva=n
x=x1+(x2-x1)/n*i !curva definita per x in (x1,x2)
y=f(x)+t*(g(x)-f(x))
...
next i

next j

Le curve espresse come funzioni possono essere utilizzate per definire un profilo, ma generalmente sono poco adatte per definire una sezione di un oggetto, che in generale è una forma chiusa.
Però abbiamo studiato il caso delle funzioni interpretate come onde, che ci permettono di costruire curve chiuse.
Oppure possiamo definire una curva chiusa direttamente con le coordinate polari.
Una volta descritto il fascio in 2D, ad esempio con il comando POLY2, è possibile tradurlo in 3D utilizzando al suo posto il comando PLANE, che necessita della variabile altezza, da aggiungere.
Una volta realizzate le forme piane sovrapposte in 3D, con poche modifiche dello script, è possibile trasformare i comandi nella definizione dei vertici di una primitiva a cilindro.
Ricordo che ogni “piano” j della primitiva può essere ingrandito, traslato o ruotato semplicemente utilizzando i comandi di movimento, rotazione e ingrandimento:  ADD,ROT,MUL.
Questo è possibile farlo soltanto con primitive esplicitate come questa, essendo possibile intervenire su singoli vertici o su insiemi di veritici.

Nell’esempio allegato utilizzo questa primitiva:
! Modello: CILINDRO (m+1 poligoni sovrapposti di n lati ciascuno)
! Meridiana: DIRETTRICE, Equatore: GENERATORE
! Elenco di m+1 curve chiuse sovrapposte composta ciascuna di n punti
! grattacielo a diversi piani: m+1 "PLANE" composti di n punti

m=    !numero nodi su ogni meridiano (=n.dei paralleli)
n=    !numero nodi su ogni sezione chiusa o parallelo (=n.dei meridiani)
j1=   !nascondi edges
j2=   !sup.liscia

base

for j=0 to m   !n.sezioni da 1 a m+1: ogni valore di j corrisponde ad una sezione di n lati
for i=0 to n-1 !ogni valore di i definisce una curva meridiana che tocca m+1 sezioni chiuse

x=x(i,j)
y=y(i,j)
z=z(i,j)

VERT x, y, z

next i
next j

for i=1 to n-1 !j=0
EDGE i,1+i, -1, -1, 0
next i
EDGE n,1  , -1, -1, 0
for j=1 to m-1 !sezioni
for i=1 to n-1
EDGE n*j+i,1+n*j+i, -1, -1, j1+2*j2
next i
EDGE n*j+n,1+n*j, -1, -1, j1+2*j2
next j
for i=1 to n-1 !j=m
EDGE n*j+i,1+n*j+i, -1, -1, 0
next i
EDGE n*j+n,1+n*j, -1, -1, 0

for j=0 to m-1 !collegamenti sezioni
for i=1 to n
EDGE i+n*j,n+i+n*j, -1, -1,  j1+2*j2
next i
next j

for j=0 to m-1 !collegamenti sezioni obliqui
for i=1 to n-1
EDGE i+n*j,n+i+n*j+1, -1, -1,  j1+2*j2
next i
EDGE i+n*j,n+1+n*j, -1, -1,  j1+2*j2
next j

for j=0 to m-1
for i=1 to n-1
PGON 3, 0, -1, i+j*n,n*(m+1)+1+i+j*n,-(n*(2*m+1)+i+j*n)
next i
PGON 3, 0, -1, i+j*n,n*(m+1)+1+j*n,-(n*(2*m+1)+i+j*n)
next j

for j=0 to m-1
for i=1 to n
PGON 3, 0, -1, -(n*(m+1)+i+j*n),n*(2*m+1)+i+j*n,-(n+i+j*n)
next i
next j

for i=1 to n
put -(n+1-i)
next i
PGON nsp, 0, -1, get(nsp) !top

for i=1 to n
put  n*m+i
next i
PGON nsp, 0, -1, get(nsp) !bottom

body -1