Vector2Extensions.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using UnityEditor;
  4. using System.Collections.Generic;
  5. namespace O3DWB
  6. {
  7. public static class Vector2Extensions
  8. {
  9. #region Extension Methods
  10. public static Vector2 GetInverse(this Vector2 vector)
  11. {
  12. return new Vector2(1.0f / vector.x, 1.0f / vector.y);
  13. }
  14. public static Vector2 GetVectorWithAbsoluteValueComponents(this Vector2 vector)
  15. {
  16. vector.x = Mathf.Abs(vector.x);
  17. vector.y = Mathf.Abs(vector.y);
  18. return vector;
  19. }
  20. public static float GetPointDistanceFromSegment(this Vector2 point, Vector2 segmentStart, Vector2 segmentEnd, bool treatSegmentAsInfiniteLine = false)
  21. {
  22. Vector2 segment = segmentEnd - segmentStart;
  23. float segmentLength = segment.magnitude;
  24. segment.Normalize();
  25. Vector2 fromSegmentStartToPoint = point - segmentStart;
  26. float pointProjectionOnSegment = Vector2.Dot(segment, fromSegmentStartToPoint);
  27. if (!treatSegmentAsInfiniteLine)
  28. {
  29. if (pointProjectionOnSegment >= 0 && pointProjectionOnSegment <= segmentLength)
  30. {
  31. Vector2 projectedPoint = segmentStart + segment * pointProjectionOnSegment;
  32. return (point - projectedPoint).magnitude;
  33. }
  34. if (pointProjectionOnSegment > segmentLength) return (point - segmentEnd).magnitude;
  35. else return (point - segmentStart).magnitude;
  36. }
  37. else
  38. {
  39. Vector2 projectedPoint = segmentStart + segment * pointProjectionOnSegment;
  40. return (point - projectedPoint).magnitude;
  41. }
  42. }
  43. public static Vector3 GetWorldPointInFrontOfCamera(this Vector2 point2D, Camera camera, float distanceFromCamNearPlane)
  44. {
  45. point2D.y = SceneView.lastActiveSceneView.camera.pixelRect.height - point2D.y;
  46. var ray = HandleUtility.GUIPointToWorldRay(point2D);
  47. Vector3 camLook = camera.transform.forward;
  48. Plane camNearPlane = new Plane(camLook, camera.transform.position + camLook * (camera.nearClipPlane + distanceFromCamNearPlane));
  49. float t;
  50. camNearPlane.Raycast(ray, out t);
  51. return ray.GetPoint(t);
  52. }
  53. #endregion
  54. #region Utilities
  55. public static List<Vector3> GetWorldPointsInFrontOfCamera(List<Vector2> points2D, Camera camera, float distanceFromCamNearPlane)
  56. {
  57. var pointsInFrontOfCamera = new List<Vector3>(points2D.Count);
  58. foreach(Vector2 point2D in points2D)
  59. {
  60. pointsInFrontOfCamera.Add(GetWorldPointInFrontOfCamera(point2D, camera, distanceFromCamNearPlane));
  61. }
  62. return pointsInFrontOfCamera;
  63. }
  64. public static List<Vector2> GetScreenPoints(List<Vector3> worldPoints, Camera camera)
  65. {
  66. if (worldPoints.Count == 0) return new List<Vector2>();
  67. var screenPoints = new List<Vector2>(worldPoints.Count);
  68. foreach (Vector3 worldPoint in worldPoints)
  69. {
  70. screenPoints.Add(Vector3Extensions.WorldToScreenPoint(worldPoint));
  71. }
  72. return screenPoints;
  73. }
  74. public static Box GetBoxFromPointCloud(List<Vector2> pointCloud)
  75. {
  76. if (pointCloud.Count == 0) return Box.GetInvalid();
  77. Vector3 min = pointCloud[0];
  78. Vector3 max = pointCloud[0];
  79. for(int ptIndex = 1; ptIndex < pointCloud.Count; ++ptIndex)
  80. {
  81. Vector3 point = pointCloud[ptIndex];
  82. min = Vector3.Min(point, min);
  83. max = Vector3.Max(point, max);
  84. }
  85. return new Box((min + max) * 0.5f, (max - min));
  86. }
  87. #endregion
  88. }
  89. }
  90. #endif