JavaFX实现水波效果

上传人:ba****u6 文档编号:174119768 上传时间:2022-12-14 格式:DOCX 页数:12 大小:66.23KB
收藏 版权申诉 举报 下载
JavaFX实现水波效果_第1页
第1页 / 共12页
JavaFX实现水波效果_第2页
第2页 / 共12页
JavaFX实现水波效果_第3页
第3页 / 共12页
资源描述:

《JavaFX实现水波效果》由会员分享,可在线阅读,更多相关《JavaFX实现水波效果(12页珍藏版)》请在装配图网上搜索。

1、JavaFX实现水波效果public class JfxRipper extends Application private final double MAX_WIDTH = 400.0;private final double MAX_HEIGHT = 400.0;private static AnimationTimer timer;private static AnimationTimer rainTimer;private FileChooser fc;private double scaleRate;stonePower;private int maxRainSize, maxRai

2、nPower, stoneSize,private int imgWidth, imgHeight;int arrWaveCurrent;/ 当前帧各点波动能量数据int arrWaveNext;/ 下一帧各点波动能量数据private Image img;private WritableImage imgRipper;private ImageView imgView;Overridepublic void init() throws Exception fc = new FileChooser();/添加文件类型过滤 fc.getExtensionFilters().add(new Fil

3、eChooser.Ex tension Filt er(图片文件, *.jpg;*.png;*.jpeg;*.bmp);img = newImage(getClass().getClassLoader().getResourceAsStream(images/红花.jpg);imgWidth = (int) img.getWidth();imgHeight = (int) img.getHeight();/波纹效果计算需要遍历图片每个像素,图片尺寸过大会导致运行速度极慢,故 按比例缩小if (imgWidth MAX_WIDTH | imgHeight MAX_HEIGHT) double s

4、x = MAX_WIDTH / imgWidth;double sy = MAX_HEIGHT / imgHeight;scaleRate = sx sy ? sy : sx;img = scaleImg(img, imgWidth, imgHeight, scaleRate);imgWidth = (int) (scaleRate * (double) imgWidth);imgHeight = (int) (scaleRate * (double) imgHeight);maxRainSize = 4;maxRainPower = 60;stoneSize = 5;stonePower =

5、 128; else /雨点和石子大小根据图片尺寸的大小稍作调整maxRainSize = 3;maxRainPower = 50;stoneSize = 4;stonePower = 108; imgRipper = new WritableImage(imgWidth, imgHeight); arrWaveCurrent = new intimgWidth * imgHeight; arrWaveNext = new intimgWidth * imgHeight;imgView = new ImageView(); imgView.setOnMousePressed(new Event

6、Handler() Overridepublic void handle(Event event) MouseEvent e = (MouseEvent) event;dropStone(int) e.getX(), (int) e.getY(), stoneSize, stonePower); );timer = new AnimationTimer() Overridepublic void handle(long now) genRipper();imgView.setImage(imgRipper);rainTimer = new AnimationTimer() Overridepu

7、blic void handle(long now) rain();imgView.setImage(imgRipper);/* 模拟下雨,随机抛出不同大小和位置的石子*/protected void rain() int x = (int) (Math.random() * imgWidth);int y = (int) (Math.random() * imgHeight);int rainSize = (int) (Math.random() * maxRainSize);int power = (int) (Math.random() * maxRainPower) + maxRain

8、Power; dropStone(x, y, rainSize, power);Overridepublic void start(Stage primaryStage) throws Exception Group root = new Group();VBox vb = new VBox(10); root.getChildren().add(vb);imgView.setImage(img);Scene scene = new Scene(root); primaryStage.setScene(scene);HBox hb = new HBox(10);Button rainCo nt

9、 rol = new Button(停止下雨); rainControl.setOnAction(ActionEvent event) - if (开始下雨.equals(rainCo nt rol.ge tTex t() rainTimer.start();rainCon trol.se tTex t(停止下雨); else rainTimer.stop();rainCo nt rol.se tTex t(开始下雨););Button changePic = new Butt on(“ 更换图片); changePic.setOnAction(ActionEvent event) - Fil

10、e f = fc.showOpenDialog(primaryStage); if (null != f) /将默认目录设置为上次访问过的目录fc.setInitialDirectory(f.getParentFile(); /Image imgTmp = null;try img = new Image(new FileInputStream(f);/Desktop.getDesktop().open(f); catch (Exception e) e.printStackTrace();if (img != null) imgWidth = (int) img.getWidth();img

11、Height = (int) img.getHeight();if (imgWidth MAX_WIDTH | imgHeight MAX_HEIGHT) double sx = MAX_WIDTH / imgWidth;double sy = MAX_HEIGHT / imgHeight;scaleRate = sx sy ? sy : sx;img = scaleImg(img, imgWidth, imgHeight, scaleRate); imgWidth = (int) (scaleRate * (double) imgWidth); imgHeight = (int) (scal

12、eRate * (double) imgHeight); maxRainSize = 4;maxRainPower = 60; stoneSize = 5;stonePower = 128; else maxRainSize = 3;maxRainPower = 50; stoneSize = 4;stonePower = 108;imgRipper = new WritableImage(imgWidth, imgHeight); arrWaveCurrent = new intimgWidth * imgHeight; arrWaveNext = new intimgWidth * img

13、Height; imgView.setFitHeight(imgHeight); imgView.setFitWidth(imgWidth); primaryStage.setWidth(imgWidth); imgView.setImage(img);primaryStage.setHeight(imgHeight + 40););Button exit 二 new Button(退出);exit.setOnAction(ActionEvent event) - primaryStage.close(););hb.getChildren().addAll(rainControl, chang

14、ePic, exit); vb.getChildren().addAll(imgView, hb); primaryStage.setWidth(imgWidth); hb.setAlignment(Pos.CENTER); scene.setFill(Color.BLUEVIOLET); primaryStage.initStyle(StageStyle.TRANSPARENT); timer.start();rainTimer.start();primaryStage.show();/*水波算法,原作者Imagic*/public void genRipper() PixelReader

15、readImg = img.getPixelReader();PixelWriter writeRipper = imgRipper.getPixelWriter(); int index = imgWidth;int indexPreX = index - 1;int indexNextX = index + 1;int indexPreY = index - imgWidth;int indexNextY = index + imgWidth;for (int y = 1; y imgHeight - 1; y+) for (int x = 1; x 1) - arrWaveNextind

16、ex; /波能衰减 1/32arrWaveNextindex -= arrWaveNextindex 5; /计算出偏移象素和原始象素的内存地址偏移量 : int xoffset = x2 - x1;int yoffset = x4 - x3;int offset = imgWidth * yoffset + xoffset;int posY = index / imgWidth;int posX = index - posY * imgWidth;int newY = (index + offset) / imgWidth;int newX = (index + offset) - newY

17、 * imgWidth;/ 判断坐标是否在窗口范围内if (index + offset 0 & index + offset imgWidth * imgHeight) writeRipper.setColor(posX, posY, readImg.getColor(newX, newY); else writeRipper.setColor(posX, posY, readImg.getColor(posX, posY);/ 交换波能数据缓冲区int temp = arrWaveCurrent;arrWaveCurrent = arrWaveNext;arrWaveNext = temp

18、;/* 模拟向水中投石子* param x:石子位置X坐标* param y:石子位置y坐标* param sto neSize:石子半径* param power:波能大小*/private void dropStone(int x, int y, int stoneSize, int power) int minPosX = x - stoneSize, maxPosX = x + stoneSize;int minPosY = y - stoneSize, maxPosY = y + stoneSize;minPosX = minPosX 0 ? 0 : minPosX;minPosY

19、= minPosY imgWidth ? imgWidth : maxPosX;maxPosY = maxPosY imgHeight ? imgHeight : maxPosY;int value = stoneSize * stoneSize;for (int posx = minPosX; posx maxPosX; posx+) for (int posy = minPosY; posy maxPosY; posy+) if (posx - x) * (posx - x) + (posy - y) * (posy - y) value) arrWaveCurrentposy * img

20、Width + posx = -power;/* 按比例缩小图片引,*缩小图片算法:xO = x / sx, y0 = y / sy。xO,yO分别为原图水平和垂直索* sx,sy分别为水平和垂直缩小比例* param src:原始图片* param imgW:原始图片宽度* param imgH:原始图片长度* param ra te:缩小后的图片不原图片尺寸的比例* return 缩小后的图片*/ private Image scaleImg(Image src, int imgW, int imgH, double rate) int width = (int) (double) img

21、W * rate);int height = (int) (double) imgH * rate);WritableImage imgScaled = new WritableImage(width, height);PixelReader readSrc = src.getPixelReader();PixelWriter writeDest = imgScaled.getPixelWriter();for (int x = 0; x width; x+) for (int y = 0; y height; y+) writeDest.setColor(x, y,readSrc.getCo

22、lor(int) (x / rate), (int) (y / rate);return imgScaled;public static void main(String args) launch(args); 里面用到了行序优先一维数组存储二维数组时两个数组索引之间的算术关系公 式。设一维数组索引为index,二维数组行索引为x,列索引为y,均从0开始,每行 存储元素个数为width,则:y = int (index / width),int 为取整函数,如 int (1.1)和 int (1.9)都等于 1 x= index - y * widthindex = width * y + x截图:号上卜口

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!