NumericsUtils.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Numerics;
  4. using System.Text;
  5. namespace SharpGLTF
  6. {
  7. public static class VectorsUtils
  8. {
  9. public static bool IsFinite(this float value)
  10. {
  11. return !float.IsNaN(value) && !float.IsInfinity(value);
  12. }
  13. public static Single NextSingle(this Random rnd)
  14. {
  15. return (Single)rnd.NextDouble();
  16. }
  17. public static Vector2 NextVector2(this Random rnd)
  18. {
  19. return new Vector2(rnd.NextSingle(), rnd.NextSingle());
  20. }
  21. public static Vector3 NextVector3(this Random rnd)
  22. {
  23. return new Vector3(rnd.NextSingle(), rnd.NextSingle(), rnd.NextSingle());
  24. }
  25. public static Vector4 NextVector4(this Random rnd)
  26. {
  27. return new Vector4(rnd.NextSingle(), rnd.NextSingle(), rnd.NextSingle(), rnd.NextSingle());
  28. }
  29. public static Quaternion NextQuaternion(this Random rnd)
  30. {
  31. var r = rnd.NextVector3() * (float)Math.PI*2;
  32. return Quaternion.CreateFromYawPitchRoll(r.X, r.Y, r.Z);
  33. }
  34. public static float GetAngle(this (Quaternion a, Quaternion b) pair)
  35. {
  36. var w = Quaternion.Concatenate(pair.b, Quaternion.Inverse(pair.a)).W;
  37. if (w < -1) w = -1;
  38. if (w > 1) w = 1;
  39. return (float)Math.Acos(w) * 2;
  40. }
  41. public static float GetAngle(this (Vector3 a, Vector3 b) pair)
  42. {
  43. var a = Vector3.Normalize(pair.a);
  44. var b = Vector3.Normalize(pair.b);
  45. var c = Vector3.Dot(a, b);
  46. if (c > 1) c = 1;
  47. if (c < -1) c = -1;
  48. return (float)Math.Acos(c);
  49. }
  50. public static float GetAngle(this (Vector2 a, Vector2 b) pair)
  51. {
  52. var a = Vector2.Normalize(pair.a);
  53. var b = Vector2.Normalize(pair.b);
  54. var c = Vector2.Dot(a, b);
  55. if (c > 1) c = 1;
  56. if (c < -1) c = -1;
  57. return (float)Math.Acos(c);
  58. }
  59. public static (Vector3, Vector3) GetBounds(this IEnumerable<Vector3> collection)
  60. {
  61. var min = new Vector3(float.MaxValue);
  62. var max = new Vector3(float.MinValue);
  63. foreach (var v in collection)
  64. {
  65. min = Vector3.Min(v, min);
  66. max = Vector3.Max(v, max);
  67. }
  68. return (min, max);
  69. }
  70. public static Vector3 GetMin(this IEnumerable<Vector3> collection)
  71. {
  72. var min = new Vector3(float.MaxValue);
  73. foreach (var v in collection)
  74. {
  75. min = Vector3.Min(v, min);
  76. }
  77. return min;
  78. }
  79. public static Vector3 GetMax(this IEnumerable<Vector3> collection)
  80. {
  81. var max = new Vector3(float.MinValue);
  82. foreach (var v in collection)
  83. {
  84. max = Vector3.Max(v, max);
  85. }
  86. return max;
  87. }
  88. }
  89. }