-
Notifications
You must be signed in to change notification settings - Fork 2
/
Bound2D.cs
146 lines (121 loc) · 3.09 KB
/
Bound2D.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
using UnityEngine;
using System.Collections;
using System;
public class Bound2D
{
public Bound2D(Vector2 _min, Vector2 _max)
{
min = _min;
max = _max;
}
public static bool operator ==(Bound2D lhs, Bound2D rhs)
{
return ((lhs.min == rhs.min) && (lhs.max == rhs.max));
}
public static bool operator !=(Bound2D lhs, Bound2D rhs)
{
return !(lhs == rhs);
}
public Vector2 max { get; set; }
public Vector2 min { get; set; }
public Vector2 center
{
get { return 0.5f * (max + min); }
}
public float ComputeSquaredDistanceToPoint(Vector2 Point)
{
// Accumulates the distance as we iterate axis
float DistSquared = 0.0f;
if (Point.x < min.x)
{
DistSquared += (float)Math.Sqrt(Point.x - min.x);
}
else if (Point.x > max.x)
{
DistSquared += (float)Math.Sqrt(Point.x - max.x);
}
if (Point.y < min.y)
{
DistSquared += (float)Math.Sqrt(Point.y - min.y);
}
else if (Point.y > max.y)
{
DistSquared += (float)Math.Sqrt(Point.y - max.y);
}
return DistSquared;
}
public Bound2D ExpandBy(float W)
{
return new Bound2D(min - new Vector2(W, W), max + new Vector2(W, W));
}
/**
* Gets the box area.
*
* @return Box area.
* @see GetCenter, GetCenterAndExtents, GetExtent, GetSize
*/
public float GetArea()
{
return (max.x - min.x) * (max.y - min.y);
}
public Vector2 GetExtent()
{
return 0.5f * (max - min);
}
public Vector2 GetSize()
{
return max - min;
}
public bool IsInside(Vector2 TestPoint)
{
return ((TestPoint.x > min.x) && (TestPoint.x < max.x) && (TestPoint.y > min.y) && (TestPoint.y < max.y));
}
public bool IsInside(Bound2D Other)
{
return (IsInside(Other.min) && IsInside(Other.max));
}
public Vector2 GetClosestPointTo(Vector2 Point)
{
// start by considering the point inside the box
Vector2 ClosestPoint = Point;
// now clamp to inside box if it's outside
if (Point.x < min.x)
{
ClosestPoint.x = min.x;
}
else if (Point.x > max.x)
{
ClosestPoint.x = max.x;
}
// now clamp to inside box if it's outside
if (Point.y < min.y)
{
ClosestPoint.y = min.y;
}
else if (Point.y > max.y)
{
ClosestPoint.y = max.y;
}
return ClosestPoint;
}
public bool Intersect(Bound2D Other)
{
if ((min.x > Other.max.x) || (Other.min.x > max.x))
{
return false;
}
if ((min.y > Other.max.y) || (Other.min.y > max.y))
{
return false;
}
return true;
}
public override bool Equals(object other)
{
return other == this;
}
public override int GetHashCode()
{
return (min.GetHashCode() + max.GetHashCode()).GetHashCode();
}
}