2012-06-03 30 views
11

Sto provando a generare una galassia a spirale sotto forma di coordinate xy (2D) - ma la matematica non è il mio forte seme.Looping attraverso una formula che descrive una spirale per generare le coordinate XY

ho spigolato seguente da un excellent source su spirali:

Il raggio r (t) e l'angolo t sono proporzionali per il simpliest spirale, la spirale di Archimede. Pertanto l'equazione è:

(3) Equazione polare: r (t) = a [a è costante].
Da questo consegue
(2) forma parametri: x (t) = a cos (t), y (t) = a sin (t),
(1) Centrale equazione: x² + y² = a² [ arc tan (y/x)] ².

This question sorta di toccato generazione galassia, ma le risposte sono state disperse e ancora eccessivamente complesso per quello che mi serve (aka, la mia mente matematica-muto non può capirli).

In sostanza, quello che devo fare è passare una formula a spirale in PHP ~ 5000 volte per generare punti su una griglia XY 513x513. La dimensione della griglia e il numero di punti necessari potrebbero cambiare in futuro. Ancora meglio sarebbe pesare quei punti verso l'origine delle spirali sia in frequenza e quanto lontano possano allontanarsi dall'esatta formula matematica, analogamente a come effettivamente appare una galassia.

Questo documento matematico parla di a formula that describes the structure of spiral galaxies.

Ciò che mi ha completamente perso è come tradurre una formula matematica in qualcosa che posso scorrere in PHP!

risposta

6
// a is 5 here 
function x($t){ return 5 * $t * cos($t); } 
function y($t){ return 5 * $t * sin($t); } 

for ($t = 0; $t < 50; $t += 0.01) { 
    $xyPoint = array(x($t), y($t)); 
    // draw it 
} 

quando si verificano le equazioni parametriche come questo, il suo comune per la variabile parametro da t, che significa tempo. Quindi potresti pensare di collegare valori crescenti di t alle funzioni e ottenere le coordinate che cambiano gradualmente con l'aumentare del tempo trascorso.

è necessario scegliere i propri valori per a, l'intervallo di t e la dimensione del passo incrementale di t. Dipende solo dalle tue esigenze. entrambi cos() e sin() hanno un valore massimo di 1, se questo ti aiuta a calcolare valori adatti per a e t in base alle dimensioni della tua tela

+0

Grazie per il tuo aiuto, Chris. Questo ha esattamente risposto alla mia domanda per quanto riguarda il looping di un'equazione parametrica. Il mio prossimo compito è quello di modificare la formula per aderire a una griglia discreta, che non sono sicuro sia possibile. – Nick

+0

Il valore massimo di x (t) non può superare la metà della larghezza della griglia, assumendo che si centra la spirale. Quindi, il valore di 'a' deve essere <=' gridWidth/(upperBoundOf $ t * 2) '. L'intervallo che scegli per t determina quante spirali disegni. Ad esempio, se t va da 0 a 2PI, si forma un ciclo. Da 0 a 50 sono quasi 8 loop. Ecco perché t deve essere lasciato come variabile, e solo tu puoi scegliere un valore adatto (nessuno, ma tu sai quanti loop vuoi). La dimensione del passo del ciclo for è determinata da 'rangeDi $ t/numDesiredPointsToDraw' – goat