最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實現(xiàn)水波紋擴散效果

 更新時間:2019年01月30日 09:13:34   作者:gloomyfish  
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)水波紋擴散效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、原理

模擬水波紋效果,最常見的是sine或者cosn的函數(shù),周期性變化,貼近自然。

當(dāng)水波紋中中間開始向四周擴散的時候,一般都是慢慢的失去能量,振幅也是越來越小,所以程序要模擬這個過程時候,要加上一個能量遞減因子。然后用公式 y = a*sine(bx + c)來表示波紋公式。

二、程序?qū)崿F(xiàn)

最重要的一步是計算水波紋的振幅。在任意一點確定水波的中心位置,可以是鼠標(biāo)隨機選取,對半徑范圍內(nèi)的像素位置實現(xiàn)水波生成,然后轉(zhuǎn)換為位置,對位置實現(xiàn)浮點數(shù)取整,然后使用適當(dāng)?shù)牟逯邓惴ǎ纠褂秒p線性插值。

三、程序效果

四、濾鏡完全源代碼

這次我寫了些中文注解,不給源代碼的博文不是好博文

package com.gloomyfish.filter.study;
 
import java.awt.image.BufferedImage;
 
public class WaterFilter extends AbstractBufferedImageOp {
 private float wavelength = 16;
 private float amplitude = 10;
 private float phase = 0;
 private float centreX = 0.5f;
 private float centreY = 0.5f;
 private float radius = 50;
 
 private float radius2 = 0;
 private float icentreX;
 private float icentreY;
 
 public WaterFilter() {
 
 }
 
 @Override
 public BufferedImage filter(BufferedImage src, BufferedImage dest) {
 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 );
 icentreX = width * centreX;
 icentreY = height * centreY;
 if ( radius == 0 )
 radius = Math.min(icentreX, icentreY);
 radius2 = radius*radius;
  int index = 0;
  float[] out = new float[2];
  for(int row=0; row<height; row++) {
   for(int col=0; col<width; col++) {
   index = row * width + col;
   
   // 獲取水波的擴散位置,最重要的一步
   generateWaterRipples(col, row, out);
 int srcX = (int)Math.floor( out[0] );
 int srcY = (int)Math.floor( out[1] );
 float xWeight = out[0]-srcX;
 float yWeight = out[1]-srcY;
 int nw, ne, sw, se;
 
 // 獲取周圍四個像素,插值用,
 if ( srcX >= 0 && srcX < width-1 && srcY >= 0 && srcY < height-1) {
  // Easy case, all corners are in the image
  int i = width*srcY + srcX;
  nw = inPixels[i];
  ne = inPixels[i+1];
  sw = inPixels[i+width];
  se = inPixels[i+width+1];
 } else {
  // Some of the corners are off the image
  nw = getPixel( inPixels, srcX, srcY, width, height );
  ne = getPixel( inPixels, srcX+1, srcY, width, height );
  sw = getPixel( inPixels, srcX, srcY+1, width, height );
  se = getPixel( inPixels, srcX+1, srcY+1, width, height );
 }
 
 // 取得對應(yīng)的振幅位置P(x, y)的像素,使用雙線性插值
 /*if(xWeight >=0 || yWeight >= 0)
 {
  outPixels[index] = ImageMath.bilinearInterpolate(xWeight, yWeight, nw, ne, sw, se);  
 }
 else 
 {
  outPixels[index] = inPixels[index];
 }*/
 outPixels[index] = ImageMath.bilinearInterpolate(xWeight, yWeight, nw, ne, sw, se);
   }
  }
 
