001/*
002 * PlotSquared, a land and world management plugin for Minecraft.
003 * Copyright (C) IntellectualSites <https://intellectualsites.com>
004 * Copyright (C) IntellectualSites team and contributors
005 *
006 * This program is free software: you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation, either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * This program is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
018 */
019package com.plotsquared.core.util;
020
021public class MathMan {
022
023    private static final int ATAN2_BITS = 7;
024    private static final int ATAN2_BITS2 = ATAN2_BITS << 1;
025    private static final int ATAN2_MASK = ~(-1 << ATAN2_BITS2);
026    private static final int ATAN2_COUNT = ATAN2_MASK + 1;
027    private static final int ATAN2_DIM = (int) Math.sqrt(ATAN2_COUNT);
028    private static final float INV_ATAN2_DIM_MINUS_1 = 1.0f / (ATAN2_DIM - 1);
029    private static final float[] atan2 = new float[ATAN2_COUNT];
030    private static final int[] table =
031            {0, 16, 22, 27, 32, 35, 39, 42, 45, 48, 50, 53, 55, 57, 59, 61, 64, 65, 67, 69, 71, 73, 75,
032                    76, 78, 80, 81, 83, 84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104,
033                    106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
034                    124, 125, 126, 128, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
035                    141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155,
036                    155, 156, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168,
037                    169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178, 179, 180, 181,
038                    181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 189, 189, 190, 191, 192, 192,
039                    193, 193, 194, 195, 195, 196, 197, 197, 198, 199, 199, 200, 201, 201, 202, 203, 203,
040                    204, 204, 205, 206, 206, 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 214,
041                    214, 215, 215, 216, 217, 217, 218, 218, 219, 219, 220, 221, 221, 222, 222, 223, 224,
042                    224, 225, 225, 226, 226, 227, 227, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
043                    234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 240, 240, 241, 241, 242, 242,
044                    243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251,
045                    251, 252, 252, 253, 253, 254, 254, 255};
046
047    static {
048        for (int i = 0; i < ATAN2_DIM; i++) {
049            for (int j = 0; j < ATAN2_DIM; j++) {
050                float x0 = (float) i / ATAN2_DIM;
051                float y0 = (float) j / ATAN2_DIM;
052
053                atan2[(j * ATAN2_DIM) + i] = (float) Math.atan2(y0, x0);
054            }
055        }
056    }
057
058    public static final int gcd(int a, int b) {
059        if (b == 0) {
060            return a;
061        }
062        return gcd(b, a % b);
063    }
064
065    public static final int gcd(int[] a) {
066        int result = a[0];
067        for (int i = 1; i < a.length; i++) {
068            result = gcd(result, a[i]);
069        }
070        return result;
071    }
072
073    public static double getMean(int[] array) {
074        double count = 0;
075        for (int i : array) {
076            count += i;
077        }
078        return count / array.length;
079    }
080
081    public static int pair(short x, short y) {
082        return (x << 16) | (y & 0xFFFF);
083    }
084
085    public static final int average(int a, int b) {
086        return (a & b) + (a ^ b) / 2;
087    }
088
089    public static int roundInt(double value) {
090        return (int) (value < 0 ? (value == (int) value) ? value : value - 1 : value);
091    }
092
093    public static int getPositiveId(int i) {
094        if (i < 0) {
095            return (-i * 2) - 1;
096        }
097        return i * 2;
098    }
099
100    public static boolean isInteger(String str) {
101        if (str == null) {
102            return false;
103        }
104        int length = str.length();
105        if (length == 0) {
106            return false;
107        }
108        int i = 0;
109        if (str.charAt(0) == '-') {
110            if (length == 1) {
111                return false;
112            }
113            i = 1;
114        }
115        for (; i < length; i++) {
116            char c = str.charAt(i);
117            if ((c <= '/') || (c >= ':')) {
118                return false;
119            }
120        }
121        return true;
122    }
123
124    public static double getSD(int[] array, double av) {
125        double sd = 0;
126        for (int element : array) {
127            sd += Math.pow(Math.abs(element - av), 2);
128        }
129        return Math.sqrt(sd / array.length);
130    }
131
132}