Genera casualmente punti in un movimento a spirale usando Javascript

3

Quindi ho un programma javascript che attualmente riceve punti casuali, genera un valore casuale x, y, z attorno al punto centrale, entro il raggio r

  var maxArms = 3;
  var i = 0;
    var color = [];
  for(var arm = 0; arm <= maxArms; arm++) {
    var perArm = (numStars/maxArms);
    var perPoint = Math.ceil((r/10)/5);
    var actualPoints = ((r/10)/5);
    perPoint = (perArm/(actualPoints+(actualPoints/4)));
    var angle = 8;

    for (var ra = 0; ra < 412; ra += 2) {
        for (var p = 0; p < (580-ra); p++) {
        var an = Math.random() * Math.PI * 2;
        var pX = x(ra,angle) + ((Math.cos(an) * (Math.random()*512)) * (Math.random() > .5 ? 1 : -1)), 
                pY = y(ra,angle) + ((Math.cos(an) * (Math.random()*512)) * (Math.random() > .5 ? 1 : -1)),
            pZ = Math.random() * ((r/2)-p) * (1 / ra) * (Math.random() > .5 ? 1 : -1),
                particle = new THREE.Vertex(
                    new THREE.Vector3(pX, pZ, pY)
                );
            innerRing.vertices.push(particle);

            var h = Math.random() * (291 - 185) + 185,
                s = Math.random() * (66 - 34) + 34,
                v = Math.random() * (100 - 72) + 72;
            color[i] = new THREE.Color(0xffffff);
            color[i].setHSV(h / 360, s / 100, v / 100);

        i++;
        }
    }
  }

Ora sto cercando di trovare un modo piuttosto che posizionare le cose in un punto qualsiasi del raggio, per ottenere i punti a spirale, in un numero definito di "Spiral Arms", sono sicuro che questo richiederà qualcosa con Sine e Cosine, ma ho passato ore a cercare di capire come utilizzare queste funzioni per fare ciò di cui ho bisogno e non sono sicuro di come farlo.

Quello che sto cercando è una variabile per il numero di braccia numArms e voglio avere la funzione sopra per prendere il numero di braccia e creare un numero uguale di punti in ciascun braccio, e ciascun arco di braccio fuori dal punto centrale 0,0 in un movimento a spirale.

Ha senso?

Ho trovato altre domande e risposte diverse su google su come creare una spirale, oltre a come trovare punti casuali (come mostrato sopra) ma nulla che possa aiutarmi a trovare punti casuali attorno alle braccia a spirale, ma una volta avere i punti per la spirale non sono sicuro di come ottenere le coordinate casuali x, y, z attorno alla spirale.

Inoltre, se è possibile, per renderlo così all'inizio di ogni braccio ci sono più punti che alla fine del braccio.

Sì, so che il mio script non è ottimizzato correttamente, ma al momento sto cercando più funzioni.

Ho allegato un'immagine di ciò che attualmente viene generato con il codice sottostante, così come un campione di una galassia a spirale, anche se non voglio che il centro sia grande come la seconda immagine.

Modifica

Ho apportato alcune modifiche allo script di generazione, anche se piuttosto sciatto, inizia a far sì che le stelle arrivino dal centro come una spirale, ma inevitabilmente si ingrandisce e non sembra più una spirale, ho provato a giocare con tutti le variabili ( ra e angle ) ma non rendono la spirale migliore, cosa posso fare?

Generazione corrente:

Generazionediesempio:

    
posta Cory Evans 02.01.2013 - 21:27
fonte

1 risposta

5

Credo che tu debba solo seguire la formula per una spirale , data as,

 x(t) = a * t * cos(t), y(t) = a * t * sin(t) 

dove a è costante puoi utilizzare per esprimere la velocità con cui la tua spirale si espande. Per il caso 3D basta aggiungere l'argomento extra z . Per definire un numero di braccia, puoi semplicemente inserirlo in un'altra dichiarazione for . Tuttavia, se non vuoi creare una spirale 3D in crescita, puoi correggere il parametro z all'interno di un determinato intervallo. Per creare l'illusione di una galassia, credo che potresti aggiungere un offset a x e y ed eseguirlo più volte,

var a = 5;
var offset = 2; // You have to choose a good offset for your project.

var numArms = 3;
for (var arm; arm < numArms; arm++) {
    for (var p = 0; p < num; p++) {
        var pX = a * p * cos(p + (Math.PI * arm)) + (Math.random() * offset);
        var pY = a * p * sin(p + (Math.PI * arm)) + (Math.random() * offset);
        var pZ = Math.random() * a;   

        // do something with pX, pY, and pZ
    }
}

Cerca qui le formule spirale originali , e a questo question , che fa qualcosa di simile utilizzando PHP .

    
risposta data 02.01.2013 - 22:15
fonte

Leggi altre domande sui tag