diff --git a/Source/OpenTK/Math/Box2.cs b/Source/OpenTK/Math/Box2.cs index 4c54b622..418a7c7a 100644 --- a/Source/OpenTK/Math/Box2.cs +++ b/Source/OpenTK/Math/Box2.cs @@ -1,12 +1,10 @@ #region --- License --- -/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos - * See license.txt for license info - */ +// Copyright (c) Open Toolkit library. +// This file is subject to the terms and conditions defined in +// file 'License.txt', which is part of this source code package. #endregion using System; -using System.Collections.Generic; -using System.Text; using System.Runtime.InteropServices; namespace OpenTK { @@ -39,7 +37,7 @@ namespace OpenTK /// /// Constructs a new Box2 with the specified dimensions. /// - /// AnOpenTK.Vector2 describing the top-left corner of the Box2. + /// An OpenTK.Vector2 describing the top-left corner of the Box2. /// An OpenTK.Vector2 describing the bottom-right corner of the Box2. public Box2(Vector2 topLeft, Vector2 bottomRight) { @@ -77,6 +75,30 @@ namespace OpenTK return new Box2(left, top, right, bottom); } + /// + /// Creates a new Box2 with the specified dimensions. + /// + /// The position of the top boundary. + /// The position of the left boundary. + /// The width of the box. + /// The height of the box. + /// A new OpenTK.Box2 with the specfied dimensions. + public static Box2 FromDimensions(float left, float top, float width, float height) + { + return new Box2(left, top, left + width, top + height); + } + + /// + /// Creates a new Box2 with the specified dimensions. + /// + /// The position of the top left corner. + /// The size of the box. + /// A new OpenTK.Box2 with the specfied dimensions. + public static Box2 FromDimensions(Vector2 position, Vector2 size) + { + return FromDimensions(position.X, position.Y, size.X, size.Y); + } + /// /// Gets a float describing the width of the Box2 structure. /// @@ -87,13 +109,104 @@ namespace OpenTK /// public float Height { get { return (float)System.Math.Abs(Bottom - Top); } } + /// + /// Returns whether the box contains the specified point on the closed region described by this Box2. + /// + /// The point to query. + /// Whether this box contains the point. + public bool Contains(Vector2 point) + { + return Contains(point, true); + } + + /// + /// Returns whether the box contains the specified point. + /// + /// The point to query. + /// Whether to include the box boundary in the test region. + /// Whether this box contains the point. + public bool Contains(Vector2 point, bool closedRegion) + { + bool xOK = (closedRegion == Left <= Right) ? + (point.X >= Left != point.X > Right) : + (point.X > Left != point.X >= Right); + + bool yOK = (closedRegion == Top <= Bottom) ? + (point.Y >= Top != point.Y > Bottom) : + (point.Y > Top != point.Y >= Bottom); + + return xOK && yOK; + } + + /// + /// Returns a Box2 translated by the given amount. + /// + public Box2 Translated(Vector2 point) + { + return new Box2(Left + point.X, Top + point.Y, Right + point.X, Bottom + point.Y); + } + + /// + /// Translates this Box2 by the given amount. + /// + public void Translate(Vector2 point) + { + Left += point.X; + Right += point.X; + Top += point.Y; + Bottom += point.Y; + } + + /// + /// Equality comparator. + /// + public static bool operator ==(Box2 left, Box2 right) + { + return left.Bottom == right.Bottom && left.Top == right.Top && + left.Left == right.Left && left.Right == right.Right; + } + + /// + /// Inequality comparator. + /// + public static bool operator !=(Box2 left, Box2 right) + { + return !(left == right); + } + + /// + /// Functional equality comparator. + /// + public bool Equals(Box2 other) + { + return this == other; + } + + /// + /// Implements Object.Equals. + /// + public override bool Equals(object obj) + { + return obj is Box2 && Equals((Box2) obj); + } + + /// + /// Gets the hash code for this Box2. + /// + /// + public override int GetHashCode() + { + return Left.GetHashCode() ^ Right.GetHashCode() ^ Top.GetHashCode() ^ Bottom.GetHashCode(); + } + + private static string listSeparator = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator; /// /// Returns a describing the current instance. /// /// public override string ToString() { - return String.Format("({0},{1})-({2},{3})", Left, Top, Right, Bottom); + return String.Format("({0}{4} {1}) - ({2}{4} {3})", Left, Top, Right, Bottom, listSeparator); } } } diff --git a/Source/OpenTK/Math/Box2d.cs b/Source/OpenTK/Math/Box2d.cs new file mode 100644 index 00000000..78fe467c --- /dev/null +++ b/Source/OpenTK/Math/Box2d.cs @@ -0,0 +1,212 @@ +#region --- License --- +// Copyright (c) Open Toolkit library. +// This file is subject to the terms and conditions defined in +// file 'License.txt', which is part of this source code package. +#endregion + +using System; +using System.Runtime.InteropServices; +namespace OpenTK +{ + /// + /// Defines a 2d box (rectangle). + /// + [StructLayout(LayoutKind.Sequential)] + public struct Box2d + { + /// + /// The left boundary of the structure. + /// + public double Left; + + /// + /// The right boundary of the structure. + /// + public double Right; + + /// + /// The top boundary of the structure. + /// + public double Top; + + /// + /// The bottom boundary of the structure. + /// + public double Bottom; + + /// + /// Constructs a new Box2d with the specified dimensions. + /// + /// An OpenTK.Vector2d describing the top-left corner of the Box2d. + /// An OpenTK.Vector2d describing the bottom-right corner of the Box2d. + public Box2d(Vector2d topLeft, Vector2d bottomRight) + { + Left = topLeft.X; + Top = topLeft.Y; + Right = bottomRight.X; + Bottom = bottomRight.Y; + } + + /// + /// Constructs a new Box2d with the specified dimensions. + /// + /// The position of the left boundary. + /// The position of the top boundary. + /// The position of the right boundary. + /// The position of the bottom boundary. + public Box2d(double left, double top, double right, double bottom) + { + Left = left; + Top = top; + Right = right; + Bottom = bottom; + } + + /// + /// Creates a new Box2d with the specified dimensions. + /// + /// The position of the top boundary. + /// The position of the left boundary. + /// The position of the right boundary. + /// The position of the bottom boundary. + /// A new OpenTK.Box2d with the specfied dimensions. + public static Box2d FromTLRB(double top, double left, double right, double bottom) + { + return new Box2d(left, top, right, bottom); + } + + /// + /// Creates a new Box2d with the specified dimensions. + /// + /// The position of the top boundary. + /// The position of the left boundary. + /// The width of the box. + /// The height of the box. + /// A new OpenTK.Box2d with the specfied dimensions. + public static Box2d FromDimensions(double left, double top, double width, double height) + { + return new Box2d(left, top, left + width, top + height); + } + + /// + /// Creates a new Box2d with the specified dimensions. + /// + /// The position of the top left corner. + /// The size of the box. + /// A new OpenTK.Box2d with the specfied dimensions. + public static Box2d FromDimensions(Vector2d position, Vector2d size) + { + return FromDimensions(position.X, position.Y, size.X, size.Y); + } + + /// + /// Gets a double describing the width of the Box2d structure. + /// + public double Width { get { return (double)System.Math.Abs(Right - Left); } } + + /// + /// Gets a double describing the height of the Box2d structure. + /// + public double Height { get { return (double)System.Math.Abs(Bottom - Top); } } + + /// + /// Returns whether the box contains the specified point on the closed region described by this Box2. + /// + /// The point to query. + /// Whether this box contains the point. + public bool Contains(Vector2d point) + { + return Contains(point, true); + } + + /// + /// Returns whether the box contains the specified point. + /// + /// The point to query. + /// Whether to include the box boundary in the test region. + /// Whether this box contains the point. + public bool Contains(Vector2d point, bool closedRegion) + { + bool xOK = (closedRegion == Left <= Right) ? + (point.X >= Left != point.X > Right) : + (point.X > Left != point.X >= Right); + + bool yOK = (closedRegion == Top <= Bottom) ? + (point.Y >= Top != point.Y > Bottom) : + (point.Y > Top != point.Y >= Bottom); + + return xOK && yOK; + } + + /// + /// Returns a Box2d translated by the given amount. + /// + public Box2d Translated(Vector2d point) + { + return new Box2d(Left + point.X, Top + point.Y, Right + point.X, Bottom + point.Y); + } + + /// + /// Translates this Box2d by the given amount. + /// + public void Translate(Vector2d point) + { + Left += point.X; + Right += point.X; + Top += point.Y; + Bottom += point.Y; + } + + /// + /// Equality comparator. + /// + public static bool operator ==(Box2d left, Box2d right) + { + return left.Bottom == right.Bottom && left.Top == right.Top && + left.Left == right.Left && left.Right == right.Right; + } + + /// + /// Inequality comparator. + /// + public static bool operator !=(Box2d left, Box2d right) + { + return !(left == right); + } + + /// + /// Functional equality comparator. + /// + public bool Equals(Box2d other) + { + return this == other; + } + + /// + /// Implements Object.Equals. + /// + public override bool Equals(object obj) + { + return obj is Box2d && Equals((Box2d) obj); + } + + /// + /// Gets the hash code for this Box2d. + /// + /// + public override int GetHashCode() + { + return Left.GetHashCode() ^ Right.GetHashCode() ^ Top.GetHashCode() ^ Bottom.GetHashCode(); + } + + private static string listSeparator = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator; + /// + /// Returns a describing the current instance. + /// + /// + public override string ToString() + { + return String.Format("({0}{4} {1}) - ({2}{4} {3})", Left, Top, Right, Bottom, listSeparator); + } + } +} diff --git a/Source/OpenTK/OpenTK.csproj b/Source/OpenTK/OpenTK.csproj index e5f7937a..d15987e7 100644 --- a/Source/OpenTK/OpenTK.csproj +++ b/Source/OpenTK/OpenTK.csproj @@ -162,6 +162,7 @@ Properties\GlobalAssemblyInfo.cs + Code @@ -894,8 +895,5 @@ - - - - + \ No newline at end of file