Skip to content

Commit 09eb5d3

Browse files
committed
Lerp angle
1 parent f5e80ca commit 09eb5d3

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

Scripts/Util/Utils.cs

+19
Original file line numberDiff line numberDiff line change
@@ -1304,6 +1304,25 @@ public static T[] Grow<T>(this T[] array, int length)
13041304

13051305
return array;
13061306
}
1307+
1308+
public static float AngleDifference(float angle1, float angle2)
1309+
{
1310+
float diff = (angle2 - angle1 + 180) % 360 - 180;
1311+
return diff < -180 ? diff + 360 : diff;
1312+
}
1313+
1314+
public static Vector3 InverseLerpEulerAngles(Vector3 min, Vector3 max, Vector3 value)
1315+
{
1316+
var x = InverseLerpAngle(min.x, max.x, value.x);
1317+
var y = InverseLerpAngle(min.y, max.y, value.y);
1318+
var z = InverseLerpAngle(min.z, max.z, value.z);
1319+
return new Vector3(x, y, z);
1320+
}
1321+
1322+
public static float InverseLerpAngle(float min, float max, float t)
1323+
{
1324+
return Mathf.Abs(AngleDifference(t, min) / AngleDifference(max, min));
1325+
}
13071326
}
13081327

13091328
public struct PageElement<T>

Tests/Editor/Utils/UtilsTests.cs

+83
Original file line numberDiff line numberDiff line change
@@ -191,5 +191,88 @@ public void NearestNeighbour24BitScaleDown_MT()
191191

192192
CollectionAssert.AreEqual(expected, actual.bytes);
193193
}
194+
195+
[Test]
196+
public void InverseLerpEulerAngles_1()
197+
{
198+
var min = 0;
199+
var max = 360;
200+
201+
var value = 360;
202+
203+
var actual = Utils.InverseLerpAngle(min, max, value);
204+
var expected = float.NaN;
205+
206+
Assert.AreEqual(expected, actual);
207+
}
208+
209+
[Test]
210+
public void InverseLerpEulerAngles_10()
211+
{
212+
var min = 360;
213+
var max = 0;
214+
215+
var value = 360;
216+
217+
var actual = Utils.InverseLerpAngle(min, max, value);
218+
var expected = float.NaN;
219+
220+
Assert.AreEqual(expected, actual);
221+
}
222+
223+
[Test]
224+
public void InverseLerpEulerAngles_2()
225+
{
226+
var min = 315;
227+
var max = 45;
228+
229+
var value = 0f;
230+
231+
var actual = Utils.InverseLerpAngle(min, max, value);
232+
var expected = 0.5f;
233+
234+
Assert.AreEqual(expected, actual);
235+
}
236+
237+
[Test]
238+
public void InverseLerpEulerAngles_3()
239+
{
240+
var min = 270;
241+
var max = 360;
242+
243+
var value = 0;
244+
245+
var actual = Utils.InverseLerpAngle(min, max, value);
246+
var expected = 1;
247+
248+
Assert.AreEqual(expected, actual);
249+
}
250+
251+
[Test]
252+
public void InverseLerpEulerAngles_4()
253+
{
254+
var min = 270;
255+
var max = 360;
256+
257+
var value = 90;
258+
259+
var actual = Utils.InverseLerpAngle(min, max, value);
260+
var expected = 2;
261+
262+
Assert.AreEqual(expected, actual);
263+
}
264+
265+
[Test]
266+
public void InverseLerpEulerAngles_5()
267+
{
268+
var min = 350;
269+
var max = 320;
270+
var value = 330;
271+
272+
var actual = Utils.InverseLerpAngle(min, max, value);
273+
var expected = 2 / 3f;
274+
275+
Assert.AreEqual(expected, actual);
276+
}
194277
}
195278
}

0 commit comments

Comments
 (0)