Merge pull request #356 from skkestrel/develop

improvements to Math/Box2 and addition of Math/Box2d
This commit is contained in:
Paul Scharf 2016-03-08 06:03:58 +01:00
commit 1c4a18332a
3 changed files with 334 additions and 11 deletions

View file

@ -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
{
@ -77,6 +75,30 @@ namespace OpenTK
return new Box2(left, top, right, bottom);
}
/// <summary>
/// Creates a new Box2 with the specified dimensions.
/// </summary>
/// <param name="top">The position of the top boundary.</param>
/// <param name="left">The position of the left boundary.</param>
/// <param name="width">The width of the box.</param>
/// <param name="height">The height of the box.</param>
/// <returns>A new OpenTK.Box2 with the specfied dimensions.</returns>
public static Box2 FromDimensions(float left, float top, float width, float height)
{
return new Box2(left, top, left + width, top + height);
}
/// <summary>
/// Creates a new Box2 with the specified dimensions.
/// </summary>
/// <param name="position">The position of the top left corner.</param>
/// <param name="size">The size of the box.</param>
/// <returns>A new OpenTK.Box2 with the specfied dimensions.</returns>
public static Box2 FromDimensions(Vector2 position, Vector2 size)
{
return FromDimensions(position.X, position.Y, size.X, size.Y);
}
/// <summary>
/// Gets a float describing the width of the Box2 structure.
/// </summary>
@ -87,13 +109,104 @@ namespace OpenTK
/// </summary>
public float Height { get { return (float)System.Math.Abs(Bottom - Top); } }
/// <summary>
/// Returns whether the box contains the specified point on the closed region described by this Box2.
/// </summary>
/// <param name="point">The point to query.</param>
/// <returns>Whether this box contains the point.</returns>
public bool Contains(Vector2 point)
{
return Contains(point, true);
}
/// <summary>
/// Returns whether the box contains the specified point.
/// </summary>
/// <param name="point">The point to query.</param>
/// <param name="closedRegion">Whether to include the box boundary in the test region.</param>
/// <returns>Whether this box contains the point.</returns>
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;
}
/// <summary>
/// Returns a Box2 translated by the given amount.
/// </summary>
public Box2 Translated(Vector2 point)
{
return new Box2(Left + point.X, Top + point.Y, Right + point.X, Bottom + point.Y);
}
/// <summary>
/// Translates this Box2 by the given amount.
/// </summary>
public void Translate(Vector2 point)
{
Left += point.X;
Right += point.X;
Top += point.Y;
Bottom += point.Y;
}
/// <summary>
/// Equality comparator.
/// </summary>
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;
}
/// <summary>
/// Inequality comparator.
/// </summary>
public static bool operator !=(Box2 left, Box2 right)
{
return !(left == right);
}
/// <summary>
/// Functional equality comparator.
/// </summary>
public bool Equals(Box2 other)
{
return this == other;
}
/// <summary>
/// Implements Object.Equals.
/// </summary>
public override bool Equals(object obj)
{
return obj is Box2 && Equals((Box2) obj);
}
/// <summary>
/// Gets the hash code for this Box2.
/// </summary>
/// <returns></returns>
public override int GetHashCode()
{
return Left.GetHashCode() ^ Right.GetHashCode() ^ Top.GetHashCode() ^ Bottom.GetHashCode();
}
private static string listSeparator = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator;
/// <summary>
/// Returns a <see cref="System.String"/> describing the current instance.
/// </summary>
/// <returns></returns>
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);
}
}
}

212
Source/OpenTK/Math/Box2d.cs Normal file
View file

