| Precedente | Altri Applet | Successivo |
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).
|
|
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;
}
}
|
| Precedente | Altri Applet | Successivo |