View difference between Paste ID: 1RkaP28U and ri5tfkXx
SHOW: | | - or go back to the newest paste.
1-
using System.Collections;
1+
2
using UnityEngine;
3
4
namespace Hydra.HydraCommon.Utils.Comparers
5
{
6
	/// <summary>
7
	/// 	ClockwiseComparer provides functionality for sorting a collection of Vector2s such
8
	/// 	that they are ordered clockwise about a given origin.
9
	/// </summary>
10
	public class ClockwiseComparer : IComparer<Vector2>
11
	{
12
		private Vector2 m_Origin;
13
14
		#region Properties
15
16
		/// <summary>
17
		/// 	Gets or sets the origin.
18
		/// </summary>
19
		/// <value>The origin.</value>
20
		public Vector2 origin { get { return m_Origin; } set { m_Origin = value; } }
21
22
		#endregion
23
24
		/// <summary>
25
		/// 	Initializes a new instance of the ClockwiseComparer class.
26
		/// </summary>
27
		/// <param name="origin">Origin.</param>
28
		public ClockwiseComparer(Vector2 origin)
29
		{
30
			m_Origin = origin;
31
		}
32
33
		#region IComparer Methods
34
35
		/// <summary>
36
		/// 	Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other.
37
		/// </summary>
38
		/// <param name="first">First.</param>
39
		/// <param name="second">Second.</param>
40
		public int Compare(Vector2 first, Vector2 second)
41
		{
42
			return IsClockwise(first, second, m_Origin);
43
		}
44
45
		#endregion
46
47
		/// <summary>
48
		/// 	Returns 1 if first comes before second in clockwise order.
49
		/// 	Returns -1 if second comes before first.
50
		/// 	Returns 0 if the points are identical.
51
		/// </summary>
52
		/// <param name="first">First.</param>
53
		/// <param name="second">Second.</param>
54
		/// <param name="origin">Origin.</param>
55
		public static int IsClockwise(Vector2 first, Vector2 second, Vector2 origin)
56
		{
57
			if (first == second)
58
				return 0;
59
60
			Vector2 firstOffset = first - origin;
61
			Vector2 secondOffset = second - origin;
62
63
			float angle1 = Mathf.Atan2(firstOffset.x, firstOffset.y);
64
			float angle2 = Mathf.Atan2(secondOffset.x, secondOffset.y);
65
66
			if (angle1 < angle2)
67
				return -1;
68
69
			if (angle1 > angle2)
70
				return 1;
71
72
			// Check to see which point is closest
73
			return (firstOffset.sqrMagnitude < secondOffset.sqrMagnitude) ? -1 : 1;
74
		}
75
	}
76
}