HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: Percorsi orientati  (Letto 1737 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
Percorsi orientati
« il: 01 Agosto 2012, 18:42 »
I percorsi orientati o grafi sono una successione di segmenti o vettori.  Possono essere utili per costruire frattali, con la riproduzione in scala sempre più ridotta dello stesso percorso.   Ridurre in scala significa applicare una particolare trasformazione affine del piano detta similitudine.
Esempio di similitudine è la trasformazione:
MUL2 a,a
Tutti i comandi relativi a trasformazioni 2D o 3 D, compreso XFORM, che offre il linguaggio GDL non sono altro che trasformazioni affini.  Tali trasformazioni mantengono sempre il parallelismo e sono lineari, cioè si riconducono a sistemi di tre equazioni primo grado in tre incognite (che sono le coordinate dei punti), solitamente espresse da una matrice come è appunto XFORM.
Per costruire un percorso orientato si parte da un segmento, ad esempio orizzontale, come:
LINE2  L,0, 0,0
Poi si applica prima una traslazione della lunghezza del segmento di partenza, nella stessa direzione di questo, poi una rotazione,   Se si svolta a sinistra (senso antiorario) il valore dell’angolo è positivo, se si volta a destra (senso orario) va attribuito all’angolo un valore negativo.
Per esempio lo script sottostante fornisce un quadrato di lato L:
LINE2  L,0, 0,0
ADD2 L,0
ROT2 90
LINE2  L,0, 0,0
ADD2 L,0
ROT2 90
LINE2  L,0, 0,0
ADD2 L,0
ROT2 90
LINE2  L,0, 0,0

Per avere invece un rettangolo di lati a,b:

LINE2  a,0, 0,0
ADD2 a,0
ROT2 90
LINE2  b,0, 0,0
ADD2 b,0
ROT2 90
LINE2  a,0, 0,0
ADD2 a,0
ROT2 90
LINE2  b,0, 0,0

Un parallelogramma di angolo al rispetto x+:

LINE2  a,0, 0,0
ADD2 a,0
ROT2 al
LINE2  b,0, 0,0
ADD2 b,0
ROT2 180-al
LINE2  a,0, 0,0
ADD2 a,0
ROT2 al
LINE2  b,0, 0,0

Considerando lo script del quadrato e generalizzandolo,
per avere un poligono di n lati con lunghezza pari a L si scrive :

For i=1 to n
LINE2  L,0, 0,0
ADD2 L,0
ROT2 360/n
Next i

Questi concetti possono essere utili anche per costruire oggetti 3D.
Il seguente script fornisce un poligono 3D di lato esterno L, spessore s, altezza h.

group "a"
For i=1 to n
BLOCK L,s,h
ADDx L
ROTz 360/n
Next i
endgroup

group "b"
BLOCK L,s,h
endgroup

placegroup addgroup("a","b")

L’unione con il gruppo “b” serve per saldare tutto assieme.
Mi sarebbe sembrato più logico scrivere:

group "a"
For i=1 to n step 2
BLOCK L,s,h
ADDx L
ROTz 360/n
Next i
endgroup

group "b"
For i=2 to n+1 step 2
BLOCK L,s,h
ADDx L
ROTz 360/n
endgroup

placegroup addgroup("a","b")

In questo modo, in teoria, si dovrebbero alternare facce dispari ( nel primo gruppo) e pari nel secondo,
in modo che dalla fusione dei due gruppi si dovrebbe ottenere il risultato richiesto.
Non so per quale motivo lo script sottostante viene letto sul mio computer non come facce alternate,
ma disposte in sequenza (e ridotte di metà numero).  Spesso con i calcolatori bisogna studiare vie traverse.
Si comportano talvolta come l’uomo che li ha costruiti. Vi invito a verificarlo anche voi:

For i=1 to n step 2
BLOCK L,s,h
ADDx L
ROTz 360/n
Next i

Allego cone esempi:
greca.gsm
curva Peano.gsm
curva Peano2.gsm

La curva di Peano, se ripetuta all’infinito, riempie un quadrato. Naturalmente questa è una astrazione: il calcolatore comincia già ad avere difficoltà al sesto livello.  In questa forma la curva di Peano ripassa più di una volta lo stesso punto. Per passare da un livello all’altro si richiama il livello precedente con gosub, in questo modo si creano, manualmente, sottocatene che permettono di disegnare il frattale.   Non credo che, per questo scopo, si possa usare il loop con il comando FOR, per creare sottonidi nel frattale con il linguaggio GDL.   Anche se fosse possibile, servirebbe a poco, perché, anche moltiplicando per 2 o per 4 la RAM, si potrà aggiungere solo qualche livello di frattale.   Come con i numeri irrazionali tipo pi greco = PI, che in teoria avrebbero infinite cifre dopo la virgola, il computer può solo approssimare.   In ogni modo rende l’idea.  Il concetto di infinito esiste nella nostra mente, ma non ha riscontro nella realtà, almeno in quella fisica.   Non esistono nemmeno gli infinitesimi, ma appunto i quanti.

ZioBob

  • Che pacchia un forum senza spocchia!
  • ADMIN
    ...ho creato questo spazio e lo amo
  • *
  • Post: 5.099
Re:Percorsi orientati
« Risposta #1 il: 01 Agosto 2012, 22:26 »
Per quanto riguarda il risultato non conforme alle attese, devo rilevare che secondo me non è corretto ruotare "solo" di 360/n quando lo STEP è impostato a 2.
Se nella prima metà dello script posizioni solo i pezzi pari, devi spostarti e ruotare due volte, una volta posizionando un elemento BLOCK e un'altra volta lasciando lo spazio vuoto per i pezzi che verranno posizionati in seguito.
Probabilmente si può calcolare un "passo doppio" in una volta sola, ma per semplicità nel mio esempio ho preferito ripetere due volte le istruzioni ADD e ROT:

n=8
L=1
s=.3
h=.1

GROUP "a"
 For i=1 TO n STEP 2
   BLOCK L, s, h
   ADDx L
   ROTz 360/n
   ADDx L
   ROTz 360/n
 NEXT i
ENDGROUP

GROUP "b"
 ADDx L
 ROTz 360/n
 PEN 10
 FOR i=2 TO n+1 STEP 2
   BLOCK L, s, h
   ADDx L
   ROTz 360/n
   ADDx L
   ROTz 360/n
 NEXT i
ENDGROUP

PLACEGROUP ADDGROUP ("a", "b")


(mancava anche il NEXT nella seconda parte dello script)
-Roberto Corona-
archiradar  Staff



marcomasetti

  • Newbie
    ...sono qui da poco, il mio miglior amico è il pulsante RICERCA
  • *
  • Post: 183
Re:Percorsi orientati
« Risposta #2 il: 02 Agosto 2012, 12:58 »
Grazie zio Bob: è vero che con il tuo metodo si alternano:
ma quando poi fondo assieme i due gruppi la fusione è solo parziale.
Inoltre se invece di step 2 scrivo n/2 al posto di n ottengo lo stesso risultato per n pari.
Ciò dimostra che in questo caso il comando step non fa fare salti, ma mette semplicemente gli oggetti in fila.
Mi sembrava un po' strana la cosa, ma poi ho capito il motivo:
gli indici di i assumono con step 2 per i da 1 a n valori dispari: 1,3,5,...
ma siccome nello script non compare la variabile i, ma solo il comando di spostamento,
questo viene applicato in successione indipendentemente dai valori che assume i.
Pertanto i salti devono essere previsti dal comando spostamento, raddoppiandolo.
Per il gruppo "b" il primo elemento deve poi fare un salto,
per cui va prima anteposto, poi raddoppiato lo spostamento.
Non si spiega però la fusione solo parziale dei gruppi.
Però poi ho capito che ciò è dovuto dal fatto che hai inserito un pen 10 nel gruppo "b",
che disturba la fusione.

Volendo distinguere i casi in cui n è pari e n è dispari si può usare lo script:

if (1+(-1)^n)/2=1 then m1=n/2 else m1=(n+1)/2 !(1+(-1)^n)/2=1 se n pari, altrimenti=0
if (1+(-1)^n)/2=1 then m2=n/2 else m2=(n-1)/2

GROUP "a"
 For i=1 TO m1
   BLOCK L, s, h
   ADDx L
   ROTz 360/n
   ADDx L
   ROTz 360/n
 NEXT i
ENDGROUP

GROUP "b"
 ADDx L
 ROTz 360/n
 FOR i=1 TO m2
   BLOCK L, s, h
   ADDx L
   ROTz 360/n
   ADDx L
   ROTz 360/n
 NEXT i
ENDGROUP

PLACEGROUP ADDGROUP ("a", "b")

Se ad esempio n=7 in gruppo "a" ci saranno 4 elementi,
di cui 2 sovrapposti, e nel gruppo "b" avremo 3 elementi.
Non c'è infatti bisogno di utilizzare nel gruppo "b" valori di i pari,
cosa che succede per:
 FOR i=2 TO n+1 STEP 2
e non serve comunque a nulla utilizzare il salto STEP 2 per il motivo che ho detto,
non comparendo la variabile i entro il loop.

A questo punto però preferirei scrivere:

GROUP "a"
   BLOCK L, s, h
ENDGROUP

GROUP "b"
   ADDx L
   ROTz 360/n
 FOR i=1 TO n-1
   BLOCK L, s, h
   ADDx L
   ROTz 360/n
 NEXT i
ENDGROUP

PLACEGROUP ADDGROUP ("a", "b")

Che fornisce lo stesso risultato sempre con il numero minimo di elementi

Grazie Marco
« Ultima modifica: 03 Agosto 2012, 01:57 da marcomasetti »