/* アニメーション実験 Ver 0.10 */ /* */ /* */ /* by Atsushi 2005/8/20 */ package animation.animator; import java.awt.*; import java.awt.image.*; public class WaveAnimator extends Object { /* --- Field --- */ private Image baseImage; private MemoryImageSource imageSource; private int waveLength,amplitude; private double phase; private int pixels[]; private int basePixels[]; private Dimension size; /* --- Constructor --- */ public WaveAnimator(Image baseImage) { this.baseImage=baseImage; waveLength=0; amplitude =0; phase =0.0; pixels=null; } /* --- 画像生成 --- */ private void initFrame() { PixelGrabber grabber; size=new Dimension(baseImage.getWidth(null), baseImage.getHeight(null)); pixels =new int[size.width*size.height]; basePixels=new int[size.width*size.height]; grabber=new PixelGrabber(baseImage,0,0,size.width,size.height, basePixels,0,size.width); try { grabber.grabPixels(); } catch (InterruptedException e) {} } private void createFrame() { double rr,d; int xx,yy,cx,cy; if (pixels==null) initFrame(); cx=size.width /2; cy=size.height/2; for (int y=0;y<=size.height-1;y++) { for (int x=0;x<=size.width-1;x++) { rr=Math.sqrt((x-cx)*(x-cx)+(y-cy)*(y-cy)); d=Math.sin(phase+2.0*Math.PI*rr/waveLength)*amplitude; if (d==0.0) { xx=x; yy=y; } else { xx=(int)((x-cx)*Math.max(0,rr+d)/rr)+size.width /2; yy=(int)((y-cy)*Math.max(0,rr+d)/rr)+size.height/2; } if (0<=xx && xx<=size.width -1 && 0<=yy && yy<=size.height-1) { pixels[x+y*size.width]=basePixels[xx+yy*size.width]; } else { pixels[x+y*size.width]=0; } } } if (imageSource!=null) { imageSource.newPixels(0,0,size.width,size.height); } } /* --- ImageProducer --- */ public ImageProducer getImageProducer() { if (imageSource==null) { createFrame(); imageSource=new MemoryImageSource(size.width,size.height, pixels,0,size.width); imageSource.setAnimated(true); } return imageSource; } /* --- アニメーション --- */ public void nextFrame(int waveLength,int amplitude,double phase) { this.waveLength=waveLength; this.amplitude =amplitude; this.phase =phase; createFrame(); } }