Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [CG] Oggetto si muove seguendo un ellissi

    Ciao a tutti,
    devo scrivere un programma che fa muovere un oggetto seguendo un'orbita ellittica di cui conosco i due assi e la coordinata del punto di origine.

    Ho però dei problemi, tra cui uno è il più importante: come calcolo la posizione di un punto su un ellissi partendo da un angolo?
    Ho fatto una prova modificando di poco il codice che uso per il cerchio:
    codice:
    angle = (1 - curveProgress) * (Math.PI / 2); //per fare un quarto di circonferenza
    px = Math.cos(angle) * _radiusX;
    py = Math.sin(angle) * _radiusY;
    Ma noto che dove la pendenza è maggiore i punti sono più vicini e quindi in un movimento l'oggetto sarebbe più veloce.
    Quindi mi serve una formula specifica per l'ellisse (da cui poi ricaverò quella per 1/4 di ellisse)

    Spero di essere stato chiaro e che qualcuno possa aiutarmi.

    Grazie in anticipo =)
    Flash Developer for Rich Media
    PHP, jQuery Developer

  2. #2
    A quale angolo ti stai riferendo? Quali sono gli estremi di questo angolo?

    Parli poi di velocità che "dove la pendenza è maggiore i punti sono più vicini e quindi in un movimento l'oggetto sarebbe più veloce.". Di quali punti stai parlando?

    Cerca di essere più preciso, comunque nel piano bidimensionale e, usati come sistema di riferimento gli assi cartesiani, dicesi ellisse: il luogo geometrico dei punti P del piano T per cui è costante la somma delle distanze da F1 e F2, essendo F1 e F2 i fuochi dell'ellisse.

    La formula sarà: [(x^2)/(a^2)] + [(y^2)/(b^2)] = 1


    Ciao

  3. #3
    Originariamente inviato da MdE2005
    A quale angolo ti stai riferendo? Quali sono gli estremi di questo angolo?
    L'angolo a cui mi riferisco è quello verde (alfa) in questa immagine:
    http://dl.dropbox.com/u/4064417/ellisse.jpg
    e il punto P rosa è quello che voglio trovare

    Originariamente inviato da MdE2005
    Parli poi di velocità che "dove la pendenza è maggiore i punti sono più vicini e quindi in un movimento l'oggetto sarebbe più veloce.". Di quali punti stai parlando?
    Se usando il codice che ho postato nel messaggio precedente invece di modificare le coordinate di un oggetto (quindi dandogli il movimento) stampo un oggetto nuovo ogni volta ottengo questo:
    http://dl.dropbox.com/u/4064417/quar...conferenza.jpg
    e da qui vedi che i punti più aumenta la pendenza, più sono vicini. Se quindi invece di stampare un oggetto nuovo ad ogni posizione cambio la posizione di un oggetto già stampato avremo l'illusione che la sua velocità diminuirà (prima ho detto aumenterà, ma ho sbagliato).

    Però ho notato questa cosa: se cambio il codice in questo modo:
    codice:
    var angle:Number;
    var progress:Number = 0;
    var velocity:Number = 0.05;
    var pallino:Pallino;
    var centerX:int = 200;
    var centerY:int = 200;
    var radiusX:Number = 150;
    var radiusY:Number = 100;
    
    function quartoCirconferenza(e:Event){
    	if (progress > 1) {
    		progress -= int(progress);
    	} else if (progress < 0) {
    		progress -= int(progress) - 1;
    	}
    	
    	angle = (1-progress) * (-Math.PI * 2); //circonferenza completa
    	
    	pallino = new Pallino();
    	addChild(pallino);
    	
    	pallino.x = centerX + radiusX * Math.cos(angle);
    	pallino.y = centerY + radiusY * Math.sin(angle);
    	
    	progress += velocity;
    }
    Ottengo un ellisse con i punti distribuiti equamente:
    http://dl.dropbox.com/u/4064417/ellisseFlash.jpg

    Quello che voglio ottenere io è un quarto di questa figura.
    Flash Developer for Rich Media
    PHP, jQuery Developer

  4. #4
    Tralasciando, almeno per ora, la questione matematica, non puoi modificare questa riga così:
    codice:
    angle = (1-progress) * ((-Math.PI * 2)/4);
    Fammi sapere..


    Ciao

  5. #5
    codice:
    var angle:Number;
    var progress:Number = 0.0;
    var velocity:Number = 0.02;
    var pallino:Pallino;
    var centerX:int = 200;
    var centerY:int = 200;
    var radiusX:Number = 150;
    var radiusY:Number = 100;
    
    var s:Shape = new Shape();
    s.graphics.lineStyle(1, 0x000000);
    s.graphics.drawEllipse(centerX - radiusX, centerY - radiusY,  radiusX*2, radiusY*2);
    addChild(s);
    	
    
    function quartoCirconferenza(e:Event){
    	if (progress > 1) {
    		progress -= int(progress);
    	} else if (progress < 0) {
    		progress -= int(progress) - 1;
    	}
    	pallino = new Pallino();
    	addChild(pallino);
    	
    	angle = (1-progress) * (-Math.PI * 2) / 4;   //circonferenza completa
    	
    	pallino.x = centerX + radiusX * Math.cos(angle);
    	pallino.y = centerY + radiusY * Math.sin(angle);
    	
    	progress += velocity;
    }
    Ho modificato il codice in modo da disegnare un ellisse di riferimento.
    Ho aggiunto poi il "/ 4" che mi hai suggerito, e il fattore "distanza che diminuisce" persiste.
    Ecco il risultato:
    http://dl.dropbox.com/u/4064417/ellisseFlash2.jpg

    e il risultato senza "/ 4" ... sembra che l'ellisse descritto dai pallini sia un po' discostato
    http://dl.dropbox.com/u/4064417/ellisseFlash3.jpg


    In più facendo qualche calcolo sulla formula dell'ellisse viene fuori che y = b * sqrt(1 - (x/a)^2) con come condizione x >= sqrt(1)/a
    però non saprei come farmela tornare utile
    Flash Developer for Rich Media
    PHP, jQuery Developer

  6. #6
    Non ho capito allora: vuoi disegnare un quarto di ellisse?

    Inoltre, la tua funzione come la invochi?


    Per la funzione matematica, l'utilizzo è il seguente: associ un punto della tua form all'origine (per esempio il punto P(100,200) lo fai corrispondere all'origine degli assi cartesiani; scegli un valore di a (larghezza ellisse) e un valore di b (altezza), ovviamente diversi tra loro altrimenti avrai una circonferenza.
    Es. a = 20 b = 10
    Prendi tutti i valori da a a 0, e li inserisci al posto della x; a questo punto ti rimane un'equazione di 2° grado ad una incognita, risolvi e trovi i corrispondenti y.
    Quindi avrai tanti punti con coordinate diverse: aggiorni le coordinate sommando 100 alle x e da 200 sottrai le y, così troverai le tue coordinate sul form.

    Spero di essere stato chiaro

  7. #7
    Si, dovrei aver capito, però penso tu abbia fatto un errore:
    Non devo prendere SEMPRE i valori da "a" a 0, perché non sempre il semiasse maggiore (a) è sull'asse X

    dico bene?
    Flash Developer for Rich Media
    PHP, jQuery Developer

  8. #8
    Ho aggiornato il codice ma sorgono due problemi:
    quando l'asse sulle x diventa 0 io ho compiuto solo metà ellisse e in più... non sembra essersi risolto il problema della distanza tra i pallini.
    http://dl.dropbox.com/u/4064417/ellisseFlash4.jpg

    PS: la funzione la chiamo ad ogni fotogramma dell'animazione come mostra la prima riga di questo codice
    Codice PHP:
    stage.addEventListener(Event.ENTER_FRAMEquartoCirconferenza);

    var 
    angle:Number;
    var 
    progress:Number 0.0;
    var 
    velocity:Number 10;
    var 
    pallino:Pallino;
    var 
    centerX:int 200;
    var 
    centerY:int 200;
    var 
    radiusX:Number 150;
    var 
    radiusY:Number 100;

    var 
    a:Number = (radiusX radiusY) ? radiusX radiusY;
    var 
    b:Number = (radiusX radiusY) ? radiusX radiusY;
    var 
    xTemp:Number radiusX;

    var 
    s:Shape = new Shape();
    s.graphics.lineStyle(10x000000);
    s.graphics.drawEllipse(centerX radiusXcenterY radiusY,  radiusX*2radiusY*2);
    addChild(s);

    function 
    quartoCirconferenza(e:Event){
        if (
    progress 1) {
            
    progress -= int(progress);
        } else if (
    progress 0) {
            
    progress -= int(progress) - 1;
        }
        
        
    /*angle = (1-progress) * (-Math.PI * 2); //circonferenza completa
        
        pallino.x = centerX + radiusX * Math.cos(angle);
        pallino.y = centerY + radiusY * Math.sin(angle);*/
        
        
    pallino = new Pallino();
        
    addChild(pallino);
        
        
    trace(xTemp+" <= "+Math.sqrt(1)/a);
        
    //if(xTemp <= Math.sqrt(1)/a){
            
    pallino.centerX xTemp;
            
    pallino.centerY Math.sqrt(Math.pow(xTemp a2));
        
    //}
        
        
    xTemp -= velocity;

    Flash Developer for Rich Media
    PHP, jQuery Developer

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Guarda, premetto che non saprei proprio come risolvere il tuo problema, ma con un codice di questo tipo l'oggetto sembrerà sempre rallentare.

    Questo perchè tu campioni l'angolo in modo uniforme: però, come hai notato, questo non corrisponde ad una distanza uniforme lungo l'ellisse.
    In pratica tu stai campionando la variabile sbagliata: tu vuoi dividere in intervalli uguali l'ellisse, ma nel codice dividi in intervalli l'angolo che sottende il segmento di ellisse, e non è la stessa cosa.

    Vedo se mi viene in mente qualcosa
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  10. #10
    Grazie Ippo... infatti è proprio quello su cui stavo ragionando... il risultato che ottengo è giusto ma sto andando sulla strada sbagliata...
    Flash Developer for Rich Media
    PHP, jQuery Developer

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.