From Gossip@caterpillar

Computer Graphics: ·Ï¤õ

 

 


²É¤l¨t²Îªº°ò¥»·§©À«Ü²³æ¡A¥u­n¨Ï¥ÎÃþ§O©Îµ²ºc¨Ó¥]¸Ë²É¤lªº°Ê§@¾Þ§@»Pª¬ºA§Y¥i¡AµM¦Ó¨ä§xÃø³B¦b©ó¡A¦p¦óÀÀ¯uªº¼ÒÀÀ¥X²É¤lªº°Ê§@¡A³o´N»Pª«²z¡B¤Æ¾Ç¦³©ÒÃöÁp¤F¡AµM¦Ó¦³®É­Ô¬O¥i¥H¥Î¤@¨Ç¤p§Þ­Ç¨Ó²¤Æ¯u¹ê¥@¬É¤¤ªº²É¤l°Ê§@¡A¦Ó¦b¿Ã¹õ¤W¤S¦³¬Û·íªº®ÄªG¡C

·Ï¤õ²É¤l¥i¥H¦p¤U¥]¸Ë¡G
public class FireworkParticle {
    private boolean state;  // ²É¤l¬O§_¦s¬¡
    private Point position;  // ²É¤lªº¦ì¸m
    private double vx, vy;   // ²É¤lªº³t«×
    private int life;       // ²É¤lªº¥Í©R­È
    private Color currentcolor; // ²É¤lªºÃC¦â
    private int time;  // ²É¤l¦s¬¡¦Ü¤µªº®É¶¡
 
    public void resume() {} // ±Ò©l²É¤l
 
    public boolean getState() {} // ¨ú±o²É¤l¦s¬¡ª¬ºA
 
    public Point getPoint() {}  // ¨ú±o¦ì¤l¦ì¸m
 
    public Color getColor() {}  // ¨ú±o²É¤lÃC¦â
 
    public void nextState() {}  // §ïÅܦܤU¤@ª¬ºA
}
 
Javaª«¥ó¾É¦Vªº¯S©Ê¯S§O¾A¦X¥Î¨Ó¥]¸Ë²É¤l¨t²Î¡A±N©Ò¦³»P²É¤l¦³Ãöªº¾Þ§@¤]¤@¨Ö¥]¸Ë¶i¥h¡F¦pªG¬OVB©ÎC¡A´N¨Ï¥Îµ²ºc¨Ó¥]¸Ë²É¤lªºÄݩʡC

¦b¼ÒÀÀªº³¡¥÷¡A­º¥ý¬OÃz¬µªº®É­Ô¡A²É¤l©Ò±o¨ìªº¤ô¥­»P««ª½³t«×¡A¥i¥H¿í¦u°Ê¶q¦uùÚ¨Ó­pºâ¥X¨C¤@­Ó²É¤l©ÒÀò±oªº³t«×¡A¦ý³oÃä¹ê»Ú¤W¨Ã¨S¦³³o»ò§@¡A²³æªº¨Ï¥Î ¶Ã¼Æ¨Ó¼ÒÀÀ¤]¥i¥H¹F¨ì¤£¿ùªº®ÄªG¡F·Ï¤õ²É¤l¦b¤U¸¨ªº®É­Ô¡A¬O¨ü­«¤Oªº¼vÅT¡Avy = vt + 9.8 * t¡F¦Ó²É¤lªºÃC¦â³¡¥÷¡Aªì©l®É¨Ï¥Î¶Ã¼Æ¨Ó¨M©wRGB­È¡A¦Ó¦b²É¤l¥Í©R¶i¤J­Ë¼Æ®É¡A§ïÅܬ°¬õ¦â¡A³Ì«á¦A§ïÅܬ°ÂŦâ¡A¥H°t¦X©]ªÅªºÃC¦â¡AÅý²É¤l¦³¿U¿N¬pºÉªº·P ı¡C

¦b²¾°Êªº¤è­±¡A¥Ñ©ó¿Ã¹õ¤j¤p¦³­­¡A©Ò¥HÅý¤@­Ó¹³¯À¥Nªí¹ê»Ú²¾°Ê¤@¤½¤Ø¡A¥H§K²É¤l¦]­«¤O¥[³t«×ªº¼vÅT¡A¤@¤U¤l´N¶]¥X¿Ã¹õ¥~¤F¡C

