MathHelper.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System;
  2. namespace HandyControl.Expression.Drawing;
  3. internal static class MathHelper
  4. {
  5. internal const double DBL_EPSILON = 2.2204460492503131e-016;
  6. public static bool AreClose(double value1, double value2) =>
  7. // ReSharper disable once CompareOfFloatsByEqualityOperator
  8. value1 == value2 || IsVerySmall(value1 - value2);
  9. public static double Lerp(double x, double y, double alpha) => x * (1.0 - alpha) + y * alpha;
  10. public static bool IsVerySmall(double value) => Math.Abs(value) < 1E-06;
  11. public static bool IsZero(double value) => Math.Abs(value) < 10.0 * DBL_EPSILON;
  12. public static bool IsFiniteDouble(double x) => !double.IsInfinity(x) && !double.IsNaN(x);
  13. public static double DoubleFromMantissaAndExponent(double x, int exp) => x * Math.Pow(2.0, exp);
  14. public static bool GreaterThan(double value1, double value2) => value1 > value2 && !AreClose(value1, value2);
  15. public static bool GreaterThanOrClose(double value1, double value2)
  16. {
  17. if (value1 <= value2)
  18. {
  19. return AreClose(value1, value2);
  20. }
  21. return true;
  22. }
  23. public static double Hypotenuse(double x, double y) => Math.Sqrt(x * x + y * y);
  24. public static bool LessThan(double value1, double value2) => value1 < value2 && !AreClose(value1, value2);
  25. public static bool LessThanOrClose(double value1, double value2)
  26. {
  27. if (value1 >= value2)
  28. {
  29. return AreClose(value1, value2);
  30. }
  31. return true;
  32. }
  33. public static double EnsureRange(double value, double? min, double? max)
  34. {
  35. if (min.HasValue && value < min.Value)
  36. {
  37. return min.Value;
  38. }
  39. if (max.HasValue && value > max.Value)
  40. {
  41. return max.Value;
  42. }
  43. return value;
  44. }
  45. public static double SafeDivide(double lhs, double rhs, double fallback)
  46. {
  47. if (!IsVerySmall(rhs))
  48. {
  49. return lhs / rhs;
  50. }
  51. return fallback;
  52. }
  53. }