Unity 框架

BezierCurve.cs 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace TFramework
  5. {
  6. /// <summary>
  7. /// 贝塞尔曲线
  8. /// </summary>
  9. public class BezierCurve
  10. {
  11. static List<Vector2> vector2s = new List<Vector2>();
  12. static List<Vector3> vector3s = new List<Vector3>();
  13. /// <summary>
  14. /// 阶乘
  15. /// </summary>
  16. /// <param name="n"></param>
  17. /// <returns></returns>
  18. private static long Factoral(int n)
  19. {
  20. long result = 1;
  21. for (int i = 2; i <= n; i++)
  22. result *= i;
  23. return result;
  24. }
  25. /// <summary>
  26. /// 计算组合数
  27. /// </summary>
  28. /// <param name="n"></param>
  29. /// <param name="k"></param>
  30. /// <returns></returns>
  31. private static long BinomialCoeffcient(int n,int k)=> Factoral(n) / Factoral(k) * Factoral(n - k);
  32. /// <summary>
  33. /// 获取Vector2贝塞尔曲线上的点
  34. /// </summary>
  35. /// <param name="t">范围值(0~1)</param>
  36. /// <param name="controlPoints">控制点</param>
  37. /// <returns></returns>
  38. public static Vector2 CalculateVector2BezierPoint(float t,IEnumerable<Vector2> controlPoints)
  39. {
  40. Vector2 point = Vector2.zero;
  41. vector2s.Clear();
  42. vector2s.AddRange(controlPoints);
  43. int n = vector2s.Count - 1;
  44. for(int i=0;i<=n;i++)
  45. {
  46. float binomialCoefficient = BinomialCoeffcient(n, i);
  47. float term = binomialCoefficient * Mathf.Pow(1 - t, n - i) * Mathf.Pow(t, i);
  48. point += term * vector2s[i];
  49. }
  50. return point;
  51. }
  52. /// <summary>
  53. /// 获取Vector3贝塞尔曲线上的点
  54. /// </summary>
  55. /// <param name="t">范围值(0~1)</param>
  56. /// <param name="controlPoints">控制点</param>
  57. /// <returns></returns>
  58. public static Vector3 CalculateVector3BezierPoint(float t, IEnumerable<Vector3> controlPoints)
  59. {
  60. Vector3 point = Vector3.zero;
  61. vector3s.Clear();
  62. vector3s.AddRange(controlPoints);
  63. int n = vector3s.Count - 1;
  64. for (int i = 0; i <= n; i++)
  65. {
  66. float binomialCoefficient = BinomialCoeffcient(n, i);
  67. float term = binomialCoefficient * Mathf.Pow(1 - t, n - i) * Mathf.Pow(t, i);
  68. point += term * vector3s[i];
  69. }
  70. return point;
  71. }
  72. }
  73. }