PrecedenteAltri AppletSuccessivo



Figure di Lissajous - 3

L'applet precedente presenta un difetto noto come "sfarfallio" o "flickering": durante l'animazione l'immagine viene continuamente cancellata e ridisegnata e l'occhio riesce a percepire l'istante di schermo bianco che separa due disegni successivi.

Questo applet risolve il problema utilizzando un "doppio buffer". Questa tecnica puo' essere utilizzata con vantaggio in tutti i casi in cui si presenti il flickering (ad esempio in simple 4; mentre è già utilizzata in titolo).

Questo browser non e' abilitato
a visualizzare applet

Istruzioni:

Facendo click&drag con il mouse sulla figura si possono modificare i periodi delle due oscillazioni.
In particolare:
Il movimento orizzontale modifica il periodo dell'oscillazione sull'asse X.
Il movimento verticale modifica il periodo dell'oscillazione sull'asse Y.


Il puntino blu serve per "invogliare" il "lettore" a intervenire con il mouse.

Anche in assenza di interazioni questo applet si aggiorna continuamente modificando la fase delle due oscillazioni.


Codice sorgente: lissajous3.java
import java.applet.Applet;
import java.awt.*;


public class lissajous3 extends Applet implements Runnable {
    int posx=0,posy=0;
    double startAng = 0.0;
    Thread clock;

    Image backBuffer = null;
    Graphics backGC;
    Dimension backSize;


    public void drawCurve(Graphics g) {
      double ang0=0, ang1=Math.PI*2*3.5; // estremi
      int i, n=500;
      int w = size().width;             // dimensioni dell'applet
      int h = size().height;
      double k1 = (double)posx/(double)w;
      double k2 = (double)posy/(double)h;
      int x0=0,y0=0,x1=0,y1=0;
      for(i=0;i<n;i++)
          {
           double ang = startAng + ang0+(ang1-ang0)*i/(double)(n-1);
           x1 = (int)(w * (Math.sin(ang*k1)+1.0)*0.5);
           y1 = (int)(h * (Math.sin(ang*k2)+1.0)*0.5);
           if(i>0) g.drawLine(x0,y0,x1,y1);
           x0 = x1;
           y0 = y1;
          }
    }      

    public void update(Graphics g) {
        if (backBuffer == null)
	  {
           g.clearRect(0, 0, size().width, size().height);
           paint(g);
          }
        else 
          {
           Dimension d = size();
           if (d.width != backSize.width || 
               d.height != backSize.height) {
  	      backBuffer = createImage(size().width, size().height);
	      backGC = backBuffer.getGraphics();
	      backSize = size();
           }
 	   backGC.setColor(getBackground());
	   backGC.fillRect(0,0,size().width,size().height);
	   paint(backGC);
	   g.drawImage(backBuffer, 0, 0, this);
          } 
       }
 
    public void paint(Graphics g) {
      g.setColor(Color.black);
      drawCurve(g);
      int lx=4,ly=4;
      g.setColor(Color.blue);
      g.fillOval(posx-lx/2,posy-ly/2,lx,ly);
      g.setColor(Color.black);
      g.drawOval(posx-lx/2,posy-ly/2,lx,ly);
      g.setColor(Color.white);
    }
    public void init() { 
      backBuffer = createImage(size().width, size().height);
      backGC = backBuffer.getGraphics();
      backSize = size();
      posx = size().width;
      posy = size().height;
    }
    public boolean mouseDown(Event evt, int x, int y) {
      posx=x;
      posy=y;
      repaint();
      return true;
    }
    public boolean mouseDrag(Event evt, int x, int y) {
      posx=x;
      posy=y;
      repaint();
      return true;
    }

    public void run() {
      while(true) {
        startAng += 0.6;
        repaint();
        try {Thread.sleep(100); }
        catch (InterruptedException e) { break;}
      }
    }

    public void start() {
        clock = new Thread(this);        
	clock.start();
    }

    public void stop() {        
        clock.stop();
        clock = null;
    }


}

  





PrecedenteAltri AppletSuccessivo


Gian Marco Todesco