HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: Solidi platonici 2  (Letto 1611 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
Solidi platonici 2
« il: 24 Giugno 2012, 19:11 »
I solidi platonici, comunque, non sono vere e proprie superfici definite da equazioni come la sfera, per cui il numero dei vertici, come degli spigoli, è prefissato.  Un altro modo per ottenerli potrebbe essere l’uso di piani secanti a partire da forme predefinite, come BLOCK x,y,z, In questo caso il rompicapo consiste nel calcolare l’inclinazione del piano di sezione e la sua posizione nello spazio, che poi va tradotta in opportuni movimenti. Credo però che il calcolatore debba poi fare calcoli più complessi, rispetto ad una primitiva già confezionata.
Tornando invece alla questione delle curve e delle superfici, per tradurle dall’algebra al linguaggio GDL, la forma più appropriata è quella parametrica.
Per esempio la crf di raggio r centrata in xc,yc sul piano xy ha l’equazione
x=xc+r*cos(u)
y=yc+r*sin(u)
z=0
0<=u<360
tradotta nel linguaggio GDL
n=36          !risoluzione=numero lati poligono: in realtà stiamo costruendo un ennagono, non una crf
xc=1
yc=.5
r=2         !raggio, fine parametri
for i=0 to n-1  !valori di i da 0 a n-1=n elementi=n segmenti
lin_  xc+r*cos(360/n*i), yc+r*sin(360/n*i),0, xc+r*cos(360/n*(i+1)), yc+r*sin(360/n*(i+1)),0
next i
Il valore xc+r*cos(360/n*i), yc+r*sin(360/n*i),0 fornisce il primo punto del segmento
xc+r*cos(360/n*(i+1)), yc+r*sin(360/n*(i+1)),0 fornisce il secondo punto del segmento,
sostituendo  i+1 ad i ci si riferisce infatti al punto successivo.
Il parametro u è stato sostituito da 360/n*i in modo che per i=0: u=0
mentre per i=n-1, risulta: i+1=n, u=360
Da notare che qui non ci sono stati problemi nell’ampliare l’intervallo di definizione di u comprendendo anche il valore u=360, perche le funzioni sin e cos sono circolari, ma di fatto si sono utilizzati non n punti, ma n+1 punti, perché il primo vertice è stato ripetuto due volte in forma diverse.
Volendo in analogia costruire la primitiva della sfera, occorrerà, come vedremo, spezzare in due parti lo script dell’iterazione, in altri termini per chiudere correttamente la curva si sarebbe dovuto scrivere:
for i=0 to n-2  !da 0 a n-2= n-1  elementi= n-1 segmenti
lin_  xc+r*cos(360/n*i), yc+r*sin(360/n*i),0, xc+r*cos(360/n*(i+1)), yc+r*sin(360/n*(i+1)),0
next i
i=n-1
lin_  xc+r*cos(360/n*i), yc+r*sin(360/n*i),0, xc+r*cos(0), yc+r*sin(0),0
La parte:
i=n-1
può essere omessa, perché il calcolatore attribuisce già automaticamente ad i il valore n-1
Infatti al termine di un loop il calcolatore attribuisce alla variabile l’ultimo valore+1.

Traduciamo infine nel linguaggio GDL l’equazione della sfera:
x=xc+r*cos(u)*cos(v)
y= yc+r*sin(u) *cos(v)
z= zc+r* sin(v)
!inizio script sfera di raggio r centrata in xc,yc,zc ---------------------------------------------------------------------
j1=0    !bit nascondi edges
j2=1    !bit superficie liscia
m=36  !resol=gestisce numero facce,  m=2 ottaedro
r=2
xc=1
yc=1
zc=.5  !fine parametri
base
Vert xc,yc,zc+r  !polo nord: vertice #1
for j=1 to m-1
for i=0 to 2*m-1
Vert xc+r*cos(180/m*i)*cos(90-180/m*j ),yc+r*sin(180/m*i)*cos(90-180/m*j ),zc+r*sin(90-180/m*j )  !
next i     !# 2*m  vertici
next j     !# 2*m*(m-1)  vertici
Vert xc,yc,zc-r  !polo sud: vertici totali # 2*m*(m-1)+2


for j=0 to m-2 !m-1 paralleli: 2*m*(m-1) edges totali: da 1 a 2*m*(m-1) edges
for i=1 to 2*m-1 !parallelo j: 2*m edges totali
EDGE 1+2*m*j+i,1+2*m*j+i+1, -1, -1,j1+j2*2 !parallelo j: 2*m-1 edges
next i
EDGE 1+2*m*j+2*m,1+2*m*j+1, -1, -1,j1+j2*2  !parallelo j: 1 edge (finale:  2*m si ricollega a 1)
next j

for j=0 to m-3  !2*m meridiani: 2*m*(m-2) edges totali: da 2*m*(m-1)+1 a 2*m*(m-1)+2*m*(m-2)
for i=1 to 2*m !parallelo j: 2*m edges totali
EDGE 1+i+2*m*j,1+2*m+i+2*m*j, -1, -1,j1+j2*2 !parallelo j: 2*m-1 edges
next i
next j

for i=1 to 2*m !2*2*m segmenti di meridiani ai poli
EDGE 1+i,1, -1, -1,j1+j2*2
!2*m edges al polo nord: da 2*m*(m-1)+2*m*(m-2)+1 a 2*m*(m-1)+2*m*(m-2)+2*m
next i
for i=1 to 2*m !2*2*m segmenti di meridiani ai poli
EDGE 1+2*m*(m-2)+i,2*m*(m-1)+2, -1, -1,j1+j2*2
!2*m edges al polo sud: da 2*m*(m-1)+2*m*(m-2)+2*m+1 a 2*m*(m-1)+2*m*(m-2)+2*2*m
next i

for i=1 to 2*m-1
PGON 3, 0, -1, i,2*m*(m-2)+2*m*(m-1)+1+i,-(2*m*(m-2)+2*m*(m-1)+i) !calotta nord
PGON 3, 0, -1, -(2*m*(m-2)+i),(2*m*(m-2)+2*m*m+i),-(2*m*(m-2)+2*m*m+1+i) !calotta sud
next i
PGON 3, 0, -1, 2*m,2*m*(m-2)+2*m*(m-1)+1,-(2*m*(m-2)+2*m*(m-1)+2*m) !chiusura calotta nord
PGON 3, 0, -1, -2*m*(m-1),(2*m*(m-1)+2*m*m),-(2*m*(m-2)+2*m*m+1) !chiusura calotta nord

for j=0 to m-3
for i=1 to 2*m-1
PGON 4, 0, -1, -i-j*2*m,2*m*(m-1)+i+j*2*m ,2*m+i+j*2*m,-(2*m*(m-1)+1+i+j*2*m)
next i
PGON 4, 0, -1, -2*m-j*2*m,2*m*(m-1)+2*m+j*2*m ,2*m+2*m+j*2*m,-(2*m*(m-1)+1+j*2*m)
next j
body -1  !fine script sfera primitiva

nota:per verificare  se il numero totale di VERT  è corretto inserirlo a caso in un EDGE, poi “controlla script” non deve dare errore, aumentarlo poi di 1 e “controlla script” deve dare errore.
Analogamente per il numero totale di EDGE, inserirlo a caso in un PGON, poi“controlla script” non deve dare errore, aumentarlo poi di 1 e “controlla script” deve dare errore.

Conclusione: in effetti non abbiamo costruito una sfera, ma un ottaedro a partire dal quale ci avviciniamo sempre di più alla sfera per m tendente all’infinito.
Allego la primitiva icosaedro ed alcuni solidi platonici a punte, che però non sono primitive, ma poligoni accostati
« Ultima modifica: 27 Giugno 2012, 17:45 da marcomasetti »