| Precedente | Altri Applet | Successivo |
A differenza di tutti gli applet precedenti, lissajous 2 è animato: anche in assenza di movimenti del mouse
l'immagine cambia.
In generale si può usare questa tecnica per illustrare modelli che possiedano un movimento
intrinseco (pendoli, ingranaggi, ecc.).
|
|
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: lissajous2.java |
|---|
import java.applet.Applet;
import java.awt.*;
public class lissajous2 extends Applet implements Runnable {
int posx=0,posy=0;
double startAng = 0.0;
Thread clock;
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 = 1+0.15*(double)(posx-w/2)/(double)w;
double k2 = 1+0.15*(double)(posy-h/2)/(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 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);
}
public void init() {
posx = size().width/2;
posy = size().height/2;
}
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 |