AR Design
UBC EML collab with UBC SALA - visualizing IoT data in AR
VectorExtensions.cs
Go to the documentation of this file.
1 // Copyright (c) Microsoft Corporation. All rights reserved.
2 // Licensed under the MIT License. See LICENSE in the project root for license information.
3 
4 using System.Collections.Generic;
5 using System.Linq;
6 using UnityEngine;
7 
8 namespace HoloToolkit.Unity
9 {
13  public static class VectorExtensions
14  {
15  public static Vector2 Mul(this Vector2 value, Vector2 scale)
16  {
17  return new Vector2(value.x * scale.x, value.y * scale.y);
18  }
19 
20  public static Vector2 Div(this Vector2 value, Vector2 scale)
21  {
22  return new Vector2(value.x / scale.x, value.y / scale.y);
23  }
24 
25  public static Vector3 Mul(this Vector3 value, Vector3 scale)
26  {
27  return new Vector3(value.x * scale.x, value.y * scale.y, value.z * scale.z);
28  }
29 
30  public static Vector3 Div(this Vector3 value, Vector3 scale)
31  {
32  return new Vector3(value.x / scale.x, value.y / scale.y, value.z / scale.z);
33  }
34 
35  public static Vector3 RotateAround(this Vector3 point, Vector3 pivot, Quaternion rotation)
36  {
37  return rotation * (point - pivot) + pivot;
38  }
39 
40  public static Vector3 RotateAround(this Vector3 point, Vector3 pivot, Vector3 eulerAngles)
41  {
42  return RotateAround(point, pivot, Quaternion.Euler(eulerAngles));
43  }
44 
45  public static Vector3 TransformPoint(this Vector3 point, Vector3 translation, Quaternion rotation, Vector3 lossyScale)
46  {
47  return rotation * Vector3.Scale(lossyScale, point) + translation;
48  }
49 
50  public static Vector3 InverseTransformPoint(this Vector3 point, Vector3 translation, Quaternion rotation, Vector3 lossyScale)
51  {
52  var scaleInv = new Vector3(1 / lossyScale.x, 1 / lossyScale.y, 1 / lossyScale.z);
53  return Vector3.Scale(scaleInv, (Quaternion.Inverse(rotation) * (point - translation)));
54  }
55 
56  public static Vector2 Average(this IEnumerable<Vector2> vectors)
57  {
58  float x = 0f;
59  float y = 0f;
60  int count = 0;
61  foreach (var pos in vectors)
62  {
63  x += pos.x;
64  y += pos.y;
65  count++;
66  }
67  return new Vector2(x / count, y / count);
68  }
69 
70  public static Vector3 Average(this IEnumerable<Vector3> vectors)
71  {
72  float x = 0f;
73  float y = 0f;
74  float z = 0f;
75  int count = 0;
76  foreach (var pos in vectors)
77  {
78  x += pos.x;
79  y += pos.y;
80  z += pos.z;
81  count++;
82  }
83  return new Vector3(x / count, y / count, z / count);
84  }
85 
86  public static Vector2 Average(this ICollection<Vector2> vectors)
87  {
88  int count = vectors.Count;
89  if (count == 0)
90  {
91  return Vector2.zero;
92  }
93 
94  float x = 0f;
95  float y = 0f;
96  foreach (var pos in vectors)
97  {
98  x += pos.x;
99  y += pos.y;
100  }
101  return new Vector2(x / count, y / count);
102  }
103 
104  public static Vector3 Average(this ICollection<Vector3> vectors)
105  {
106  int count = vectors.Count;
107  if (count == 0)
108  {
109  return Vector3.zero;
110  }
111 
112  float x = 0f;
113  float y = 0f;
114  float z = 0f;
115  foreach (var pos in vectors)
116  {
117  x += pos.x;
118  y += pos.y;
119  z += pos.z;
120  }
121  return new Vector3(x / count, y / count, z / count);
122  }
123 
124  public static Vector2 Median(this IEnumerable<Vector2> vectors)
125  {
126  int count = vectors.Count();
127  if (count == 0)
128  {
129  return Vector2.zero;
130  }
131 
132  return vectors.OrderBy(v => v.sqrMagnitude).ElementAt(count / 2);
133  }
134 
135  public static Vector3 Median(this IEnumerable<Vector3> vectors)
136  {
137  int count = vectors.Count();
138  if (count == 0)
139  {
140  return Vector3.zero;
141  }
142 
143  return vectors.OrderBy(v => v.sqrMagnitude).ElementAt(count / 2);
144  }
145 
146  public static Vector2 Median(this ICollection<Vector2> vectors)
147  {
148  int count = vectors.Count;
149  if (count == 0)
150  {
151  return Vector2.zero;
152  }
153 
154  return vectors.OrderBy(v => v.sqrMagnitude).ElementAt(count / 2);
155  }
156 
157  public static Vector3 Median(this ICollection<Vector3> vectors)
158  {
159  int count = vectors.Count;
160  if (count == 0)
161  {
162  return Vector3.zero;
163  }
164 
165  return vectors.OrderBy(v => v.sqrMagnitude).ElementAt(count / 2);
166  }
167  }
168 }
static Vector2 Div(this Vector2 value, Vector2 scale)
static Vector3 Average(this ICollection< Vector3 > vectors)
static Vector2 Mul(this Vector2 value, Vector2 scale)
static Vector3 Div(this Vector3 value, Vector3 scale)
static Vector3 RotateAround(this Vector3 point, Vector3 pivot, Quaternion rotation)
static Vector3 Mul(this Vector3 value, Vector3 scale)
static Vector3 InverseTransformPoint(this Vector3 point, Vector3 translation, Quaternion rotation, Vector3 lossyScale)
static Vector2 Median(this ICollection< Vector2 > vectors)
A collection of useful extension methods for Unity&#39;s Vector structs.
static Vector2 Median(this IEnumerable< Vector2 > vectors)
static Vector3 Median(this IEnumerable< Vector3 > vectors)
static Vector2 Average(this ICollection< Vector2 > vectors)
static Vector3 Average(this IEnumerable< Vector3 > vectors)
static Vector2 Average(this IEnumerable< Vector2 > vectors)
static Vector3 Median(this ICollection< Vector3 > vectors)
static Vector3 TransformPoint(this Vector3 point, Vector3 translation, Quaternion rotation, Vector3 lossyScale)
static Vector3 RotateAround(this Vector3 point, Vector3 pivot, Vector3 eulerAngles)