A game framework written with osu! in mind.
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}