  setRGB( dest, 0, 0, width, height, outPixels );
  return dest;
 }
 
 private int getPixel(int[] pixels, int x, int y, int width, int height) {
 if (x < 0 || x >= width || y < 0 || y >= height) {
 return 0; // 有點暴力啦,懶得管啦
 }
 return pixels[ y*width+x ];
 }
 
 protected void generateWaterRipples(int x, int y, float[] out) {
 float dx = x-icentreX;
 float dy = y-icentreY;
 float distance2 = dx*dx + dy*dy;
 // 確定 water ripple的半徑,如果在半徑之外,就直接獲取原來位置,不用計算遷移量
 if (distance2 > radius2) { 
 out[0] = x;
 out[1] = y;
 } else {
 // 如果在radius半徑之內(nèi),計算出來
 float distance = (float)Math.sqrt(distance2);
 // 計算改點振幅
 float amount = amplitude * (float)Math.sin(distance / wavelength * ImageMath.TWO_PI - phase);
 // 計算能量損失, 
 amount *= (radius-distance)/radius; // 計算能量損失,
 if ( distance != 0 )
 amount *= wavelength/distance;
 // 得到water ripple 最終遷移位置
 out[0] = x + dx*amount;
 out[1] = y + dy*amount;
 }
 }
 
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于swagger測試List類型參數(shù)過程詳解

    基于swagger測試List類型參數(shù)過程詳解

    這篇文章主要介紹了基于swagger測試List類型參數(shù)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • Spring Boot 整合 Druid 并開啟監(jiān)控的操作方法

    Spring Boot 整合 Druid 并開啟監(jiān)控的操作方法

    本文介紹了如何在SpringBoot項目中引入和配置Druid數(shù)據(jù)庫連接池,并開啟其監(jiān)控功能,通過添加依賴、配置數(shù)據(jù)源、開啟監(jiān)控、自定義配置以及訪問監(jiān)控頁面,開發(fā)者可以有效提高數(shù)據(jù)庫訪問效率并監(jiān)控連接池狀態(tài),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Java編程cas操作全面解析

    Java編程cas操作全面解析

    這篇文章通過實例,解析了Java編程中cas操作的概念、原理以及用法,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • 如何通過??低曉O(shè)備網(wǎng)絡(luò)SDK進行Java二次開發(fā)攝像頭車牌識別詳解

    如何通過海康威視設(shè)備網(wǎng)絡(luò)SDK進行Java二次開發(fā)攝像頭車牌識別詳解

    這篇文章主要介紹了如何通過??低曉O(shè)備網(wǎng)絡(luò)SDK進行Java二次開發(fā)攝像頭車牌識別的相關(guān)資料,描述了如何使用??低曉O(shè)備網(wǎng)絡(luò)SDK進行車牌識別和圖片抓拍的開發(fā)流程,包括遇到的問題及其解決辦法,需要的朋友可以參考下
    2025-02-02
  • Java移除無效括號的方法實現(xiàn)

    Java移除無效括號的方法實現(xiàn)

    本文主要介紹了Java移除無效括號的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SpringBoot Admin2.0 集成Arthas的實現(xiàn)步驟

    SpringBoot Admin2.0 集成Arthas的實現(xiàn)步驟

    這篇文章主要介紹了SpringBoot Admin2.0 集成Arthas的實現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下
    2021-04-04
  • Java對zip,rar,7z文件帶密碼解壓實例詳解

    Java對zip,rar,7z文件帶密碼解壓實例詳解

    在日常業(yè)務(wù)中,會遇到一些瑣碎文件需要打包到一個壓縮包中上傳,業(yè)務(wù)方在后臺接收到壓縮包后自行解壓,然后解析相應(yīng)文件。而且可能涉及安全保密,因此會在壓縮時帶上密碼,要求后臺業(yè)務(wù)可以指定密碼進行解壓。本文將用Java解決這一問題,需要的可以參考一下
    2022-07-07
  • 一小時迅速入門Mybatis之初識篇

    一小時迅速入門Mybatis之初識篇

    這篇文章主要介紹了迅速入門Mybatis之初識篇,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • BaseDao封裝JavaWeb的增刪改查的實現(xiàn)代碼

    BaseDao封裝JavaWeb的增刪改查的實現(xiàn)代碼

    Basedao 是一種基于數(shù)據(jù)訪問對象(Data Access Object)模式的設(shè)計方法,它是一個用于處理數(shù)據(jù)庫操作的基礎(chǔ)類,負(fù)責(zé)封裝數(shù)據(jù)庫訪問的底層操作,提供通用的數(shù)據(jù)庫訪問方法,本文給大家介紹了BaseDao封裝JavaWeb的增刪改查的實現(xiàn)代碼,需要的朋友可以參考下
    2024-03-03
  • java中Map和List初始化的N種方法總結(jié)

    java中Map和List初始化的N種方法總結(jié)

    這篇文章主要介紹了java中Map和List初始化的N種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論

阳曲县| 沾益县| 大名县| 旌德县| 红河县| 东源县| 开平市| 开平市| 海兴县| 腾冲县| 临武县| 平湖市| 中超| 潜江市| 普宁市| 平和县| 平和县| 信阳市| 龙泉市| 高要市| 元阳县| 民乐县| 木兰县| 绩溪县| 隆尧县| 广德县| 伊金霍洛旗| 澎湖县| 温州市| 清河县| 望谟县| 兰州市| 泸西县| 鸡西市| 玛纳斯县| 荥阳市| 拉萨市| 叙永县| 常山县| 舒兰市| 合阳县|