/* * HaoRan ImageFilter Classes v0.4 * Copyright (C) 2012 Zhenjun Dai * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation. */ package com.marshalchen.common.uimodule.ImageFilter.Textures; import com.marshalchen.common.uimodule.ImageFilter.*; public class WoodTexture implements ITextureGenerator { // Perlin noise function used for texture generation private PerlinNoise noise = new PerlinNoise( 1.0 / 32, 0.05, 0.5, 8 ); private int r; // rings amount private double rings = 12; /// <summary> /// Initializes a new instance of the <see cref="WoodTexture"/> class /// </summary> /// public WoodTexture( ) { Reset( ); } /// <summary> /// Initializes a new instance of the <see cref="WoodTexture"/> class /// </summary> /// /// <param name="rings">Rings amount</param> /// public WoodTexture( double rings ) { this.rings = Math.max( 3, rings ); Reset( ); } /// <summary> /// Generate texture /// </summary> /// /// <param name="width">Texture's width</param> /// <param name="height">Texture's height</param> /// /// <returns>Two dimensional array of intensities</returns> /// /// <remarks>Generates new texture with specified dimension.</remarks> /// public float[][] Generate( int width, int height ) { float[][] texture = new float[height][width]; int w2 = width / 2; int h2 = height / 2; for ( int y = 0; y < height; y++ ) { for ( int x = 0; x < width; x++ ) { double xv = (double) ( x - w2 ) / width; double yv = (double) ( y - h2 ) / height; texture[y][x] = Math.min( 1.0f, (float) Math.abs( Math.sin( ( Math.sqrt( xv * xv + yv * yv ) + noise.Function2D( x + r, y + r ) ) * Math.PI * 2 * rings ) ) ); } } return texture; } /// <summary> /// Reset generator /// </summary> /// /// <remarks>Regenerates internal random numbers.</remarks> /// public void Reset( ) { r = NoiseFilter.getRandomInt(1, 5000 ); } }