2007-03-18 Jeffrey Stedfast <fejj@gnome.org>
* DemoLib/Vector.cs: Added more special vectors (x2y2z2): Renamed to LengthSquared (Cross): Fixed a 3am typo that caused the cross-product methods to be broken (Angle): Added a static version of this method (Normal): Return this if the length is 1 (Normalize): No-op if the length is 1 svn path=/trunk/DemoLib/; revision=74585
This commit is contained in:
Родитель
863de2ffa5
Коммит
cfed690ef2
10
ChangeLog
10
ChangeLog
|
@ -0,0 +1,10 @@
|
|||
2007-03-18 Jeffrey Stedfast <fejj@gnome.org>
|
||||
|
||||
* DemoLib/Vector.cs: Added more special vectors
|
||||
(x2y2z2): Renamed to LengthSquared
|
||||
(Cross): Fixed a 3am typo that caused the cross-product methods to
|
||||
be broken
|
||||
(Angle): Added a static version of this method
|
||||
(Normal): Return this if the length is 1
|
||||
(Normalize): No-op if the length is 1
|
||||
|
|
@ -21,8 +21,15 @@ using System.Text;
|
|||
|
||||
namespace DemoLib {
|
||||
public class Vector : ICloneable {
|
||||
#region Special Vectors
|
||||
public static readonly Vector Backward = new Vector (0.0f, 0.0f, -1.0f);
|
||||
public static readonly Vector Forward = new Vector (0.0f, 0.0f, 1.0f);
|
||||
public static readonly Vector Right = new Vector (1.0f, 0.0f, 0.0f);
|
||||
public static readonly Vector Left = new Vector (-1.0f, 0.0f, 0.0f);
|
||||
public static readonly Vector Down = new Vector (0.0f, -1.0f, 0.0f);
|
||||
public static readonly Vector Zero = new Vector (0.0f, 0.0f, 0.0f);
|
||||
public static readonly Vector Up = new Vector (0.0f, 1.0f, 0.0f);
|
||||
#endregion
|
||||
|
||||
public float[] v;
|
||||
|
||||
|
@ -72,23 +79,21 @@ namespace DemoLib {
|
|||
set { v[3] = value; }
|
||||
}
|
||||
|
||||
float x2y2z2 {
|
||||
float LengthSquared {
|
||||
get { return (x * x) + (y * y) + (z * z); }
|
||||
}
|
||||
|
||||
// Length of this Vector
|
||||
public float Length {
|
||||
get {
|
||||
return (float) Math.Sqrt ((double) (x2y2z2));
|
||||
}
|
||||
get { return (float) Math.Sqrt (LengthSquared); }
|
||||
}
|
||||
|
||||
// A new Normal Vector representative of this Vector
|
||||
// A Normal Vector representative of this Vector
|
||||
public Vector Normal {
|
||||
get {
|
||||
float len = this.Length;
|
||||
float len = Length;
|
||||
|
||||
if (len == 0.0f)
|
||||
if (len == 0.0f || len == 1.0f)
|
||||
return this;
|
||||
|
||||
return new Vector (x / len, y / len, z / len, w);
|
||||
|
@ -98,7 +103,7 @@ namespace DemoLib {
|
|||
// Angle between this Vector and the X-Axis
|
||||
public float AngleX {
|
||||
get {
|
||||
float n = x2y2z2;
|
||||
float n = LengthSquared;
|
||||
|
||||
return (float) Math.Acos (x / Math.Sqrt ((double) (n * n)));
|
||||
}
|
||||
|
@ -107,7 +112,7 @@ namespace DemoLib {
|
|||
// Angle between this Vector and the Y-Axis
|
||||
public float AngleY {
|
||||
get {
|
||||
float n = x2y2z2;
|
||||
float n = LengthSquared;
|
||||
|
||||
return (float) Math.Acos (y / Math.Sqrt ((double) (n * n)));
|
||||
}
|
||||
|
@ -116,7 +121,7 @@ namespace DemoLib {
|
|||
// Angle between this Vector and the Z-Axis
|
||||
public float AngleZ {
|
||||
get {
|
||||
float n = x2y2z2;
|
||||
float n = LengthSquared;
|
||||
|
||||
return (float) Math.Acos (z / Math.Sqrt ((double) (n * n)));
|
||||
}
|
||||
|
@ -130,9 +135,9 @@ namespace DemoLib {
|
|||
|
||||
// Normalize this Vector
|
||||
public void Normalize () {
|
||||
float len = this.Length;
|
||||
float len = Length;
|
||||
|
||||
if (len == 0.0f)
|
||||
if (len == 0.0f || len == 1.0f)
|
||||
return;
|
||||
|
||||
x /= len;
|
||||
|
@ -143,8 +148,17 @@ namespace DemoLib {
|
|||
// Angle between this Vector and another Vector
|
||||
public float Angle (Vector vector) {
|
||||
float dot = this.Dot (vector);
|
||||
float n1 = vector.x2y2z2;
|
||||
float n0 = x2y2z2;
|
||||
float n1 = vector.LengthSquared;
|
||||
float n0 = LengthSquared;
|
||||
|
||||
return (float) Math.Acos (dot / Math.Sqrt ((double) (n0 * n1)));
|
||||
}
|
||||
|
||||
// Angle between 2 vectors
|
||||
public static float Angle (Vector v0, Vector v1) {
|
||||
float n0 = v0.LengthSquared;
|
||||
float n1 = v1.LengthSquared;
|
||||
float dot = v0.Dot (v1);
|
||||
|
||||
return (float) Math.Acos (dot / Math.Sqrt ((double) (n0 * n1)));
|
||||
}
|
||||
|
@ -190,7 +204,7 @@ namespace DemoLib {
|
|||
// Cross product of 2 Vectors
|
||||
public Vector Cross (Vector vector) {
|
||||
return new Vector ((y * vector.z) - (z * vector.y),
|
||||
(z * vector.z) - (z * vector.x),
|
||||
(z * vector.x) - (x * vector.z),
|
||||
(x * vector.y) - (y * vector.x));
|
||||
}
|
||||
|
||||
|
@ -202,7 +216,7 @@ namespace DemoLib {
|
|||
// Cross product of 2 Vectors
|
||||
public static Vector Cross (Vector v0, Vector v1) {
|
||||
return new Vector ((v0.y * v1.z) - (v0.z * v1.y),
|
||||
(v0.z * v1.z) - (v0.z * v1.x),
|
||||
(v0.z * v1.x) - (v0.x * v1.z),
|
||||
(v0.x * v1.y) - (v0.y * v1.x));
|
||||
}
|
||||
|
||||
|
|
|
@ -64,6 +64,8 @@ namespace DemoLib {
|
|||
this.Name = "DemoLib.ScreenResolution";
|
||||
this.Title = Mono.Unix.Catalog.GetString("Settings");
|
||||
this.Icon = Gtk.IconTheme.Default.LoadIcon("stock_3d-colors", 16, 0);
|
||||
this.WindowPosition = ((Gtk.WindowPosition)(4));
|
||||
this.HasSeparator = false;
|
||||
// Internal child DemoLib.ScreenResolution.VBox
|
||||
Gtk.VBox w1 = this.VBox;
|
||||
w1.Events = ((Gdk.EventMask)(256));
|
||||
|
|
Загрузка…
Ссылка в новой задаче