¤j³¡¥÷ªº¼ÒÀÀ¬O¦p¦¹¡A¨ä¥¦ªº½Ð¦Û¤v¬Ý¬Ý ¹ê¨Ò¡A¥Ø«eÁÙ¨S¦³¥[¤W·Ïªº®ÄªG¡C

  • Firework.java
package onlyfun.caterpillar.graphics.particle;

import java.applet.*;
import java.awt.*;
import javax.swing.JApplet;

public class Firework extends JApplet implements Runnable {
private final int Max = 200;
private FireworkParticle particles[]; // ·Ï¤õ²É¤l
private int appletWidth, appletHeight, xCenter,yCenter;
private Image offScreen;
private Graphics drawOffScreen;

public void init() {
setBackground(Color.black); // ­I´º¬°¶Â¦â

particles = new FireworkParticle[Max]; // «Ø¥ß²É¤l

// ¨ú±oÅã¹³°Ï°ì
appletWidth = getSize().width;
appletHeight = getSize().height;

// ·Ï¤õªì©l¦ì¸m
xCenter = appletWidth/2 +
(int)(Math.random()* 150 - 150);
yCenter = appletHeight/2 +
(int)(Math.random()* 150 - 150);
for(int i = 0; i < Max; i++)
particles[i] = new FireworkParticle();

// «Ø¥ß¦¸µe­±
offScreen = createImage(appletWidth, appletHeight);
drawOffScreen = offScreen.getGraphics();
}

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

public void update(Graphics g) {
paint(g);
}

public void paint(Graphics g) {
g.drawImage(offScreen, 0, 0, this);
}

public void run() {
Color color;
boolean replay;

while(true) {
replay = true;
drawOffScreen.clearRect(0,0,
appletWidth, appletHeight);

for(int i = 0; i < Max; i++) {
if(particles[i].getState()) {
color = particles[i].getColor();
double x =
particles[i].getPoint().getX();
double y =
particles[i].getPoint().getY();
drawOffScreen.setColor(color);
drawOffScreen.fillOval(
(int)x, (int)y, 1, 1);
particles[i].nextState();
}
}

for(int i = 0; i < Max; i++) {
if(particles[i].getState()) {
replay = false;
break;
}
}

// ¬O§_­«·s¬I©ñ
if(replay) {
// ·Ï¤õªì©l¦ì¸m
xCenter = appletWidth/2 +
(int)(Math.random()* 150 - 150);
yCenter = appletHeight/2 +
(int)(Math.random()* 150 - 150);

for(int i = 0; i < Max; i++) {
particles[i].resume(new Point(xCenter,
yCenter), Max);
particles[i].setLife(
(int) (Math.random()*20));
}
}

// ­«Ã¸µe­±
repaint();

// ¼È°±°õ¦æºü 150 ²@¬í
try {
Thread.sleep(150);
}
catch (InterruptedException e) { }
}
}
}

class FireworkParticle {
private boolean state; // ²É¤l¬O§_¦s¬¡
private Point position; // ²É¤lªº¦ì¸m
private double vx, vy; // ²É¤lªº³t«×
private int life; // ²É¤lªº¥Í©R­È
private Color currentcolor; // ²É¤lªºÃC¦â
private int time; // ²É¤l¦s¬¡¦Ü¤µªº®É¶¡

public void resume(Point p, int random) {
position = p;
state = true;
vx = Math.random()*random - Math.random()*random;
vy = Math.random()*random - Math.random()*random;
currentcolor =
new Color((int)(Math.random()*255),
(int)(Math.random()*255),
(int)(Math.random()*255));
time = 0;
}

public void setLife(int life) {
this.life = life;
}

public boolean getState() {
return state;
}

public Point getPoint() {
return position;
}

public Color getColor() {
return currentcolor;
}

public void nextState() {
vy += 9.8*time;
position.setLocation(position.getX() +
vx * 0.1, position.getY() + vy * 0.1);
life--;
time++;

if(life < 0) {
life = 0;
state = false;
}
else if(life < 2) {
currentcolor = new Color(0, 0, 255);
}
else if(life < 5){
currentcolor = new Color(255, 0, 0);
}
}
}