00001 #region --- License ---
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #endregion
00024
00025 using System;
00026 using System.Runtime.InteropServices;
00027 namespace OpenTK
00028 {
00033 [Serializable]
00034 [StructLayout(LayoutKind.Sequential)]
00035 public struct Vector2 : IEquatable<Vector2>
00036 {
00037 #region Fields
00038
00042 public float X;
00043
00047 public float Y;
00048
00049 #endregion
00050
00051 #region Constructors
00052
00058 public Vector2(float x, float y)
00059 {
00060 X = x;
00061 Y = y;
00062 }
00063
00068 [Obsolete]
00069 public Vector2(Vector2 v)
00070 {
00071 X = v.X;
00072 Y = v.Y;
00073 }
00074
00079 [Obsolete]
00080 public Vector2(Vector3 v)
00081 {
00082 X = v.X;
00083 Y = v.Y;
00084 }
00085
00090 [Obsolete]
00091 public Vector2(Vector4 v)
00092 {
00093 X = v.X;
00094 Y = v.Y;
00095 }
00096
00097 #endregion
00098
00099 #region Public Members
00100
00101 #region Instance
00102
00103 #region public void Add()
00104
00107 [Obsolete("Use static Add() method instead.")]
00108 public void Add(Vector2 right)
00109 {
00110 this.X += right.X;
00111 this.Y += right.Y;
00112 }
00113
00116 [CLSCompliant(false)]
00117 [Obsolete("Use static Add() method instead.")]
00118 public void Add(ref Vector2 right)
00119 {
00120 this.X += right.X;
00121 this.Y += right.Y;
00122 }
00123
00124 #endregion public void Add()
00125
00126 #region public void Sub()
00127
00130 [Obsolete("Use static Subtract() method instead.")]
00131 public void Sub(Vector2 right)
00132 {
00133 this.X -= right.X;
00134 this.Y -= right.Y;
00135 }
00136
00139 [CLSCompliant(false)]
00140 [Obsolete("Use static Subtract() method instead.")]
00141 public void Sub(ref Vector2 right)
00142 {
00143 this.X -= right.X;
00144 this.Y -= right.Y;
00145 }
00146
00147 #endregion public void Sub()
00148
00149 #region public void Mult()
00150
00153 [Obsolete("Use static Multiply() method instead.")]
00154 public void Mult(float f)
00155 {
00156 this.X *= f;
00157 this.Y *= f;
00158 }
00159
00160 #endregion public void Mult()
00161
00162 #region public void Div()
00163
00166 [Obsolete("Use static Divide() method instead.")]
00167 public void Div(float f)
00168 {
00169 float mult = 1.0f / f;
00170 this.X *= mult;
00171 this.Y *= mult;
00172 }
00173
00174 #endregion public void Div()
00175
00176 #region public float Length
00177
00183 public float Length
00184 {
00185 get
00186 {
00187 return (float)System.Math.Sqrt(X * X + Y * Y);
00188 }
00189 }
00190
00191 #endregion
00192
00193 #region public float LengthFast
00194
00204 public float LengthFast
00205 {
00206 get
00207 {
00208 return 1.0f / MathHelper.InverseSqrtFast(X * X + Y * Y);
00209 }
00210 }
00211
00212 #endregion
00213
00214 #region public float LengthSquared
00215
00225 public float LengthSquared
00226 {
00227 get
00228 {
00229 return X * X + Y * Y;
00230 }
00231 }
00232
00233 #endregion
00234
00235 #region public Vector2 PerpendicularRight
00236
00240 public Vector2 PerpendicularRight
00241 {
00242 get
00243 {
00244 return new Vector2(Y, -X);
00245 }
00246 }
00247
00248 #endregion
00249
00250 #region public Vector2 PerpendicularLeft
00251
00255 public Vector2 PerpendicularLeft
00256 {
00257 get
00258 {
00259 return new Vector2(-Y, X);
00260 }
00261 }
00262
00263 #endregion
00264
00265 #region public void Normalize()
00266
00270 public void Normalize()
00271 {
00272 float scale = 1.0f / this.Length;
00273 X *= scale;
00274 Y *= scale;
00275 }
00276
00277 #endregion
00278
00279 #region public void NormalizeFast()
00280
00284 public void NormalizeFast()
00285 {
00286 float scale = MathHelper.InverseSqrtFast(X * X + Y * Y);
00287 X *= scale;
00288 Y *= scale;
00289 }
00290
00291 #endregion
00292
00293 #region public void Scale()
00294
00300 [Obsolete("Use static Multiply() method instead.")]
00301 public void Scale(float sx, float sy)
00302 {
00303 this.X = X * sx;
00304 this.Y = Y * sy;
00305 }
00306
00309 [Obsolete("Use static Multiply() method instead.")]
00310 public void Scale(Vector2 scale)
00311 {
00312 this.X *= scale.X;
00313 this.Y *= scale.Y;
00314 }
00315
00318 [CLSCompliant(false)]
00319 [Obsolete("Use static Multiply() method instead.")]
00320 public void Scale(ref Vector2 scale)
00321 {
00322 this.X *= scale.X;
00323 this.Y *= scale.Y;
00324 }
00325
00326 #endregion public void Scale()
00327
00328 #endregion
00329
00330 #region Static
00331
00332 #region Fields
00333
00337 public static readonly Vector2 UnitX = new Vector2(1, 0);
00338
00342 public static readonly Vector2 UnitY = new Vector2(0, 1);
00343
00347 public static readonly Vector2 Zero = new Vector2(0, 0);
00348
00352 public static readonly Vector2 One = new Vector2(1, 1);
00353
00357 public static readonly int SizeInBytes = Marshal.SizeOf(new Vector2());
00358
00359 #endregion
00360
00361 #region Obsolete
00362
00363 #region Sub
00364
00371 [Obsolete("Use static Subtract() method instead.")]
00372 public static Vector2 Sub(Vector2 a, Vector2 b)
00373 {
00374 a.X -= b.X;
00375 a.Y -= b.Y;
00376 return a;
00377 }
00378
00385 [Obsolete("Use static Subtract() method instead.")]
00386 public static void Sub(ref Vector2 a, ref Vector2 b, out Vector2 result)
00387 {
00388 result.X = a.X - b.X;
00389 result.Y = a.Y - b.Y;
00390 }
00391
00392 #endregion
00393
00394 #region Mult
00395
00402 [Obsolete("Use static Multiply() method instead.")]
00403 public static Vector2 Mult(Vector2 a, float f)
00404 {
00405 a.X *= f;
00406 a.Y *= f;
00407 return a;
00408 }
00409
00416 [Obsolete("Use static Multiply() method instead.")]
00417 public static void Mult(ref Vector2 a, float f, out Vector2 result)
00418 {
00419 result.X = a.X * f;
00420 result.Y = a.Y * f;
00421 }
00422
00423 #endregion
00424
00425 #region Div
00426
00433 [Obsolete("Use static Divide() method instead.")]
00434 public static Vector2 Div(Vector2 a, float f)
00435 {
00436 float mult = 1.0f / f;
00437 a.X *= mult;
00438 a.Y *= mult;
00439 return a;
00440 }
00441
00448 [Obsolete("Use static Divide() method instead.")]
00449 public static void Div(ref Vector2 a, float f, out Vector2 result)
00450 {
00451 float mult = 1.0f / f;
00452 result.X = a.X * mult;
00453 result.Y = a.Y * mult;
00454 }
00455
00456 #endregion
00457
00458 #endregion
00459
00460 #region Add
00461
00468 public static Vector2 Add(Vector2 a, Vector2 b)
00469 {
00470 Add(ref a, ref b, out a);
00471 return a;
00472 }
00473
00480 public static void Add(ref Vector2 a, ref Vector2 b, out Vector2 result)
00481 {
00482 result = new Vector2(a.X + b.X, a.Y + b.Y);
00483 }
00484
00485 #endregion
00486
00487 #region Subtract
00488
00495 public static Vector2 Subtract(Vector2 a, Vector2 b)
00496 {
00497 Subtract(ref a, ref b, out a);
00498 return a;
00499 }
00500
00507 public static void Subtract(ref Vector2 a, ref Vector2 b, out Vector2 result)
00508 {
00509 result = new Vector2(a.X - b.X, a.Y - b.Y);
00510 }
00511
00512 #endregion
00513
00514 #region Multiply
00515
00522 public static Vector2 Multiply(Vector2 vector, float scale)
00523 {
00524 Multiply(ref vector, scale, out vector);
00525 return vector;
00526 }
00527
00534 public static void Multiply(ref Vector2 vector, float scale, out Vector2 result)
00535 {
00536 result = new Vector2(vector.X * scale, vector.Y * scale);
00537 }
00538
00545 public static Vector2 Multiply(Vector2 vector, Vector2 scale)
00546 {
00547 Multiply(ref vector, ref scale, out vector);
00548 return vector;
00549 }
00550
00557 public static void Multiply(ref Vector2 vector, ref Vector2 scale, out Vector2 result)
00558 {
00559 result = new Vector2(vector.X * scale.X, vector.Y * scale.Y);
00560 }
00561
00562 #endregion
00563
00564 #region Divide
00565
00572 public static Vector2 Divide(Vector2 vector, float scale)
00573 {
00574 Divide(ref vector, scale, out vector);
00575 return vector;
00576 }
00577
00584 public static void Divide(ref Vector2 vector, float scale, out Vector2 result)
00585 {
00586 Multiply(ref vector, 1 / scale, out result);
00587 }
00588
00595 public static Vector2 Divide(Vector2 vector, Vector2 scale)
00596 {
00597 Divide(ref vector, ref scale, out vector);
00598 return vector;
00599 }
00600
00607 public static void Divide(ref Vector2 vector, ref Vector2 scale, out Vector2 result)
00608 {
00609 result = new Vector2(vector.X / scale.X, vector.Y / scale.Y);
00610 }
00611
00612 #endregion
00613
00614 #region ComponentMin
00615
00622 public static Vector2 ComponentMin(Vector2 a, Vector2 b)
00623 {
00624 a.X = a.X < b.X ? a.X : b.X;
00625 a.Y = a.Y < b.Y ? a.Y : b.Y;
00626 return a;
00627 }
00628
00635 public static void ComponentMin(ref Vector2 a, ref Vector2 b, out Vector2 result)
00636 {
00637 result.X = a.X < b.X ? a.X : b.X;
00638 result.Y = a.Y < b.Y ? a.Y : b.Y;
00639 }
00640
00641 #endregion
00642
00643 #region ComponentMax
00644
00651 public static Vector2 ComponentMax(Vector2 a, Vector2 b)
00652 {
00653 a.X = a.X > b.X ? a.X : b.X;
00654 a.Y = a.Y > b.Y ? a.Y : b.Y;
00655 return a;
00656 }
00657
00664 public static void ComponentMax(ref Vector2 a, ref Vector2 b, out Vector2 result)
00665 {
00666 result.X = a.X > b.X ? a.X : b.X;
00667 result.Y = a.Y > b.Y ? a.Y : b.Y;
00668 }
00669
00670 #endregion
00671
00672 #region Min
00673
00680 public static Vector2 Min(Vector2 left, Vector2 right)
00681 {
00682 return left.LengthSquared < right.LengthSquared ? left : right;
00683 }
00684
00685 #endregion
00686
00687 #region Max
00688
00695 public static Vector2 Max(Vector2 left, Vector2 right)
00696 {
00697 return left.LengthSquared >= right.LengthSquared ? left : right;
00698 }
00699
00700 #endregion
00701
00702 #region Clamp
00703
00711 public static Vector2 Clamp(Vector2 vec, Vector2 min, Vector2 max)
00712 {
00713 vec.X = vec.X < min.X ? min.X : vec.X > max.X ? max.X : vec.X;
00714 vec.Y = vec.Y < min.Y ? min.Y : vec.Y > max.Y ? max.Y : vec.Y;
00715 return vec;
00716 }
00717
00725 public static void Clamp(ref Vector2 vec, ref Vector2 min, ref Vector2 max, out Vector2 result)
00726 {
00727 result.X = vec.X < min.X ? min.X : vec.X > max.X ? max.X : vec.X;
00728 result.Y = vec.Y < min.Y ? min.Y : vec.Y > max.Y ? max.Y : vec.Y;
00729 }
00730
00731 #endregion
00732
00733 #region Normalize
00734
00740 public static Vector2 Normalize(Vector2 vec)
00741 {
00742 float scale = 1.0f / vec.Length;
00743 vec.X *= scale;
00744 vec.Y *= scale;
00745 return vec;
00746 }
00747
00753 public static void Normalize(ref Vector2 vec, out Vector2 result)
00754 {
00755 float scale = 1.0f / vec.Length;
00756 result.X = vec.X * scale;
00757 result.Y = vec.Y * scale;
00758 }
00759
00760 #endregion
00761
00762 #region NormalizeFast
00763
00769 public static Vector2 NormalizeFast(Vector2 vec)
00770 {
00771 float scale = MathHelper.InverseSqrtFast(vec.X * vec.X + vec.Y * vec.Y);
00772 vec.X *= scale;
00773 vec.Y *= scale;
00774 return vec;
00775 }
00776
00782 public static void NormalizeFast(ref Vector2 vec, out Vector2 result)
00783 {
00784 float scale = MathHelper.InverseSqrtFast(vec.X * vec.X + vec.Y * vec.Y);
00785 result.X = vec.X * scale;
00786 result.Y = vec.Y * scale;
00787 }
00788
00789 #endregion
00790
00791 #region Dot
00792
00799 public static float Dot(Vector2 left, Vector2 right)
00800 {
00801 return left.X * right.X + left.Y * right.Y;
00802 }
00803
00810 public static void Dot(ref Vector2 left, ref Vector2 right, out float result)
00811 {
00812 result = left.X * right.X + left.Y * right.Y;
00813 }
00814
00815 #endregion
00816
00817 #region Lerp
00818
00826 public static Vector2 Lerp(Vector2 a, Vector2 b, float blend)
00827 {
00828 a.X = blend * (b.X - a.X) + a.X;
00829 a.Y = blend * (b.Y - a.Y) + a.Y;
00830 return a;
00831 }
00832
00840 public static void Lerp(ref Vector2 a, ref Vector2 b, float blend, out Vector2 result)
00841 {
00842 result.X = blend * (b.X - a.X) + a.X;
00843 result.Y = blend * (b.Y - a.Y) + a.Y;
00844 }
00845
00846 #endregion
00847
00848 #region Barycentric
00849
00859 public static Vector2 BaryCentric(Vector2 a, Vector2 b, Vector2 c, float u, float v)
00860 {
00861 return a + u * (b - a) + v * (c - a);
00862 }
00863
00871 public static void BaryCentric(ref Vector2 a, ref Vector2 b, ref Vector2 c, float u, float v, out Vector2 result)
00872 {
00873 result = a;
00874
00875 Vector2 temp = b;
00876 Subtract(ref temp, ref a, out temp);
00877 Multiply(ref temp, u, out temp);
00878 Add(ref result, ref temp, out result);
00879
00880 temp = c;
00881 Subtract(ref temp, ref a, out temp);
00882 Multiply(ref temp, v, out temp);
00883 Add(ref result, ref temp, out result);
00884 }
00885
00886 #endregion
00887
00888 #region Transform
00889
00896 public static Vector2 Transform(Vector2 vec, Quaternion quat)
00897 {
00898 Vector2 result;
00899 Transform(ref vec, ref quat, out result);
00900 return result;
00901 }
00902
00909 public static void Transform(ref Vector2 vec, ref Quaternion quat, out Vector2 result)
00910 {
00911 Quaternion v = new Quaternion(vec.X, vec.Y, 0, 0), i, t;
00912 Quaternion.Invert(ref quat, out i);
00913 Quaternion.Multiply(ref quat, ref v, out t);
00914 Quaternion.Multiply(ref t, ref i, out v);
00915
00916 result = new Vector2(v.X, v.Y);
00917 }
00918
00919 #endregion
00920
00921 #endregion
00922
00923 #region Operators
00924
00931 public static Vector2 operator +(Vector2 left, Vector2 right)
00932 {
00933 left.X += right.X;
00934 left.Y += right.Y;
00935 return left;
00936 }
00937
00944 public static Vector2 operator -(Vector2 left, Vector2 right)
00945 {
00946 left.X -= right.X;
00947 left.Y -= right.Y;
00948 return left;
00949 }
00950
00956 public static Vector2 operator -(Vector2 vec)
00957 {
00958 vec.X = -vec.X;
00959 vec.Y = -vec.Y;
00960 return vec;
00961 }
00962
00969 public static Vector2 operator *(Vector2 vec, float scale)
00970 {
00971 vec.X *= scale;
00972 vec.Y *= scale;
00973 return vec;
00974 }
00975
00982 public static Vector2 operator *(float scale, Vector2 vec)
00983 {
00984 vec.X *= scale;
00985 vec.Y *= scale;
00986 return vec;
00987 }
00988
00995 public static Vector2 operator /(Vector2 vec, float scale)
00996 {
00997 float mult = 1.0f / scale;
00998 vec.X *= mult;
00999 vec.Y *= mult;
01000 return vec;
01001 }
01002
01009 public static bool operator ==(Vector2 left, Vector2 right)
01010 {
01011 return left.Equals(right);
01012 }
01013
01020 public static bool operator !=(Vector2 left, Vector2 right)
01021 {
01022 return !left.Equals(right);
01023 }
01024
01025 #endregion
01026
01027 #region Overrides
01028
01029 #region public override string ToString()
01030
01035 public override string ToString()
01036 {
01037 return String.Format("({0}, {1})", X, Y);
01038 }
01039
01040 #endregion
01041
01042 #region public override int GetHashCode()
01043
01048 public override int GetHashCode()
01049 {
01050 return X.GetHashCode() ^ Y.GetHashCode();
01051 }
01052
01053 #endregion
01054
01055 #region public override bool Equals(object obj)
01056
01062 public override bool Equals(object obj)
01063 {
01064 if (!(obj is Vector2))
01065 return false;
01066
01067 return this.Equals((Vector2)obj);
01068 }
01069
01070 #endregion
01071
01072 #endregion
01073
01074 #endregion
01075
01076 #region IEquatable<Vector2> Members
01077
01081 public bool Equals(Vector2 other)
01082 {
01083 return
01084 X == other.X &&
01085 Y == other.Y;
01086 }
01087
01088 #endregion
01089 }
01090 }