    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.util.Random;
    006
    007    public class MathHelper
    008    {
    009        /**
    010         * A table of sin values computed from 0 (inclusive) to 2*pi (exclusive), with steps of 2*PI / 65536.
    011         */
    012        private static float[] SIN_TABLE = new float[65536];
    013
    014        /**
    015         * sin looked up in a table
    016         */
    017        public static final float sin(float par0)
    018        {
    019            return SIN_TABLE[(int)(par0 * 10430.378F) & 65535];
    020        }
    021
    022        /**
    023         * cos looked up in the sin table with the appropriate offset
    024         */
    025        public static final float cos(float par0)
    026        {
    027            return SIN_TABLE[(int)(par0 * 10430.378F + 16384.0F) & 65535];
    028        }
    029
    030        public static final float sqrt_float(float par0)
    031        {
    032            return (float)Math.sqrt((double)par0);
    033        }
    034
    035        public static final float sqrt_double(double par0)
    036        {
    037            return (float)Math.sqrt(par0);
    038        }
    039
    040        /**
    041         * Returns the greatest integer less than or equal to the float argument
    042         */
    043        public static int floor_float(float par0)
    044        {
    045            int var1 = (int)par0;
    046            return par0 < (float)var1 ? var1 - 1 : var1;
    047        }
    048
    049        @SideOnly(Side.CLIENT)
    050
    051        /**
    052         * returns par0 cast as an int, and no greater than Integer.MAX_VALUE-1024
    053         */
    054        public static int truncateDoubleToInt(double par0)
    055        {
    056            return (int)(par0 + 1024.0D) - 1024;
    057        }
    058
    059        /**
    060         * Returns the greatest integer less than or equal to the double argument
    061         */
    062        public static int floor_double(double par0)
    063        {
    064            int var2 = (int)par0;
    065            return par0 < (double)var2 ? var2 - 1 : var2;
    066        }
    067
    068        /**
    069         * Long version of floor_double
    070         */
    071        public static long floor_double_long(double par0)
    072        {
    073            long var2 = (long)par0;
    074            return par0 < (double)var2 ? var2 - 1L : var2;
    075        }
    076
    077        public static float abs(float par0)
    078        {
    079            return par0 >= 0.0F ? par0 : -par0;
    080        }
    081
    082        public static int abs_int(int par0)
    083        {
    084            return par0 >= 0 ? par0 : -par0;
    085        }
    086
    087        public static int ceiling_float_int(float par0)
    088        {
    089            int var1 = (int)par0;
    090            return par0 > (float)var1 ? var1 + 1 : var1;
    091        }
    092
    093        public static int ceiling_double_int(double par0)
    094        {
    095            int var2 = (int)par0;
    096            return par0 > (double)var2 ? var2 + 1 : var2;
    097        }
    098
    099        /**
    100         * Returns the value of the first parameter, clamped to be within the lower and upper limits given by the second and
    101         * third parameters.
    102         */
    103        public static int clamp_int(int par0, int par1, int par2)
    104        {
    105            return par0 < par1 ? par1 : (par0 > par2 ? par2 : par0);
    106        }
    107
    108        @SideOnly(Side.CLIENT)
    109
    110        /**
    111         * Returns the value of the first parameter, clamped to be within the lower and upper limits given by the second and
    112         * third parameters
    113         */
    114        public static float clamp_float(float par0, float par1, float par2)
    115        {
    116            return par0 < par1 ? par1 : (par0 > par2 ? par2 : par0);
    117        }
    118
    119        /**
    120         * Maximum of the absolute value of two numbers.
    121         */
    122        public static double abs_max(double par0, double par2)
    123        {
    124            if (par0 < 0.0D)
    125            {
    126                par0 = -par0;
    127            }
    128
    129            if (par2 < 0.0D)
    130            {
    131                par2 = -par2;
    132            }
    133
    134            return par0 > par2 ? par0 : par2;
    135        }
    136
    137        @SideOnly(Side.CLIENT)
    138
    139        /**
    140         * Buckets an integer with specifed bucket sizes.  Args: i, bucketSize
    141         */
    142        public static int bucketInt(int par0, int par1)
    143        {
    144            return par0 < 0 ? -((-par0 - 1) / par1) - 1 : par0 / par1;
    145        }
    146
    147        @SideOnly(Side.CLIENT)
    148
    149        /**
    150         * Tests if a string is null or of length zero
    151         */
    152        public static boolean stringNullOrLengthZero(String par0Str)
    153        {
    154            return par0Str == null || par0Str.length() == 0;
    155        }
    156
    157        public static int getRandomIntegerInRange(Random par0Random, int par1, int par2)
    158        {
    159            return par1 >= par2 ? par1 : par0Random.nextInt(par2 - par1 + 1) + par1;
    160        }
    161
    162        public static double average(long[] par0ArrayOfLong)
    163        {
    164            long var1 = 0L;
    165            long[] var3 = par0ArrayOfLong;
    166            int var4 = par0ArrayOfLong.length;
    167
    168            for (int var5 = 0; var5 < var4; ++var5)
    169            {
    170                long var6 = var3[var5];
    171                var1 += var6;
    172            }
    173
    174            return (double)var1 / (double)par0ArrayOfLong.length;
    175        }
    176
    177        /**
    178         * the angle is reduced to an angle between -180 and +180 by mod, and a 360 check
    179         */
    180        public static float wrapAngleTo180_float(float par0)
    181        {
    182            par0 %= 360.0F;
    183
    184            if (par0 >= 180.0F)
    185            {
    186                par0 -= 360.0F;
    187            }
    188
    189            if (par0 < -180.0F)
    190            {
    191                par0 += 360.0F;
    192            }
    193
    194            return par0;
    195        }
    196
    197        /**
    198         * the angle is reduced to an angle between -180 and +180 by mod, and a 360 check
    199         */
    200        public static double wrapAngleTo180_double(double par0)
    201        {
    202            par0 %= 360.0D;
    203
    204            if (par0 >= 180.0D)
    205            {
    206                par0 -= 360.0D;
    207            }
    208
    209            if (par0 < -180.0D)
    210            {
    211                par0 += 360.0D;
    212            }
    213
    214            return par0;
    215        }
    216
    217        static
    218        {
    219            for (int var0 = 0; var0 < 65536; ++var0)
    220            {
    221                SIN_TABLE[var0] = (float)Math.sin((double)var0 * Math.PI * 2.0D / 65536.0D);
    222            }
    223        }
    224    }