/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.core.api.gui.util; import java.awt.geom.Point2D; /** * The Class MathUtil. * * @author Nicolas Roduit */ public class MathUtil { public static final double DOUBLE_EPSILON = 1e-6; public static final double FLOAT_EPSILON = 1e-5; private MathUtil() { } public static boolean isEqualToZero(float val) { return Math.copySign(val, 1.0) < FLOAT_EPSILON; } public static boolean isDifferentFromZero(float val) { return Math.copySign(val, 1.0) > FLOAT_EPSILON; } public static boolean isEqual(float a, float b) { // Math.copySign is similar to Math.abs(x), but with different NaN semantics return Math.copySign(a - b, 1.0) <= FLOAT_EPSILON || (a == b) // infinities equal themselves || (Float.isNaN(a) && Float.isNaN(b)); } public static boolean isDifferent(float a, float b) { // Math.copySign is similar to Math.abs(x), but with different NaN semantics return Math.copySign(a - b, 1.0) >= FLOAT_EPSILON; } public static boolean isEqualToZero(double val) { return Math.copySign(val, 1.0) < DOUBLE_EPSILON; } public static boolean isDifferentFromZero(double val) { return Math.copySign(val, 1.0) > DOUBLE_EPSILON; } public static boolean isEqual(double a, double b) { // Math.copySign is imilar to Math.abs(x), but with different NaN semantics return Math.copySign(a - b, 1.0) <= DOUBLE_EPSILON || (a == b) // infinities equal themselves || (Double.isNaN(a) && Double.isNaN(b)); } public static boolean isDifferent(double a, double b) { // Math.copySign is similar to Math.abs(x), but with different NaN semantics return Math.copySign(a - b, 1.0) >= DOUBLE_EPSILON; } public static double computeDistanceFloat(double x1, double y1, double x2, double y2) { return Point2D.distance(x1, y1, x2, y2); } public static double getOrientation(Point2D p1, Point2D p2) { return (p1 != null && p2 != null) ? getOrientation(p1.getX(), p1.getY(), p2.getX(), p2.getY()) : null; } public static double getOrientation(double x1, double y1, double x2, double y2) { // Use arctan2 to handle to handle possible negative values double teta = Math.atan2(y1 - y2, x1 - x2); double angle = Math.toDegrees(teta); // convert from radians to degrees // Return the orientation from 0 to 180 degrees if (angle < 0) { angle = -angle; } else { angle = 180 - angle; } return angle; } public static double getAzimuth(Point2D p1, Point2D p2) { return (p1 != null && p2 != null) ? getAzimuth(p1.getX(), p1.getY(), p2.getX(), p2.getY()) : null; } public static double getAzimuth(double x1, double y1, double x2, double y2) { double angle = Math.toDegrees(Math.atan2(y2 - y1, x2 - x1)); angle = (angle + 450.0) % 360.0; return angle; } public static float checkMin0(float val) { return (val < 0.0f) ? 0.0f : val; } public static float checkMax(float val, float max) { return (val > max) ? max : val; } public static float checkMinMax(float val, float min, float max) { float res = val; if (res < min) { res = min; } if (res > max) { res = max; } return res; } public static int checkMinMax(int val, int min, int max) { int res = val; if (res < min) { res = min; } if (res > max) { res = max; } return res; } }