Useful.monkey2 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. Namespace useful
  2. Const degToRad :Double = Pi / 180.0
  3. Const radToDeg :Double = 180.0 / Pi
  4. Const one :Double = 1.0 'This is just to ensure 1.0 is a double, not float
  5. '*********************** Math functions ***********************
  6. Function DeltaMultiply:Double( value:Double, multiplier:Double, delta:Double )
  7. Local attenuation := ( one - ( ( one - multiplier ) * delta ) )
  8. Return( value * attenuation )
  9. End
  10. Function DeltaMultiply:Vec2<Double>( vec:Vec2<Double>, multiplier:Double, delta:Double )
  11. Local attenuation := ( one - ( ( one - multiplier ) * delta ) )
  12. Return( vec * attenuation )
  13. End
  14. Function Smooth:Double( source:Double, target:Double, rate:Double = 5.0, delta:Double = 1.0 )
  15. If rate <= 1.0 Then Return target
  16. Return source + ( (source - target) / (-rate / delta) )
  17. End
  18. ' Function Lerp:Double( source:Double, target:Double, rate:Double = 2.0, delta:Double = 1.0 )
  19. ' End
  20. Function Quantize:Double( number:Double, size:Double )
  21. If size Then Return Round( number / size ) * size
  22. Return number
  23. End
  24. Function QuantizeDown:Double( number:Double, size:Double ) 'Snaps to nearest lower value multiple of size
  25. If size Then Return Floor( number / size ) * size
  26. Return number
  27. End
  28. Function QuantizeUp:Double( number:Double, size:Double ) 'Snaps to nearest upper value multiple of size
  29. If size Then Return Ceil( number / size ) * size
  30. Return number
  31. End
  32. 'Function AngleBetween:Double(x1:Double, y1:Double, x2:Double, y2:Double)
  33. ' Return ATan2((x2 - x1), (y2 - y1))' * radToDeg
  34. 'End
  35. Function AngleBetween:Double(x1:Double, y1:Double, x2:Double, y2:Double)
  36. Return ATan2((y2 - y1), (x2 - x1)) * radToDeg
  37. End
  38. Function RadToDeg:Double ( rad:Double )
  39. Return rad * radToDeg '( 180.0 / Pi )
  40. End
  41. Function DegToRad:Double( deg:Double )
  42. Return deg * degToRad '( Pi / 180.0 )
  43. End
  44. Function NearestPow:Int( number:Int )
  45. Return Pow( 2, Ceil( Log( number )/Log( 2 ) ) )
  46. End
  47. Function Truncate:String( number:Double, decimals:Int = 1 )
  48. Local arr:String[] = String(number).Split(".")
  49. If arr.Length > 1
  50. Return arr[0] + "." + arr[1].Left( decimals )
  51. Else
  52. Return arr[0]
  53. End
  54. End
  55. Function Truncate:String( vec:Vec2<Float>, decimals:Int = 1 )
  56. Return Truncate( vec.X, decimals ) + ", " + Truncate( vec.Y, decimals )
  57. End
  58. Function Truncate:String( vec:Vec3<Float>, decimals:Int = 1 )
  59. Return Truncate( vec.X, decimals ) + ", " + Truncate( vec.Y, decimals ) + ", " + Truncate( vec.Z, decimals )
  60. End
  61. '*********************** Array functions ***********************
  62. Function ArrayContains<T>:Bool( arr:T[], value:T )
  63. For local n := 0 Until arr.Length
  64. If arr[ n ] = value Then Return True
  65. End
  66. Return False
  67. End