📄 fastmath.java
字号:
/*
* Copyright (c) 2003-2009 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme.math;
import java.util.Random;
/**
* <code>FastMath</code> provides 'fast' math approximations and float equivalents of Math
* functions. These are all used as static values and functions.
*
* @author Various
* @version $Id: FastMath.java,v 1.45 2007/08/26 08:44:20 irrisor Exp $
*/
final public class FastMath {
private FastMath(){}
/** A "close to zero" double epsilon value for use*/
public static final double DBL_EPSILON = 2.220446049250313E-16d;
/** A "close to zero" float epsilon value for use*/
public static final float FLT_EPSILON = 1.1920928955078125E-7f;
/** A "close to zero" float epsilon value for use*/
public static final float ZERO_TOLERANCE = 0.0001f;
public static final float ONE_THIRD = 1f/3f;
/** The value PI as a float. (180 degrees) */
public static final float PI = (float)Math.PI;
/** The value 2PI as a float. (360 degrees) */
public static final float TWO_PI = 2.0f * PI;
/** The value PI/2 as a float. (90 degrees) */
public static final float HALF_PI = 0.5f * PI;
/** The value PI/4 as a float. (45 degrees) */
public static final float QUARTER_PI = 0.25f * PI;
/** The value 1/PI as a float. */
public static final float INV_PI = 1.0f / PI;
/** The value 1/(2PI) as a float. */
public static final float INV_TWO_PI = 1.0f / TWO_PI;
/** A value to multiply a degree value by, to convert it to radians. */
public static final float DEG_TO_RAD = PI / 180.0f;
/** A value to multiply a radian value by, to convert it to degrees. */
public static final float RAD_TO_DEG = 180.0f / PI;
/** A precreated random object for random numbers. */
public static final Random rand = new Random(System.currentTimeMillis());
/**
* Returns true if the number is a power of 2 (2,4,8,16...)
*
* A good implementation found on the Java boards. note: a number is a power
* of two if and only if it is the smallest number with that number of
* significant bits. Therefore, if you subtract 1, you know that the new
* number will have fewer bits, so ANDing the original number with anything
* less than it will give 0.
*
* @param number
* The number to test.
* @return True if it is a power of two.
*/
public static boolean isPowerOfTwo(int number) {
return (number > 0) && (number & (number - 1)) == 0;
}
public static int nearestPowerOfTwo(int number) {
return (int)Math.pow(2, Math.ceil(Math.log(number) / Math.log(2)));
}
/**
* Linear interpolation from startValue to endValue by the given percent.
* Basically: ((1 - percent) * startValue) + (percent * endValue)
*
* @param percent
* Percent value to use.
* @param startValue
* Begining value. 0% of f
* @param endValue
* ending value. 100% of f
* @return The interpolated value between startValue and endValue.
*/
public static float LERP(float percent, float startValue, float endValue) {
if (startValue == endValue) return startValue;
return ((1 - percent) * startValue) + (percent * endValue);
}
/**
* Returns the arc cosine of an angle given in radians.<br>
* Special cases:
* <ul><li>If fValue is smaller than -1, then the result is PI.
* <li>If the argument is greater than 1, then the result is 0.</ul>
* @param fValue The angle, in radians.
* @return fValue's acos
* @see java.lang.Math#acos(double)
*/
public static float acos(float fValue) {
if (-1.0f < fValue) {
if (fValue < 1.0f)
return (float) Math.acos(fValue);
return 0.0f;
}
return PI;
}
/**
* Returns the arc sine of an angle given in radians.<br>
* Special cases:
* <ul><li>If fValue is smaller than -1, then the result is -HALF_PI.
* <li>If the argument is greater than 1, then the result is HALF_PI.</ul>
* @param fValue The angle, in radians.
* @return fValue's asin
* @see java.lang.Math#asin(double)
*/
public static float asin(float fValue) {
if (-1.0f < fValue) {
if (fValue < 1.0f)
return (float) Math.asin(fValue);
return HALF_PI;
}
return -HALF_PI;
}
/**
* Returns the arc tangent of an angle given in radians.<br>
* @param fValue The angle, in radians.
* @return fValue's asin
* @see java.lang.Math#atan(double)
*/
public static float atan(float fValue) {
return (float) Math.atan(fValue);
}
/**
* A direct call to Math.atan2.
* @param fY
* @param fX
* @return Math.atan2(fY,fX)
* @see java.lang.Math#atan2(double, double)
*/
public static float atan2(float fY, float fX) {
return (float) Math.atan2(fY, fX);
}
/**
* Rounds a fValue up. A call to Math.ceil
* @param fValue The value.
* @return The fValue rounded up
* @see java.lang.Math#ceil(double)
*/
public static float ceil(float fValue) {
return (float) Math.ceil(fValue);
}
/**
* Fast Trig functions for x86. This forces the trig functiosn to stay
* within the safe area on the x86 processor (-45 degrees to +45 degrees)
* The results may be very slightly off from what the Math and StrictMath
* trig functions give due to rounding in the angle reduction but it will be
* very very close.
*
* note: code from wiki posting on java.net by jeffpk
*/
public static float reduceSinAngle(float radians) {
radians %= TWO_PI; // put us in -2PI to +2PI space
if (Math.abs(radians) > PI) { // put us in -PI to +PI space
radians = radians - (TWO_PI);
}
if (Math.abs(radians) > HALF_PI) {// put us in -PI/2 to +PI/2 space
radians = PI - radians;
}
return radians;
}
/**
* Returns sine of a value.
*
* note: code from wiki posting on java.net by jeffpk
*
* @param fValue
* The value to sine, in radians.
* @return The sine of fValue.
* @see java.lang.Math#sin(double)
*/
public static float sin(float fValue) {
fValue = reduceSinAngle(fValue); // limits angle to between -PI/2 and +PI/2
if (Math.abs(fValue)<=Math.PI/4){
return (float)Math.sin(fValue);
}
return (float)Math.cos(Math.PI/2-fValue);
}
/**
* Returns cos of a value.
*
* @param fValue
* The value to cosine, in radians.
* @return The cosine of fValue.
* @see java.lang.Math#cos(double)
*/
public static float cos(float fValue) {
return sin(fValue+HALF_PI);
}
/**
* Returns E^fValue
* @param fValue Value to raise to a power.
* @return The value E^fValue
* @see java.lang.Math#exp(double)
*/
public static float exp(float fValue) {
return (float) Math.exp(fValue);
}
/**
* Returns Absolute value of a float.
* @param fValue The value to abs.
* @return The abs of the value.
* @see java.lang.Math#abs(float)
*/
public static float abs(float fValue) {
if (fValue < 0) return -fValue;
return fValue;
}
/**
* Returns a number rounded down.
* @param fValue The value to round
* @return The given number rounded down
* @see java.lang.Math#floor(double)
*/
public static float floor(float fValue) {
return (float) Math.floor(fValue);
}
/**
* Returns 1/sqrt(fValue)
* @param fValue The value to process.
* @return 1/sqrt(fValue)
* @see java.lang.Math#sqrt(double)
*/
public static float invSqrt(float fValue) {
return (float) (1.0f / Math.sqrt(fValue));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -