La primitive della sfera può essere scritta anche in un altro modo, sostituendo il parametro della latitudine v con il parametro dell’altezza z del parallelo rispetto il polo sud. In questo modo i paralleli risulteranno equidistanti.
Dato che nello script precedente per j=0 si aveva il polo nord e per j=m il polo sud, mentre qui è stato invertito l’ordine, per avere i parametri crescenti verso l’alto, si sono dovuti riscrivere i PGON per cambiare il senso di rotazione, altrimenti la figura verrebbe vista dall’interno, con un rendering privo di senso.
Per invertire il senso di rotazione di un PGON a tre lati si procede in questo modo:
PGON 3,0,-1, a,b,c diventa PGON 3,0,-1, -a,-c,-b
Cioè si cambia il segno degli indici degli EDGES e si scambia il secondo con il terzo.
Per un PGON a quattro lati si procede in questo modo:
PGON 4,0,-1, a,b,c,d diventa PGON 3,0,-1, -a,-d,-c,-b
Cioè si cambia il segno degli indici degli EDGES e si scambia il secondo con il quarto.
Il nuovo script è:
base
Vert xc,yc,zc-r !polo S
for j=1 to m-1
for i=0 to 2*m-1
z=2*r/m*j-r !j=0 polo S: z=-r; j=m, polo N: z=r
u=180/m*i
y=r*cos(asn(z/2)) !equivalente a y=sqr(r^2-z^2)
Vert xc+ cos(u)*y ,yc+sin(u)*y, zc+z
next i
next j
Vert xc,yc,zc+r !polo N
for j=0 to m-2
for i=1 to 2*m-1
EDGE 1+2*m*j+i,1+2*m*j+i+1, -1, -1,j1+j2*2
next i
EDGE 1+2*m*j+2*m,1+2*m*j+1, -1, -1,j1+j2*2
next j
for j=0 to m-3
for i=1 to 2*m
EDGE 1+i+2*m*j,1+2*m+i+2*m*j, -1, -1,j1+j2*2
next i
next j
for i=1 to 2*m
EDGE 1+i,1, -1, -1,j1+j2*2
next i
for i=1 to 2*m
EDGE 1+2*m*(m-2)+i,2*m*(m-1)+2, -1, -1,j1+j2*2
next i
for i=1 to 2*m-1
PGON 3, 0, -1, -i,2*m*(2*m-3)+i,-(2*m*(2*m-3)+1+i) !calotta sud
next i
PGON 3, 0, -1, -2*m,2*m*(2*m-3)+2*m,-(2*m*(2*m-3)+1) !chiusura calotta sud
for i=1 to 2*m-1
PGON 3, 0, -1, 2*m*(m-2)+i,2*m*(2*m-2)+1+i,-(2*m*(2*m-2)+i) !calotta nord
next i
PGON 3, 0, -1, 2*m*(m-1),2*m*(2*m-2)+1,-(2*m*(2*m-1)) !chiusura calotta nord
for j=0 to m-3 !j definisce i paralleli
for i=1 to 2*m-1 !i definisce i merdiani
PGON 4, 0, -1, i+j*2*m,2*m*(m-1)+1+i+j*2*m ,-(2*m+i+j*2*m),-(2*m*(m-1)+i+j*2*m)
next i
PGON 4, 0, -1, 2*m+j*2*m,2*m*(m-1)+1+j*2*m ,-4*m-j*2*m,-2*m^2-j*2*m
next j
body -1
Nell’oggetto sfera2.gsm di esempio la sfera è stata suddivisa a righe, per evidenziare il paralleli:
sui poli sembra esservi una punta, che scompare a definizioni alte, ciò è dovuto al fatto che mentre con il parametro latitudine gli ultimi paralleli si avvicinano, con il parametro altezza sono sempre equidistanti.
La sfera scritta in questo modo permette di utilizzare come profilo dei meridiani una qualsiasi funzione:
y=f(z) con f (r1)=0, f(r2)=0
r1 e r2 sono rispettivamente le distanze del poli S e N dal centro (xc,yc,zc) della superficie chiusa,
che possono essere diverse.
Vert xc,yc,zc-r1 !polo S
for j=1 to m-1
for i=0 to 2*m-1
z=(r2+r1)/m*j-r1 !j=0 polo S: z=-r; j=m, polo N: z=r
u=180/m*i
y=f(z)
Vert xc+ cos(u)*y, yc+sin(u)*y, zc+z
next i
next j
Vert xc,yc,zc+r2 !polo N
Anche i paralleli possono poi essere deformati:
Vert xc,yc,zc-r1 !polo S
for j=1 to m-1
for i=0 to 2*m-1
z=(r2+r1)/m*j-r1 !j=0 polo S: z=-r; j=m, polo N: z=r
u=180/m*i
y=f(z,u) !f(z,0)=f(z,360)
Vert xc+ cos(u)*y, yc+sin(u)*y, zc+z
next i
next j
Vert xc,yc,zc+r2 !polo N
Negli esempi utilizziamo come y=f(z) prima una parabola comune:
y= -a1*z^2+a2 con radici in +/-sqr(a2/a1)
poi una parabola del quarto ordine, che presenta una concavità:
y= z^4-a1*z^2+a1*a2 –a2^2 con radici in +/-sqr(a2)
In realtà nel primo esempio abbiamo utilizzato due semiparabole:
y=a2-a3*z^2 con radici in +/-sqr(a2/a3)=+/-r2, per la parte alta
y=a2-a1*z^2 con radici in +/-sqr(a2/a3)=+/-r1, per la parte bassa.
Per evitare che si sovrappongano abbiamo moltiplicato ciascuna per la funzione:
(sgn(z-za)-sgn(z-zb))/2
che vale 1 all’interno dell’intervallo [za,zb], vale ½ sugli estremi za,zb e vale 0 al di fuori:
(a2-a3*z^2)*(sgn(z)-sgn(z-r2))/2 !intervallo [0,r2]
(a2-a1*z^2)*(sgn(z+r1)-sgn(z))/2 !intervallo [-r1,0]