A game framework written with osu! in mind.
at master 101 lines 6.5 kB view raw
1// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence. 2// See the LICENCE file in the repository root for full licence text. 3 4using osuTK; 5using System; 6using osu.Framework.Graphics.Primitives; 7 8namespace osu.Framework.Utils 9{ 10 /// <summary> 11 /// Utility class to compare <see cref="float"/> or <see cref="double"/> values for equality. 12 /// </summary> 13 public static class Precision 14 { 15 /// <summary> 16 /// The default epsilon for all <see cref="float"/> values. 17 /// </summary> 18 public const float FLOAT_EPSILON = 1e-3f; 19 20 /// <summary> 21 /// The default epsilon for all <see cref="double"/> values. 22 /// </summary> 23 public const double DOUBLE_EPSILON = 1e-7; 24 25 /// <summary> 26 /// Computes whether a value is definitely greater than another given an acceptable difference. 27 /// </summary> 28 /// <param name="value1">The value to compare.</param> 29 /// <param name="value2">The value to compare against.</param> 30 /// <param name="acceptableDifference">The acceptable difference. Defaults to <see cref="FLOAT_EPSILON"/>.</param> 31 /// <returns>Whether <paramref name="value1"/> is definitely greater than <paramref name="value2"/>.</returns> 32 public static bool DefinitelyBigger(float value1, float value2, float acceptableDifference = FLOAT_EPSILON) => value1 - acceptableDifference > value2; 33 34 /// <summary> 35 /// Computes whether a value is definitely greater than another given an acceptable difference. 36 /// </summary> 37 /// <param name="value1">The value to compare.</param> 38 /// <param name="value2">The value to compare against.</param> 39 /// <param name="acceptableDifference">The acceptable difference. Defaults to <see cref="DOUBLE_EPSILON"/>.</param> 40 /// <returns>Whether <paramref name="value1"/> is definitely greater than <paramref name="value2"/>.</returns> 41 public static bool DefinitelyBigger(double value1, double value2, double acceptableDifference = DOUBLE_EPSILON) => value1 - acceptableDifference > value2; 42 43 /// <summary> 44 /// Computes whether a value is almost greater than another given an acceptable difference. 45 /// </summary> 46 /// <param name="value1">The value to compare.</param> 47 /// <param name="value2">The value to compare against.</param> 48 /// <param name="acceptableDifference">The acceptable difference. Defaults to <see cref="FLOAT_EPSILON"/>.</param> 49 /// <returns>Whether <paramref name="value1"/> is almost greater than <paramref name="value2"/>.</returns> 50 public static bool AlmostBigger(float value1, float value2, float acceptableDifference = FLOAT_EPSILON) => value1 > value2 - acceptableDifference; 51 52 /// <summary> 53 /// Computes whether a value is almost greater than another given an acceptable difference. 54 /// </summary> 55 /// <param name="value1">The value to compare.</param> 56 /// <param name="value2">The value to compare against.</param> 57 /// <param name="acceptableDifference">The acceptable difference. Defaults to <see cref="DOUBLE_EPSILON"/>.</param> 58 /// <returns>Whether <paramref name="value1"/> is almost greater than <paramref name="value2"/>.</returns> 59 public static bool AlmostBigger(double value1, double value2, double acceptableDifference = DOUBLE_EPSILON) => value1 > value2 - acceptableDifference; 60 61 /// <summary> 62 /// Computes whether two values are equal within an acceptable difference. 63 /// </summary> 64 /// <param name="value1">The first value.</param> 65 /// <param name="value2">The second value.</param> 66 /// <param name="acceptableDifference">The acceptable difference. Defaults to <see cref="FLOAT_EPSILON"/>.</param> 67 /// <returns>Whether <paramref name="value1"/> and <paramref name="value2"/> are almost equal.</returns> 68 public static bool AlmostEquals(float value1, float value2, float acceptableDifference = FLOAT_EPSILON) => Math.Abs(value1 - value2) <= acceptableDifference; 69 70 /// <summary> 71 /// Computes whether two <see cref="Vector2"/>s are equal within an acceptable difference. 72 /// </summary> 73 /// <param name="value1">The first <see cref="Vector2"/>.</param> 74 /// <param name="value2">The second <see cref="Vector2"/>.</param> 75 /// <param name="acceptableDifference">The acceptable difference. Defaults to <see cref="FLOAT_EPSILON"/>.</param> 76 /// <returns>Whether <paramref name="value1"/> and <paramref name="value2"/> are almost equal.</returns> 77 public static bool AlmostEquals(Vector2 value1, Vector2 value2, float acceptableDifference = FLOAT_EPSILON) => AlmostEquals(value1.X, value2.X, acceptableDifference) && AlmostEquals(value1.Y, value2.Y, acceptableDifference); 78 79 /// <summary> 80 /// Computes whether two values are equal within an acceptable difference. 81 /// </summary> 82 /// <param name="value1">The first value.</param> 83 /// <param name="value2">The second value.</param> 84 /// <param name="acceptableDifference">The acceptable difference. Defaults to <see cref="DOUBLE_EPSILON"/>.</param> 85 /// <returns>Whether <paramref name="value1"/> and <paramref name="value2"/> are almost equal.</returns> 86 public static bool AlmostEquals(double value1, double value2, double acceptableDifference = DOUBLE_EPSILON) => Math.Abs(value1 - value2) <= acceptableDifference; 87 88 /// <summary> 89 /// Computes whether two <see cref="RectangleF"/>s intersect within an acceptable difference. 90 /// </summary> 91 /// <param name="rect1">The first <see cref="RectangleF"/>.</param> 92 /// <param name="rect2">The second <see cref="RectangleF"/>.</param> 93 /// <param name="acceptableDifference">The acceptable difference. Defaults to <see cref="FLOAT_EPSILON"/>.</param> 94 /// <returns>Whether <paramref name="rect1"/> and <paramref name="rect2"/> intersect.</returns> 95 public static bool AlmostIntersects(RectangleF rect1, RectangleF rect2, float acceptableDifference = FLOAT_EPSILON) 96 => rect1.X <= rect2.X + rect2.Width + acceptableDifference 97 && rect2.X <= rect1.X + rect1.Width + acceptableDifference 98 && rect1.Y <= rect2.Y + rect2.Height + acceptableDifference 99 && rect2.Y <= rect1.Y + rect1.Height + acceptableDifference; 100 } 101}