@ -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
{
/// <summary>
/// Defines a 2d box (rectangle).
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct Box2d
{
/// <summary>
/// The left boundary of the structure.
/// </summary>
public double Left;
/// <summary>
/// The right boundary of the structure.
/// </summary>
public double Right;
/// <summary>
/// The top boundary of the structure.
/// </summary>
public double Top;
/// <summary>
/// The bottom boundary of the structure.
/// </summary>
public double Bottom;
/// <summary>
/// Constructs a new Box2d with the specified dimensions.
/// </summary>
/// <param name="topLeft">An OpenTK.Vector2d describing the top-left corner of the Box2d.</param>
/// <param name="bottomRight">An OpenTK.Vector2d describing the bottom-right corner of the Box2d.</param>
public Box2d(Vector2d topLeft, Vector2d bottomRight)
{
Left = topLeft.X;
Top = topLeft.Y;
Right = bottomRight.X;
Bottom = bottomRight.Y;
}
/// <summary>
/// Constructs a new Box2d with the specified dimensions.
/// </summary>
/// <param name="left">The position of the left boundary.</param>
/// <param name="top">The position of the top boundary.</param>
/// <param name="right">The position of the right boundary.</param>
/// <param name="bottom">The position of the bottom boundary.</param>
public Box2d(double left, double top, double right, double bottom)
{
Left = left;
Top = top;
Right = right;
Bottom = bottom;
}
/// <summary>
/// Creates a new Box2d with the specified dimensions.
/// </summary>
/// <param name="top">The position of the top boundary.</param>
/// <param name="left">The position of the left boundary.</param>
/// <param name="right">The position of the right boundary.</param>
/// <param name="bottom">The position of the bottom boundary.</param>
/// <returns>A new OpenTK.Box2d with the specfied dimensions.</returns>
public static Box2d FromTLRB(double top, double left, double right, double bottom)
{
return new Box2d(left, top, right, bottom);
}
/// <summary>
/// Creates a new Box2d with the specified dimensions.
/// </summary>
/// <param name="top">The position of the top boundary.</param>
/// <param name="left">The position of the left boundary.</param>
/// <param name="width">The width of the box.</param>
/// <param name="height">The height of the box.</param>
/// <returns>A new OpenTK.Box2d with the specfied dimensions.</returns>
public static Box2d FromDimensions(double left, double top, double width, double height)
{
return new Box2d(left, top, left + width, top + height);
}
/// <summary>
/// Creates a new Box2d with the specified dimensions.
/// </summary>
/// <param name="position">The position of the top left corner.</param>
/// <param name="size">The size of the box.</param>
/// <returns>A new OpenTK.Box2d with the specfied dimensions.</returns>
public static Box2d FromDimensions(Vector2d position, Vector2d size)
{
return FromDimensions(position.X, position.Y, size.X, size.Y);
}
/// <summary>
/// Gets a double describing the width of the Box2d structure.
/// </summary>
public double Width { get { return (double)System.Math.Abs(Right - Left); } }
/// <summary>
/// Gets a double describing the height of the Box2d structure.
/// </summary>
public double Height { get { return (double)System.Math.Abs(Bottom - Top); } }
/// <summary>
/// Returns whether the box contains the specified point on the closed region described by this Box2.
/// </summary>
/// <param name="point">The point to query.</param>
/// <returns>Whether this box contains the point.</returns>
public bool Contains(Vector2d point)
{
return Contains(point, true);
}
/// <summary>
/// Returns whether the box contains the specified point.
/// </summary>
/// <param name="point">The point to query.</param>
/// <param name="closedRegion">Whether to include the box boundary in the test region.</param>
/// <returns>Whether this box contains the point.</returns>
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;
}
/// <summary>
/// Returns a Box2d translated by the given amount.
/// </summary>
public Box2d Translated(Vector2d point)
{
return new Box2d(Left + point.X, Top + point.Y, Right + point.X, Bottom + point.Y);
}
/// <summary>
/// Translates this Box2d by the given amount.
/// </summary>
public void Translate(Vector2d point)
{
Left += point.X;
Right += point.X;
Top += point.Y;
Bottom += point.Y;
}
/// <summary>
/// Equality comparator.
/// </summary>
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;
}
/// <summary>
/// Inequality comparator.
/// </summary>
public static bool operator !=(Box2d left, Box2d right)
{
return !(left == right);
}
/// <summary>
/// Functional equality comparator.
/// </summary>
public bool Equals(Box2d other)
{
return this == other;
}
/// <summary>
/// Implements Object.Equals.
/// </summary>
public override bool Equals(object obj)
{
return obj is Box2d && Equals((Box2d) obj);
}
/// <summary>
/// Gets the hash code for this Box2d.
/// </summary>
/// <returns></returns>
public override int GetHashCode()
{
return Left.GetHashCode() ^ Right.GetHashCode() ^ Top.GetHashCode() ^ Bottom.GetHashCode();
}
private static string listSeparator = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator;
/// <summary>
/// Returns a <see cref="System.String"/> describing the current instance.
/// </summary>
/// <returns></returns>
public override string ToString()
{
return String.Format("({0}{4} {1}) - ({2}{4} {3})", Left, Top, Right, Bottom, listSeparator);
}
}
}

View file

@ -162,6 +162,7 @@
<Compile Include="..\GlobalAssemblyInfo.cs">
<Link>Properties\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Math\Box2d.cs" />
<Compile Include="DisplayDevice.cs">
<SubType>Code</SubType>
</Compile>
@ -894,8 +895,5 @@
</MonoDevelop>
</ProjectExtensions>
<ItemGroup />
<ItemGroup>
<Folder Include="Platform\Linux\" />
<Folder Include="Platform\Linux\Bindings\" />
</ItemGroup>
<ItemGroup />
</Project>