1*970e1046SAndroid Build Coastguard Worker /* 2*970e1046SAndroid Build Coastguard Worker * Copyright 2021 Google LLC 3*970e1046SAndroid Build Coastguard Worker * 4*970e1046SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*970e1046SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*970e1046SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*970e1046SAndroid Build Coastguard Worker * 8*970e1046SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*970e1046SAndroid Build Coastguard Worker * 10*970e1046SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*970e1046SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*970e1046SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*970e1046SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*970e1046SAndroid Build Coastguard Worker * limitations under the License. 15*970e1046SAndroid Build Coastguard Worker */ 16*970e1046SAndroid Build Coastguard Worker 17*970e1046SAndroid Build Coastguard Worker // This file is automatically generated. Do not modify it. 18*970e1046SAndroid Build Coastguard Worker 19*970e1046SAndroid Build Coastguard Worker package com.google.ux.material.libmonet.utils; 20*970e1046SAndroid Build Coastguard Worker 21*970e1046SAndroid Build Coastguard Worker /** Utility methods for mathematical operations. */ 22*970e1046SAndroid Build Coastguard Worker public class MathUtils { MathUtils()23*970e1046SAndroid Build Coastguard Worker private MathUtils() {} 24*970e1046SAndroid Build Coastguard Worker 25*970e1046SAndroid Build Coastguard Worker /** 26*970e1046SAndroid Build Coastguard Worker * The signum function. 27*970e1046SAndroid Build Coastguard Worker * 28*970e1046SAndroid Build Coastguard Worker * @return 1 if num > 0, -1 if num < 0, and 0 if num = 0 29*970e1046SAndroid Build Coastguard Worker */ signum(double num)30*970e1046SAndroid Build Coastguard Worker public static int signum(double num) { 31*970e1046SAndroid Build Coastguard Worker if (num < 0) { 32*970e1046SAndroid Build Coastguard Worker return -1; 33*970e1046SAndroid Build Coastguard Worker } else if (num == 0) { 34*970e1046SAndroid Build Coastguard Worker return 0; 35*970e1046SAndroid Build Coastguard Worker } else { 36*970e1046SAndroid Build Coastguard Worker return 1; 37*970e1046SAndroid Build Coastguard Worker } 38*970e1046SAndroid Build Coastguard Worker } 39*970e1046SAndroid Build Coastguard Worker 40*970e1046SAndroid Build Coastguard Worker /** 41*970e1046SAndroid Build Coastguard Worker * The linear interpolation function. 42*970e1046SAndroid Build Coastguard Worker * 43*970e1046SAndroid Build Coastguard Worker * @return start if amount = 0 and stop if amount = 1 44*970e1046SAndroid Build Coastguard Worker */ lerp(double start, double stop, double amount)45*970e1046SAndroid Build Coastguard Worker public static double lerp(double start, double stop, double amount) { 46*970e1046SAndroid Build Coastguard Worker return (1.0 - amount) * start + amount * stop; 47*970e1046SAndroid Build Coastguard Worker } 48*970e1046SAndroid Build Coastguard Worker 49*970e1046SAndroid Build Coastguard Worker /** 50*970e1046SAndroid Build Coastguard Worker * Clamps an integer between two integers. 51*970e1046SAndroid Build Coastguard Worker * 52*970e1046SAndroid Build Coastguard Worker * @return input when min <= input <= max, and either min or max otherwise. 53*970e1046SAndroid Build Coastguard Worker */ clampInt(int min, int max, int input)54*970e1046SAndroid Build Coastguard Worker public static int clampInt(int min, int max, int input) { 55*970e1046SAndroid Build Coastguard Worker if (input < min) { 56*970e1046SAndroid Build Coastguard Worker return min; 57*970e1046SAndroid Build Coastguard Worker } else if (input > max) { 58*970e1046SAndroid Build Coastguard Worker return max; 59*970e1046SAndroid Build Coastguard Worker } 60*970e1046SAndroid Build Coastguard Worker 61*970e1046SAndroid Build Coastguard Worker return input; 62*970e1046SAndroid Build Coastguard Worker } 63*970e1046SAndroid Build Coastguard Worker 64*970e1046SAndroid Build Coastguard Worker /** 65*970e1046SAndroid Build Coastguard Worker * Clamps an integer between two floating-point numbers. 66*970e1046SAndroid Build Coastguard Worker * 67*970e1046SAndroid Build Coastguard Worker * @return input when min <= input <= max, and either min or max otherwise. 68*970e1046SAndroid Build Coastguard Worker */ clampDouble(double min, double max, double input)69*970e1046SAndroid Build Coastguard Worker public static double clampDouble(double min, double max, double input) { 70*970e1046SAndroid Build Coastguard Worker if (input < min) { 71*970e1046SAndroid Build Coastguard Worker return min; 72*970e1046SAndroid Build Coastguard Worker } else if (input > max) { 73*970e1046SAndroid Build Coastguard Worker return max; 74*970e1046SAndroid Build Coastguard Worker } 75*970e1046SAndroid Build Coastguard Worker 76*970e1046SAndroid Build Coastguard Worker return input; 77*970e1046SAndroid Build Coastguard Worker } 78*970e1046SAndroid Build Coastguard Worker 79*970e1046SAndroid Build Coastguard Worker /** 80*970e1046SAndroid Build Coastguard Worker * Sanitizes a degree measure as an integer. 81*970e1046SAndroid Build Coastguard Worker * 82*970e1046SAndroid Build Coastguard Worker * @return a degree measure between 0 (inclusive) and 360 (exclusive). 83*970e1046SAndroid Build Coastguard Worker */ sanitizeDegreesInt(int degrees)84*970e1046SAndroid Build Coastguard Worker public static int sanitizeDegreesInt(int degrees) { 85*970e1046SAndroid Build Coastguard Worker degrees = degrees % 360; 86*970e1046SAndroid Build Coastguard Worker if (degrees < 0) { 87*970e1046SAndroid Build Coastguard Worker degrees = degrees + 360; 88*970e1046SAndroid Build Coastguard Worker } 89*970e1046SAndroid Build Coastguard Worker return degrees; 90*970e1046SAndroid Build Coastguard Worker } 91*970e1046SAndroid Build Coastguard Worker 92*970e1046SAndroid Build Coastguard Worker /** 93*970e1046SAndroid Build Coastguard Worker * Sanitizes a degree measure as a floating-point number. 94*970e1046SAndroid Build Coastguard Worker * 95*970e1046SAndroid Build Coastguard Worker * @return a degree measure between 0.0 (inclusive) and 360.0 (exclusive). 96*970e1046SAndroid Build Coastguard Worker */ sanitizeDegreesDouble(double degrees)97*970e1046SAndroid Build Coastguard Worker public static double sanitizeDegreesDouble(double degrees) { 98*970e1046SAndroid Build Coastguard Worker degrees = degrees % 360.0; 99*970e1046SAndroid Build Coastguard Worker if (degrees < 0) { 100*970e1046SAndroid Build Coastguard Worker degrees = degrees + 360.0; 101*970e1046SAndroid Build Coastguard Worker } 102*970e1046SAndroid Build Coastguard Worker return degrees; 103*970e1046SAndroid Build Coastguard Worker } 104*970e1046SAndroid Build Coastguard Worker 105*970e1046SAndroid Build Coastguard Worker /** 106*970e1046SAndroid Build Coastguard Worker * Sign of direction change needed to travel from one angle to another. 107*970e1046SAndroid Build Coastguard Worker * 108*970e1046SAndroid Build Coastguard Worker * <p>For angles that are 180 degrees apart from each other, both directions have the same travel 109*970e1046SAndroid Build Coastguard Worker * distance, so either direction is shortest. The value 1.0 is returned in this case. 110*970e1046SAndroid Build Coastguard Worker * 111*970e1046SAndroid Build Coastguard Worker * @param from The angle travel starts from, in degrees. 112*970e1046SAndroid Build Coastguard Worker * @param to The angle travel ends at, in degrees. 113*970e1046SAndroid Build Coastguard Worker * @return -1 if decreasing from leads to the shortest travel distance, 1 if increasing from leads 114*970e1046SAndroid Build Coastguard Worker * to the shortest travel distance. 115*970e1046SAndroid Build Coastguard Worker */ rotationDirection(double from, double to)116*970e1046SAndroid Build Coastguard Worker public static double rotationDirection(double from, double to) { 117*970e1046SAndroid Build Coastguard Worker double increasingDifference = sanitizeDegreesDouble(to - from); 118*970e1046SAndroid Build Coastguard Worker return increasingDifference <= 180.0 ? 1.0 : -1.0; 119*970e1046SAndroid Build Coastguard Worker } 120*970e1046SAndroid Build Coastguard Worker 121*970e1046SAndroid Build Coastguard Worker /** Distance of two points on a circle, represented using degrees. */ differenceDegrees(double a, double b)122*970e1046SAndroid Build Coastguard Worker public static double differenceDegrees(double a, double b) { 123*970e1046SAndroid Build Coastguard Worker return 180.0 - Math.abs(Math.abs(a - b) - 180.0); 124*970e1046SAndroid Build Coastguard Worker } 125*970e1046SAndroid Build Coastguard Worker 126*970e1046SAndroid Build Coastguard Worker /** Multiplies a 1x3 row vector with a 3x3 matrix. */ matrixMultiply(double[] row, double[][] matrix)127*970e1046SAndroid Build Coastguard Worker public static double[] matrixMultiply(double[] row, double[][] matrix) { 128*970e1046SAndroid Build Coastguard Worker double a = row[0] * matrix[0][0] + row[1] * matrix[0][1] + row[2] * matrix[0][2]; 129*970e1046SAndroid Build Coastguard Worker double b = row[0] * matrix[1][0] + row[1] * matrix[1][1] + row[2] * matrix[1][2]; 130*970e1046SAndroid Build Coastguard Worker double c = row[0] * matrix[2][0] + row[1] * matrix[2][1] + row[2] * matrix[2][2]; 131*970e1046SAndroid Build Coastguard Worker return new double[] {a, b, c}; 132*970e1046SAndroid Build Coastguard Worker } 133*970e1046SAndroid Build Coastguard Worker } 134*970e1046SAndroid Build Coastguard Worker 135