Visualizzazione dei risultati da 1 a 4 su 4

Discussione: interpolazione forme?

  1. #1

    interpolazione forme?

    vi spiego ciò che dovrei ottenere

    Scrivere un’applicazione o applet che crea un’animazione consistente in un cerchio che si muove in orizzontale da destra a sinistra e viceversa da un’estremità all’altra della finestra. Il cerchio deve cambiare gradualmente diametro (da 10 a 50 pixel) e colore (da giallo a rosso) mentre si sposta da destra a sinistra.

    ora, partendo dal presupposto che di java non so NIENTE, ma NIENTE..(zero assoluto)

    come faccio a far cambiare le dimensioni del diametro del cerchio mentre si sposta?

    vi posto la parte del codice già in mio possesso (che dovrebbe fargli fare tutto il resto):

    import java.applet.Applet;
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.geom.Ellipse2D;


    /** spostamento del cerchio lungo l'asse x */
    public class BouncingCircle extends Applet implements Runnable {
    int x = 10, y = 40, r = 10; // posizione e raggio del cerchio

    int dx = 20, dy = 0; // traiettoria del cerchio
    Color endColor = Color.RED; // where we end

    Color startColor = Color.YELLOW; // where we start
    Color currentColor = startColor;
    float fraction = 0;


    Thread animator; // thread animazione

    volatile boolean pleaseStop; // finire l'operazione

    /** cerchio iniziale */
    public void paint(Graphics g) {
    // g.setColor(Color.yellow);
    g.setColor(currentColor);
    g.fillOval(x - r, y - r, r * 2, r * 2);
    }


    /**
    * Questo metodo muove il cerchio e lo ridisegna.
    * Thread animazione richiama questo metodo periodicamente.
    */
    public void animate() {
    // rimbalza se si colpisce una superficie.
    Rectangle bounds = getBounds();
    if ((x - r + dx < 0) || (x + r + dx > bounds.width))
    dx = -dx;
    if ((y - r + dy < 0) || (y + r + dy > bounds.height))
    dy = -dy;


    fraction += 0.04;
    if (fraction >= 1) fraction = 0;
    // interpolate between start and end colors with current fraction
    int red = (int)(fraction * endColor.getRed() +
    (1 - fraction) * startColor.getRed());
    int green = (int)(fraction * endColor.getGreen() +
    (1 - fraction) * startColor.getGreen());
    int blue = (int)(fraction * endColor.getBlue() +
    (1 - fraction) * startColor.getBlue());

    currentColor = new Color(red, green, blue);
    // muove il cerchio.
    x += dx;
    y += dy;

    // chiede al browser il richiamo del metodo paint() per ridisegnare il cerchio nella sua nuova posizione.

    repaint();
    }

    /**
    * This method is from the Runnable interface. It is the body of the thread
    * that performs the animation. The thread itself is created and started in
    * the start() method.
    */
    public void run() {
    while (!pleaseStop) { // Loop until we're asked to stop
    animate(); // Update and request redraw
    try {
    Thread.sleep(100);
    } // 100 millisecondi di attesa in ogni frame
    catch (InterruptedException e) {
    } // Ignore interruptions
    }
    }

    /** Start animating when the browser starts the applet */
    public void start() {
    animator = new Thread(this); // Create a thread
    pleaseStop = false; // Don't ask it to stop now
    animator.start(); // Start the thread.
    // The thread that called start now returns to its caller.
    // Meanwhile, the new animator thread has called the run() method
    }

    /** Stop animating when the browser stops the applet */
    public void stop() {
    // Set the flag that causes the run() method to end
    pleaseStop = true;
    }
    }

    qualsiasi aiuto è gradito, grazie

    ps:
    ho trovato in altri siti questa risposta al problema:


    Direi che devi cambiare il valore di r, da 10 a 50. Sapendo che il valore di r è una funzione della posizione della pallina sull'asse x puoi risolvere con una semplice interpolazione lineare. In forma parametrica è:
    r = 10 + t * 50; con 0 < t < 1

    t lo ottieni computando il rapporto tra il valore attuale di x e il suo massimo.
    Se il raggio massimo di x è 50 e la larghezza del componente è getWidth() - 1 allora il valore massimo di x è getWidth() - metà del raggio - 1, cioè getWidth() - 26.
    Siccome x parte da 10 abbiamo:

    t = (x-10) / (getWidth()-36);

    Per x=10 t vale 0 ed r vale 10, per x = (getWidth() - 26) t vale 1 ed r vale 50.
    dove e come lo inserisco? perchè mettendolo come so (a caso ) dice di non trovare la variabile t..

    please help,

  2. #2
    nessuno sa dirmi che fare?


    so che risulto rompi balle (oltre che patetico) ma sarebbe anche più o meno indispensabile\necessario un aiuto

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: interpolazione forme?

    Originariamente inviato da T A F
    Scrivere un’applicazione o applet che crea un’animazione consistente in un cerchio che si muove in orizzontale da destra a sinistra e viceversa da un’estremità all’altra della finestra. Il cerchio deve cambiare gradualmente diametro (da 10 a 50 pixel) e colore (da giallo a rosso) mentre si sposta da destra a sinistra.

    come faccio a far cambiare le dimensioni del diametro del cerchio mentre si sposta?
    Beh, non l'hai precisato bene ma immagino che il diametro 10px sia quello ad un estremo prestabilito (es. sinistra) e il 50px sia all'estremo opposto.
    A quel punto in base alla larghezza del "contenitore" in cui si muove il cerchio, calcoli la dimensione in proporzione alla posizione sull'asse X.
    Ovviamente devi farlo in modo accurato, nel senso che i limiti per il "rimbalzo" sono diversi. Se a un estremo il diametro è 10px, il centro al massimo arriva a 5px dal bordo. All'altro estremo il diametro è 50px e il cerchio si ferma a larghezzaContenitore-25!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    si, ma come dicevo non capisco nulla
    e come ho scritto: il codice è in mio possesso, ma non perchè creato da me :master:

    quindi..

    cosa significa nella pratica, intendo.. proprio a livello di composizione, dove si inserisce? come?
    avevo trovato che il comando da dare era il seguente:

    r = 10 + t * 40;

    t = (x-10) / (getWidth()-36);

    ma come inserirlo?
    come dicevo mi chiede di settare la variabile "t", perchè non la trova.. come faccio?


    so che son ridicolo.. ma fidatevi che se potessi evitarmelo lo farei ^_^

    è per un esame

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.