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}