com.hazelcast.shaded.org.locationtech.jts.math.MathUtil Maven / Gradle / Ivy
/*
* Copyright (c) 2016 Martin Davis.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* and Eclipse Distribution License v. 1.0 which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v20.html
* and the Eclipse Distribution License is available at
*
* http://www.eclipse.org/org/documents/edl-v10.php.
*/
package com.hazelcast.shaded.org.locationtech.jts.math;
/**
* Various utility functions for mathematical and numerical operations.
*
* @author mbdavis
*
*/
public class MathUtil
{
/**
* Clamps a double value to a given range.
* @param x the value to clamp
* @param min the minimum value of the range
* @param max the maximum value of the range
* @return the clamped value
*/
public static double clamp(double x, double min, double max)
{
if (x < min) return min;
if (x > max) return max;
return x;
}
/**
* Clamps an int value to a given range.
* @param x the value to clamp
* @param min the minimum value of the range
* @param max the maximum value of the range
* @return the clamped value
*/
public static int clamp(int x, int min, int max)
{
if (x < min) return min;
if (x > max) return max;
return x;
}
/**
* Clamps an integer to a given maximum limit.
*
* @param x the value to clamp
* @param max the maximum value
* @return the clamped value
*/
public static int clampMax(int x, int max)
{
if (x > max) return max;
return x;
}
/**
* Computes the ceiling function of the dividend of two integers.
*
* @param num the numerator
* @param denom the denominator
* @return the ceiling of num / denom
*/
public static int ceil(int num, int denom) {
int div = num / denom;
return div * denom >= num ? div : div + 1;
}
private static final double LOG_10 = Math.log(10);
/**
* Computes the base-10 logarithm of a double value.
*
* - If the argument is NaN or less than zero, then the result is NaN.
*
- If the argument is positive infinity, then the result is positive infinity.
*
- If the argument is positive zero or negative zero, then the result is negative infinity.
*
*
* @param x a positive number
* @return the value log a, the base-10 logarithm of the input value
*/
public static double log10(double x)
{
double ln = Math.log(x);
if (Double.isInfinite(ln)) return ln;
if (Double.isNaN(ln)) return ln;
return ln / LOG_10;
}
/**
* Computes an index which wraps around a given maximum value.
* For values >= 0, this is equals to val % max.
* For values < 0, this is equal to max - (-val) % max
*
* @param index the value to wrap
* @param max the maximum value (or modulus)
* @return the wrapped index
*/
public static int wrap(int index, int max)
{
if (index < 0) {
return max - ((-index) % max);
}
return index % max;
}
/**
* Computes the average of two numbers.
*
* @param x1 a number
* @param x2 a number
* @return the average of the inputs
*/
public static double average(double x1, double x2)
{
return (x1 + x2) / 2.0;
}
public static double max(double v1, double v2, double v3)
{
double max = v1;
if (v2 > max) max = v2;
if (v3 > max) max = v3;
return max;
}
public static double max(double v1, double v2, double v3, double v4)
{
double max = v1;
if (v2 > max) max = v2;
if (v3 > max) max = v3;
if (v4 > max) max = v4;
return max;
}
public static double min(double v1, double v2, double v3, double v4)
{
double min = v1;
if (v2 < min) min = v2;
if (v3 < min) min = v3;
if (v4 < min) min = v4;
return min;
}
/**
* The inverse of the Golden Ratio phi.
*/
public static final double PHI_INV = (Math.sqrt(5) - 1.0) / 2.0;
/**
* Generates a quasi-random sequence of numbers in the range [0,1].
* They are produced by an additive recurrence with 1/φ as the constant.
* This produces a low-discrepancy sequence which is more evenly
* distribute than random numbers.
*
* See Wikipedia: Low-discrepancy Sequences - Additive Recurrence.
*
* The sequence is initialized by calling it
* with any positive fractional number; 0 works well for most uses.
*
* @param curr the current number in the sequence
* @return the next value in the sequence
*/
public static double quasirandom( double curr) {
return quasirandom(curr, PHI_INV);
}
/**
* Generates a quasi-random sequence of numbers in the range [0,1].
* They are produced by an additive recurrence with constant α.
*
* R(α) : tn = { t0 + nα }, n = 1,2,3,...
*
* When α is irrational this produces a
* Low discrepancy sequence
* which is more evenly
* distributed than random numbers.
*
* The sequence is initialized by calling it
* with any positive fractional number. 0 works well for most uses.
*
* @param curr the current number in the sequence
* @param alpha the sequence additive constant
* @return the next value in the sequence
*/
public static double quasirandom( double curr, double alpha) {
double next = curr + alpha;
if (next < 1) return next;
return next - Math.floor(next);
}
}