HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: PGON con fori multipli_2  (Letto 1983 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
PGON con fori multipli_2
« il: 26 Luglio 2012, 00:03 »
La natura, o meglio la biologia, procede da elementi semplici a strutture sempre più complesse, pur basandosi sulle stesse regole e i medesimi principi.
Nello stesso modo avviene per lo studio della geometria.   I fori in un PGON si ottengono con un grafo continuo che ripercorre i segmenti di collegamento.  Dopo aver costruito un poligono con all’interno una corona di fori, costruiamo ora una struttura più complessa, ove ogni foro all’interno possiede pure una corona di fori. Per farlo occorrono diverse nidificazioni.
Il concetto di base è la costruzione di un’arco. 
Consideriamo il loop:
for  i=0  to n
x=xc+r*cos(al+be/n*i)
y= yc+r*sin(al+be/n*i)
next i
lo script fornisce in sequenza le coordinate di n+1 punti di una arco antiorario centrato in (xc,yc), di raggio r,
con angolo al centro be, ruotato di al in senso antiorario. Ovvero il raggio di inclinazione al funge da origine per misurare l’arco, come nel comando:    arc2, xc,yc,r,al,be
Se l’arco è orario si cambia il segno di i :   -be/n*i
Per arrivare a costruire lo script si deve partire da uno schizzo, dove si disegna l’asse x, un’arco della circonferenza maggiore, un raggio inclinato dove è centrato il foro interno, un altro raggio uscente dal foro che va al centro del primo foro che fa da corona a quest’ultimo. Occorre poi considerare gli angoli in termini parametrici, dopo aver stabilito una lettera per ogni parametro. Poi si verifica sul calcolatore il risultato.

Lo script finale è questo:
r=        !raggio crf esterna
r1=      !raggio foro interno, corona primaria
r2=      !raggio foro interno, corona secondaria
c1=      !distanza centri  della corona primaria dal centro crf interna
c2=     !distanza centri  della corona secondaria dal centro del foro primario
o=       !numero lati foro secondario
w=      !numero fori di singola corona secondaria
n=       !numero segmenti dell’arco del foro primario (formato da w archi)
k=       ! numero fori della corona primaria
n=       !numero segmenti dell’arco crf esterna (formato da k archi)

!variabili loop: l,j,i,p,y con valori definiti da k,w, m, n,o
for l=0 to k-1 !totali l: k
op=(o+(1-(-1)^o)/2)/2
om=(o+(1-(-1)^(o+1))/2)/2-1/2
for y=0 to op !crf 2 tagliata dal ponte, parte inf andata
VERT (c1+c2)*cos(360/k*l)+r2*cos(360/k*l+180-360/o*om-360/o*y),
    (c1+c2)*sin(360/k*l)+r2*sin(360/k*l+180-360/o*om-360/o*y),0
next y
x1=c1*cos(360/k*l)
y1=c1*sin(360/k*l)

for j=0 to w-2
x2=c1*cos(360/k*l)+c2*cos(360/k*l-360/w*(j+1))
y2=c1*sin(360/k*l)+c2*sin(360/k*l-360/w*(j+1))
for i=0 to n
VERT x1+r1*cos(360/k*l-360/w*j-360/w/n*i),y1+r1*sin(360/k*l-360/w*j-360/w/n*i),0
next i
for y=0 to o
VERT x2+r2*cos(180-360/w*(j+1)+360/k*l-360/o*y),
    y2+r2*sin(180-360/w*(j+1)+360/k*l-360/o*y),0
next y !#o+1
next j
j=w-1 !totali j=w
for i=0 to n
VERT x1+r1*cos(360/k*l-360/w*j-360/w/n*i),y1+r1*sin(360/k*l-360/w*j-360/w/n*i),0
next i

for y=0 to om !crf 2 tagliata dal ponte, parte sup ritorno
VERT (c1+c2)*cos(360/k*l)+r2*cos(360/k*l+180-360/o*y),
    (c1+c2)*sin(360/k*l)+r2*sin(360/k*l+180-360/o*y),0
next y !tot: k*w crf di raggio r2 di o lati=k*w*(o+1)+k (la crf spezzata ha due vertici doppi)

for p=0 to m !totali p=m+1
VERT r*cos(360/k*l+360/k/m*p),r*sin(360/k*l+360/k/m*p),0
next p
next l !tot= k*(m+1)+k*w*(n+1)+k*w*(o+1)+k = k*( m+2+w*(n+o+2) )

for i=1 to k*( m+2+w*(n+o+2) )-1
EDGE i,i+1,-1,-1,0
next i
pen 20
EDGE i,1,-1,-1,0 !ponte chiusura

for i=1 to k*(m+1)+k*w*(n+1)+k*w*(o+1)+k
put i
next i
PGON nsp, 0, -1, get (nsp)

Una complicazione in più è derivata dal fatto che il ponte di collegamento tra crf esterna e foro primario spezza in due un foro secondario, che può avere un numero di lati pari o dispari. Per cui si è utilizzata la formula:
(n+(1-(-1)^n)/2)/2
che dà sempre un numero intero.
Se n dispari: (n+(1-(-1)^n)/2)/2=n/2+1/2 che è intero (es: con n=5 si ha 3)
se n pari: (n+(1-(-1)^n)/2)/2=n/2 che è comunque intero.
Analogamente, per avere con numero dispari un intero inferiore alla metà:
se n dispari: (n+(1-(-1)^(n+1))/2)/2-1/2 =n/2-1/2
se n pari:    (n+(1-(-1)^(n+1))/2)/2-1/2=n/2
Infatti per tagliare in due un poligono dispari occorre alternare i due risultati, ad esempio: 5=3+2.

Comunque la parte finale degli EDGE e dei PGON è molto semplice, essendo i punti ordinati su una una linea unica (naturalmente sono ripetuti i punti iniziali e finali e gli EDGE di collegamento, percorsi due volte).

Si può dare uno spessore dz all’oggetto, sostituendo PUT al comando VERT ed introducendo al posto degli EDGE e di PGON il comando:
EXTRUDE nsp/3 , 0, 0, dz, 55, get (nsp)

Tuttavia se vi vogliono costruire effettivi fori, occorre riordinare in modo diverso i vertici, isolando la crf esterna ed i singoli poligoni interni, per ripetere in chiusura le coordinate 2D del punto iniziale seguite da -1 al posto di 0:

for l=0 to k-1 !totali l: k
for p=0 to m-1 !totali p: m
PUT r*cos(360/k*l+360/k/m*p),r*sin(360/k*l+360/k/m*p),0
next p
next l
PUT r,0,-1 !primo punto ripetuto

for l=0 to k-1 !totali l: k

x1=c1*cos(360/k*l)
y1=c1*sin(360/k*l)
for j=0 to w-1
for i=0 to n
PUT x1+r1*cos(360/k*l-360/w*j-360/w/n*i),y1+r1*sin(360/k*l-360/w*j-360/w/n*i),0
next i
next j
PUT x1+r1*cos(360/k*l),y1+r1*sin(360/k*l),-1

for j=0 to w-1
x2=c1*cos(360/k*l)+c2*cos(360/k*l-360/w*(j+1))
y2=c1*sin(360/k*l)+c2*sin(360/k*l-360/w*(j+1))
for y=0 to o
PUT x2+r2*cos(180-360/w*(j+1)+360/k*l-360/o*y),
    y2+r2*sin(180-360/w*(j+1)+360/k*l-360/o*y),0
next y
PUT x2+r2*cos(180-360/w*(j+1)+360/k*l),
    y2+r2*sin(180-360/w*(j+1)+360/k*l),-1
next j

next l

EXTRUDE nsp/3 , 0, 0, dz, 55, get (nsp)

Naturalmente in questo caso le sottocatene non sono più necessarie, a meno che non si vogliano dividere in sottoparti la crf esterna e i fori della prima corona per particolari motivi.
Per creare lo spessore si può anche costruire una primitiva ripetendo lo script dei vertici con diverso valore di z, o scrivendo prima di ripeterlo, il comando:
addz dz
Occorre naturalmente ripetere pure lo script degli EDGE sommando agli indici il numero di vertici originario.
Poi bisognerà rovesciare la base inferiore PGON introducendo la circolazione oraria, anziché antioraria. Si dovranno anche elencare i segmenti verticali ed eventualmente quelli obliqui. Quindi occorre scrivere la sequenza dei PGON verticali.   Il vantaggio di avere una primitiva è che si può intervenire sui vertici anche con i comandi di spostamento, mentre una forma predefinita applica i comandi di spostamento a tutti i vertici e non a una parte sola.   Utilizzando poi una primitiva con contorno costituito da triangoli invece che da rettangoli, si può deformare o ruotare la parte alta rispetto la base, purché si mantenga l’ordine dei punti e la divisione in segmenti come accade per la forma RULED.
E’ possibile verificare negli esempi allegati i diversi risultati ottenibili con una primitiva, oppure con EXTRUDE o con RULED:
crf n fori liv2.gsm
crf n fori liv2_a.gsm
crf n fori liv2_b.gsm