Java Swing模拟水波纹扩散效果动画
基于Java语言模拟水波纹运动效果,分为两种方法,一种采用简单的叠加计算
不使用sine函数模拟水波纹,好处是计算量小,另外一种采用sine函数来计算
水波纹扩展,计算量大,但是效果比较真实。
第一种简单的叠加效果水波模拟,是很多简单的2D游戏中会用的,关键是计
算水波的迁移,然后剩以能量衰减因子。Java实现的代码如下:
UI加水波计算的完全源代码如下:package com.gloomyfish.water.ripple.study;import java.awt.image.BufferedImage;import com.gloomyfish.filter.study.AbstractBufferedImageOp;public class WaterPixelRender extends AbstractBufferedImageOp {private int[][] waveData;private double rIndex = 2.0;private int counter = 0;public WaterPixelRender(){}public int[][] getWaveData() {return waveData;}public void setWaveData(int[][] waveData) {this.waveData = waveData;}@Overridepublic BufferedImage filter(BufferedImage src, BufferedImage dest) {counter++;int width = src.getWidth(); int height = src.getHeight(); if ( dest == null ) dest = createCompatibleDestImage( src, null ); int[] inPixels = new int[width*height]; int[] outPixels = new int[width*height]; getRGB( src, 0, 0, width, height, inPixels ); int index = 0; int nrow = 0, ncol = 0; for(int row=0; row<height-1; row++) { int ta = 0, tr = 0, tg = 0, tb = 0; for(int col=0; col<width-1; col++) { int xDiff = waveData[row+1][col] - waveData[row][col]; int yDiff = waveData[row][col+1] - waveData[row][col]; double xAngle = Math.atan(xDiff); double xRefraction = Math.asin( Math.sin( xAngle ) / rIndex ); double xDisplace = Math.tan( xRefraction ) * xDiff ; double yAngle = Math.atan( yDiff ); double yRefraction = Math.asin( Math.sin( yAngle ) / rIndex ); double yDisplace =Math.tan(yRefraction ) * yDiff; if(xDiff < 0) { if(yDiff < 0) { nrow = (int)(row - xDisplace); ncol = (int)(col - yDisplace); } else { nrow = (int)(row - xDisplace); ncol = (int)(col + yDisplace); } } else { if(yDiff < 0) { nrow = (int)(row + xDisplace); ncol = (int)(col - yDisplace); } else { nrow = (int)(row + xDisplace); ncol = (int)(col + yDisplace); } } if(nrow < 0 || nrow >= height) { nrow = 0; } if(ncol < 0 || ncol >= width) { ncol = 0; } index = nrow * width + ncol; ta = (inPixels[index] >> 24) & 0xff; tr = (inPixels[index] >> 16) & 0xff; tg = (inPixels[index] >> 8) & 0xff; tb = inPixels[index] & 0xff; index = row * width + col; outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb; } } setRGB( dest, 0, 0, width, height, outPixels ); return dest;}}复制代码以后替换图片路径即可运行,转载请注明出处