Polygon3D.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. namespace O3DWB
  5. {
  6. public class Polygon3D
  7. {
  8. #region Private Variables
  9. private Vector3 _normal;
  10. private List<Vector3> _pointsOnPolygonPlane = new List<Vector3>();
  11. private List<Segment3D> _edges = new List<Segment3D>();
  12. #endregion
  13. #region Public Properties
  14. public Vector3 Normal { get { return _normal; } }
  15. public Plane Plane { get { return NumberOfPoints != 0 ? new Plane(Normal, _pointsOnPolygonPlane[0]) : new Plane(); } }
  16. public List<Vector3> PointsOnPolygonPlane { get { return new List<Vector3>(_pointsOnPolygonPlane); } } // Note: In no particular order!
  17. public List<Segment3D> Edges { get { return new List<Segment3D>(_edges); } } // Note: In no particular order!
  18. public int NumberOfPoints { get { return _pointsOnPolygonPlane.Count; } }
  19. #endregion
  20. #region Public Static Functions
  21. public static Plane GetPolygonEdgePlane(Segment3D polyEdge, Vector3 polyNormal)
  22. {
  23. Vector3 planeNormal = Vector3.Cross(polyEdge.Direction, polyNormal);
  24. planeNormal.Normalize();
  25. return new Plane(planeNormal, polyEdge.StartPoint);
  26. }
  27. #endregion
  28. #region Public Methods
  29. public List<Ray3D> GetEdgeRays()
  30. {
  31. if (NumberOfPoints < 3) return new List<Ray3D>();
  32. var rays = new List<Ray3D>(NumberOfPoints);
  33. foreach(var segment in _edges)
  34. {
  35. rays.Add(new Ray3D(segment.StartPoint, segment.Direction));
  36. }
  37. return rays;
  38. }
  39. public void SetPointsOnPolygonPlaneAndNormal(List<Vector3> pointsOnPolygonPlane, Vector3 polygonNormal)
  40. {
  41. _normal = polygonNormal;
  42. _normal.Normalize();
  43. var quickHull = new Polygon3DQuickHull(pointsOnPolygonPlane, polygonNormal);
  44. _edges = quickHull.Calculate();
  45. _pointsOnPolygonPlane.Clear();
  46. foreach(var edge in _edges)
  47. {
  48. _pointsOnPolygonPlane.Add(edge.StartPoint);
  49. _pointsOnPolygonPlane.Add(edge.EndPoint);
  50. }
  51. Vector3Extensions.EliminateDuplicatePoints(_pointsOnPolygonPlane);
  52. }
  53. public bool ContainsAnyPoint(List<Vector3> points)
  54. {
  55. foreach(Vector3 point in points)
  56. {
  57. if (ContainsPoint(point)) return true;
  58. }
  59. return false;
  60. }
  61. public bool ContainsPoint(Vector3 point)
  62. {
  63. if(NumberOfPoints < 3) return false;
  64. if (!Plane.IsPointOnPlane(point)) return false;
  65. foreach(var edge in _edges)
  66. {
  67. Plane edgePlane = GetPolygonEdgePlane(edge, _normal);
  68. if (edgePlane.IsPointInFront(point)) return false;
  69. }
  70. return true;
  71. }
  72. #endregion
  73. }
  74. }
  75. #endif