Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    problema in rotazione immagine

    Salve , sto creando in java il gioco del biliardo.
    Per abbellire il tutto ho deciso di aggiungere l'immagine della stecca che fino al momento del tiro si muove orientata lungo la direzione data dalla retta che unisce il centro della pallina bianca e il punto in cui si trova il cursore del mouse...
    poichè uso una immagine png come stecca in base alla posizione del cursore devo adeguatamente ruotare l'immagine e posizionarla al posto giusto (lungo la retta prima citata e dietro la bianca rispetto al punto in cui sta il cursore)...
    il problema sorge proprio qui:
    innanzitutto tramite le mie basilari conoscenze matematiche sono riuscito ad ottenere l'angolo tra il centro della bianca e il punto del cursore , quindi vado a ruotare l'immagine della stecca secondo questo angolo mediante la procedura:
    codice:
    g2.rotate(Math.toRadians(angolo));
    g2.drawImage(img, posizioneX, posizioneY, null);
    Sembra che la rotazione venga fatta in modo corretto , ma non riesco a gestire il posizionamento della stecca in base alla rotazione , in termini chiari non riesco a settare adeguatamente quei due parametri "posizioneX" e "posizioneY" in base all'angolo "angolo" (ripeto: in modo che la stecca stia dietro la bianca e lungo la retta che congiunge il centro della bianca con il punto in cui si trova il cursore del mouse)


    Mi date qualche dritta??
    Ps. spero di essermi spiegato in modo adeguato...

  2. #2
    In quattro passaggi:
    1) Seno e Coseno dell'angolo in radianti ti danno rispettivamente la y e la x rispetto alle coordinate 0,0 per un segmento grande 1.
    2) Moltiplichi il risultato per il raggio e ottieni il punto preciso dove posizionare l'oggetto rispetto alle coordinate 0,0.
    3) Semplifichi le coordinate all'intero più prossimo
    4) Trasporti le coordinate in base al tuo punto di riferimento (le coordinate del centro della palla).
    ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Allora , sto cercando di mettere in atto il tuo suggerimento ma qualcosa non funziona...ti mostro cosa sto facendo:
    supponendo che il raggio io lo indichi , qui di seguito , come "distanza" , cioè sarà la distanza tra il centro della palla e il punto in cui sta il cursore del mouse trovata mediante:

    codice:
    public double distanza(Vettore v) {
            return Math.sqrt ((x - v.x) * (x - v.x) + (y - v.y) * (y - v.y));
    }
    considera che è un metodo d'istanza di una classe "Vettore" dove ogni istanza rappresenta un vettore in due coordinate cartesiane x e y

    fin qui dimmi se ho commesso errori...

    poi , tornando alla rotazione e quindi al disegno , ho fatto qualcosa del tipo:

    codice:
    g2.rotate(Math.toRadians(angolo - 90));  //PERCHE' HO L'IMMAGINE DELLA STECCA VERSO L'ALTO
    int x = (int)((int) (Math.cos(Math.toRadians(angolo)) * distanza) + palle [0].getCentro().getX());
    int y = (int)((int) (Math.sin(Math.toRadians(angolo)) * distanza) + palle [0].getCentro().getY());
    g2.drawImage(immagineStecca, x, y, this);
    dove palle [0] è una istanza della classe Palla e rappresenta una palla da biliardo , immagineStecca e una Image rappresentante l'immagine png della stecca

    ma c'è sempre qualcosa che non va , e non capisco il perchè...
    aggiungo che io l'angolo lo ottengo (mediante un apposito algoritmo) come di consueto si è soliti considerare (crescono in senso antiorario) e con assi x e y con verso positivo rispettivamente verso destra e verso l'alto...può essere quindi il diverso orientamento in Java dell'asse y (cioè verso positivo verso il basso) la causa dei miei problemi?

  4. #4
    Non ti posso aiutare perché:
    a) non mi dici qual'é il problema, la stecca non è allineata? Non viene disegnata nel punto giusto?
    b) non c'é l'algoritmo del calcolo dell'angolo.

    Il problema del calcolo dell'angolo e della distanza lo risolvi tramite la conversione tra coordinate cartesiane a polari dopo aver trasposto le coordinate in modo che la pallina si trovi nel punto 0,0.
    Le coordinate polari sono appunto l'angolo in radianti e la distanza.

    Il fatto che il punto 0,0 si trovi in alto a sinistra ti comporta che le y sono tutte rovesciate, una linea che va dal punto 0,0 al punto 10,0 sarà una riga che va verso il basso e non verso l'alto. Così come l'angolo si muoverà in modo speculare rispetto all'asse delle x, pertanto la rotazione sarà oraria con l'angolo di 90° verso il basso.
    Detto questo è facile capire com'é la storia, ipotizzando che senza rotazione la tua stecca punti verso Est ruotandola di 90° (π/2) essa punterà a a Sud e ti serviranno ben 270° (3/2 π) per farla puntare a Nord.
    Pertanto l'angolo di rotazione deve tenere conto non solo dell'effettivo angolo tra la palla e il mouse, ma deve anche correggere l'orientamento dell'immagine se questa, senza rotazione, non punta ad Ovest!!!
    ...

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Originariamente inviato da Caiodark
    In quattro passaggi:
    1) Seno e Coseno dell'angolo in radianti ti danno rispettivamente la y e la x rispetto alle coordinate 0,0 per un segmento grande 1.
    2) Moltiplichi il risultato per il raggio e ottieni il punto preciso dove posizionare l'oggetto rispetto alle coordinate 0,0.
    3) Semplifichi le coordinate all'intero più prossimo
    4) Trasporti le coordinate in base al tuo punto di riferimento (le coordinate del centro della palla).
    Diciamo che i primi tre punti sono riuscito a risolverli , ma ora , probabilmente mi sto perdendo in un bicchier d'acqua , non riesco ad attuare il 4° punto...cioè riesco ad ottenere il punto di posizionamento della stecca rispetto all'origine (0 , 0) , quindi ruota attorno all'origine , mentre io vorrei che la stecca ruotasse attorno al centro della pallina...ma NON ci riesco

    Un aiuto?

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Ho risolto il problema mediante l'utilizzo di un'istanza della classe AffineTransform facendo nel seguente modo:

    codice:
    /*considerando che in precedenza ho inizializzato così:
    AffineTransform at = new AffineTransform ()*/
    
    at.setToTranslation(ComponenteXCentroPalla , componenteYCentroPalla);
    at.rotate(Math.toRadians (angolo));
    g2.drawImage(immagineStecca, at, this);
    In tal modo riesco a far muovere l'immagine della stecca attorno al centro della palla...


    Ora sono incappato al passo successivo:
    nel gioco permetto all'utente di settare la forza di tiro mediante una progress bar che parte da zero al primo click dell'utente e si arresta al secondo click , settando quindi il relativo valore di potenza in base alla percentuale della progressBar ottenuto...io vorrei che nel momento in cui la potenza di tiro oscilla (cioè nel momento tra il primo e il secondo click) la stecca andasse avanti e indietro in base alla percentuale lungo la direzione in cui è orientata...come posso fare?

    supponendo di avere una variabile intera spostamento che contenga 10 quando la progressBar è a 100% e 0 quando la progressBar e a 0% e supponendo di avere l'angolo che mi da la direzione lungo la quale è orientata la stecca , come posso far si che la stecca si muova nel modo desiderato?

    penso di dover lavorare con i seno e coseno dell'angolo e il valore di spostamento , ci ho provato in vari modi ma nessun risultato sperato...mi aiutate?

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    nessuno che sappia aiutarmi?

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Ho risolto facendo

    codice:
    double coseno = Math.cos (Math.toRadians(angolo));
    double seno =  Math.sin (Math.toRadians(angolo));
    at.setToTranslation(centroPallaComponenteX + spostamento * (-seno),centroPallaComponenteY + spostamento * coseno );
    at.rotate(Math.toRadians (angolo));
    g2.drawImage(immagineStecca, at, this);

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.