Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / System / Windows / Media3D / Rect3D.cs / 1305600 / Rect3D.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: 3D rectangle implementation. // // // // History: // 06/25/2003 : t-gregr - Created // //--------------------------------------------------------------------------- using System; using System.Windows; using System.Diagnostics; using MS.Internal; using MS.Internal.Media3D; using System.Reflection; using System.ComponentModel.Design.Serialization; using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; namespace System.Windows.Media.Media3D { ////// The primitive which represents a 3D rectangle, i.e. a box. Rect3D is stored as /// location (Point3D) and rectangle's size (Size3D). As a result, Rect3D cannot have /// negative sizes. /// public partial struct Rect3D: IFormattable { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- #region Constructors ////// Constructor which sets the initial values to the values of the parameters. /// /// Location of the new rectangle. /// Size of the new rectangle. public Rect3D(Point3D location, Size3D size) { if (size.IsEmpty) { this = s_empty; } else { _x = location._x; _y = location._y; _z = location._z; _sizeX = size._x; _sizeY = size._y; _sizeZ = size._z; } Debug.Assert(size.IsEmpty == IsEmpty); } ////// Constructor which sets the initial values to the values of the parameters. /// SizeX, sizeY, sizeZ must be non-negative. /// /// Value of the X location coordinate of the new rectangle. /// Value of the X location coordinate of the new rectangle. /// Value of the X location coordinate of the new rectangle. /// Size of the new rectangle in X dimension. /// Size of the new rectangle in Y dimension. /// Size of the new rectangle in Z dimension. public Rect3D(double x, double y, double z, double sizeX, double sizeY, double sizeZ) { if (sizeX < 0 || sizeY < 0 || sizeZ < 0) { throw new System.ArgumentException(SR.Get(SRID.Size3D_DimensionCannotBeNegative)); } _x = x; _y = y; _z = z; _sizeX = sizeX; _sizeY = sizeY; _sizeZ = sizeZ; } ////// Constructor which sets the initial values to bound the two points provided. /// /// First point. /// Second point. internal Rect3D(Point3D point1, Point3D point2) { _x = Math.Min(point1._x, point2._x); _y = Math.Min(point1._y, point2._y); _z = Math.Min(point1._z, point2._z); _sizeX = Math.Max(point1._x, point2._x) - _x; _sizeY = Math.Max(point1._y, point2._y) - _y; _sizeZ = Math.Max(point1._z, point2._z) - _z; } ////// Constructor which sets the initial values to bound the point provided and the point /// which results from point + vector. /// /// Location of the rectangle. /// Vector extending the rectangle from the location. internal Rect3D(Point3D point, Vector3D vector): this(point, point+vector) { } #endregion Constructors //------------------------------------------------------ // // Public Properties // //----------------------------------------------------- #region Public Properties ////// Empty - a static property which provides an Empty rectangle. X, Y, and Z are /// positive-infinity and sizes are negative infinity. This is the only situation /// where size can be negative. /// public static Rect3D Empty { get { return s_empty; } } ////// IsEmpty - this returns true if this rect is the Empty rectangle. /// Note: If size is 0 this Rectangle still contains a 0 or 1 dimensional set /// of points, so this method should not be used to check for 0 area. /// public bool IsEmpty { get { return _sizeX < 0; } } ////// The point representing the origin of the rectangle. /// public Point3D Location { get { return new Point3D(_x, _y, _z); } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } _x = value._x; _y = value._y; _z = value._z; } } ////// The size representing the area of the rectangle. /// public Size3D Size { get { if( IsEmpty ) return Size3D.Empty; else return new Size3D(_sizeX, _sizeY, _sizeZ); } set { if (value.IsEmpty) { this = s_empty; } else { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } _sizeX = value._x; _sizeY = value._y; _sizeZ = value._z; } } } ////// Size of the rectangle in the X dimension. /// public double SizeX { get { return _sizeX; } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } if (value < 0) { throw new System.ArgumentException(SR.Get(SRID.Size3D_DimensionCannotBeNegative)); } _sizeX = value; } } ////// Size of the rectangle in the Y dimension. /// public double SizeY { get { return _sizeY; } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } if (value < 0) { throw new System.ArgumentException(SR.Get(SRID.Size3D_DimensionCannotBeNegative)); } _sizeY = value; } } ////// Size of the rectangle in the Z dimension. /// public double SizeZ { get { return _sizeZ; } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } if (value < 0) { throw new System.ArgumentException(SR.Get(SRID.Size3D_DimensionCannotBeNegative)); } _sizeZ = value; } } ////// Value of the X coordinate of the rectangle. /// public double X { get { return _x; } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } _x = value; } } ////// Value of the Y coordinate of the rectangle. /// public double Y { get { return _y; } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } _y = value; } } ////// Value of the Z coordinate of the rectangle. /// public double Z { get { return _z; } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } _z = value; } } #endregion Public Properties //------------------------------------------------------ // // Public Methods // //------------------------------------------------------ #region Public Methods ////// Returns true if the point is within the rectangle, inclusive of the edges. /// Returns false otherwise. /// /// The point which is being tested. ///True if the point is within the rectangle. False otherwise public bool Contains(Point3D point) { return Contains(point._x, point._y, point._z); } ////// Contains - Returns true if the Point represented by x,y,z is within the rectangle /// inclusive of the edges. Returns false otherwise. /// /// X coordinate of the point which is being tested. /// Y coordinate of the point which is being tested. /// Y coordinate of the point which is being tested. ///True if the Point represented by x,y is within the rectangle. /// False otherwise. public bool Contains(double x, double y, double z) { if (IsEmpty) { return false; } return ContainsInternal(x, y, z); } ////// Returns true if the rectangle is non-Empty and is entirely contained within the /// rectangle, inclusive of the edges. Returns false otherwise. /// /// Rectangle being tested. ///Returns true if the rectangle is non-Empty and is entirely contained within the /// rectangle, inclusive of the edges. Returns false otherwise. public bool Contains(Rect3D rect) { if (IsEmpty || rect.IsEmpty) { return false; } return (_x <= rect._x && _y <= rect._y && _z <= rect._z && _x+_sizeX >= rect._x+rect._sizeX && _y+_sizeY >= rect._y+rect._sizeY && _z+_sizeZ >= rect._z+rect._sizeZ); } ////// Returns true if the rectangle intersects with this rectangle. /// Returns false otherwise. Note that if one edge is coincident, this is considered /// an intersection. /// /// Rectangle being tested. ///True if the rectangle intersects with this rectangle. /// False otherwise. public bool IntersectsWith(Rect3D rect) { if (IsEmpty || rect.IsEmpty) { return false; } return (rect._x <= (_x + _sizeX)) && ((rect._x + rect._sizeX) >= _x) && (rect._y <= (_y + _sizeY)) && ((rect._y + rect._sizeY) >= _y) && (rect._z <= (_z + _sizeZ)) && ((rect._z + rect._sizeZ) >= _z); } ////// Intersect - Update this rectangle to be the intersection of this and rect /// If either this or rect are Empty, the result is Empty as well. /// /// The rect to intersect with this public void Intersect(Rect3D rect) { if (IsEmpty || rect.IsEmpty || !this.IntersectsWith(rect)) { this = Empty; } else { double x = Math.Max(_x, rect._x); double y = Math.Max(_y, rect._y); double z = Math.Max(_z, rect._z); _sizeX = Math.Min(_x + _sizeX, rect._x + rect._sizeX) - x; _sizeY = Math.Min(_y + _sizeY, rect._y + rect._sizeY) - y; _sizeZ = Math.Min(_z + _sizeZ, rect._z + rect._sizeZ) - z; _x = x; _y = y; _z = z; } } ////// Return the result of the intersection of rect1 and rect2. /// If either this or rect are Empty, the result is Empty as well. /// /// First rectangle. /// Second rectangle. ///The result of the intersection of rect1 and rect2. public static Rect3D Intersect(Rect3D rect1, Rect3D rect2) { rect1.Intersect(rect2); return rect1; } ////// Update this rectangle to be the union of this and rect. /// /// Rectangle. public void Union(Rect3D rect) { if (IsEmpty) { this = rect; } else if (!rect.IsEmpty) { double x = Math.Min(_x, rect._x); double y = Math.Min(_y, rect._y); double z = Math.Min(_z, rect._z); _sizeX = Math.Max(_x + _sizeX, rect._x + rect._sizeX) - x; _sizeY = Math.Max(_y + _sizeY, rect._y + rect._sizeY) - y; _sizeZ = Math.Max(_z + _sizeZ, rect._z + rect._sizeZ) - z; _x = x; _y = y; _z = z; } } ////// Return the result of the union of rect1 and rect2. /// /// First rectangle. /// Second rectangle. ///The result of the union of the two rectangles. public static Rect3D Union(Rect3D rect1, Rect3D rect2) { rect1.Union(rect2); return rect1; } ////// Update this rectangle to be the union of this and point. /// /// Point. public void Union(Point3D point) { Union(new Rect3D(point, point)); } ////// Return the result of the union of rect and point. /// /// Rectangle. /// Point. ///The result of the union of rect and point. public static Rect3D Union(Rect3D rect, Point3D point) { rect.Union(new Rect3D(point, point)); return rect; } ////// Translate the Location by the offset provided. /// If this is Empty, this method is illegal. /// /// public void Offset(Vector3D offsetVector) { Offset(offsetVector._x, offsetVector._y, offsetVector._z); } ////// Offset - translate the Location by the offset provided /// If this is Empty, this method is illegal. /// /// /// /// public void Offset(double offsetX, double offsetY, double offsetZ) { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotCallMethod)); } _x += offsetX; _y += offsetY; _z += offsetZ; } ////// Offset - return the result of offsetting rect by the offset provided /// If this is Empty, this method is illegal. /// /// /// ///public static Rect3D Offset(Rect3D rect, Vector3D offsetVector) { rect.Offset(offsetVector._x, offsetVector._y, offsetVector._z); return rect; } /// /// Offset - return the result of offsetting rect by the offset provided /// If this is Empty, this method is illegal. /// /// /// /// /// ///public static Rect3D Offset(Rect3D rect, double offsetX, double offsetY, double offsetZ) { rect.Offset(offsetX, offsetY, offsetZ); return rect; } #endregion Public Methods //----------------------------------------------------- // // Internal Fields // //------------------------------------------------------ #region Internal Fields internal readonly static Rect3D Infinite = CreateInfiniteRect3D(); #endregion Internal Fields //----------------------------------------------------- // // Private Methods // //----------------------------------------------------- #region Private Methods /// /// ContainsInternal - Performs just the "point inside" logic. /// /// /// /// ///bool - true if the point is inside the rect private bool ContainsInternal(double x, double y, double z) { // We include points on the edge as "contained" return ((x >= _x) && (x <= _x + _sizeX) && (y >= _y) && (y <= _y + _sizeY) && (z >= _z) && (z <= _z + _sizeZ)); } private static Rect3D CreateEmptyRect3D() { Rect3D empty = new Rect3D(); empty._x = Double.PositiveInfinity; empty._y = Double.PositiveInfinity; empty._z = Double.PositiveInfinity; // Can't use setters because they throw on negative values empty._sizeX = Double.NegativeInfinity; empty._sizeY = Double.NegativeInfinity; empty._sizeZ = Double.NegativeInfinity; return empty; } private static Rect3D CreateInfiniteRect3D() { // NTRAID#Longhorn-1044943-2005/11/15-[....] - Robustness with infinities // // Once the issue with Rect robustness with infinities is addressed we // should change the values below to make this rectangle truely extend // from -Infinite to +Infinity. // // Until then we use a Rect from -float.MaxValue to +float.MaxValue. // Because this rect is used only as a conservative bounding box for // ScreenSpaceLines3D this span should be sufficient for the following // reasons: // // 1. Our meshes and transforms are reprensented in single precision // at render time. If it's not in this range it will not be // rendered. // // 2. SSLines3Ds are constructed as simple quads at render time. // We will hit the guard band on the GPU at a limit far less than // +/- float.MaxValue. // // 3. We do our managed math in double precision so this still // leaves us ample space to account for transforms, etc. // Rect3D infinite = new Rect3D(); infinite._x = -float.MaxValue; infinite._y = -float.MaxValue; infinite._z = -float.MaxValue; infinite._sizeX = float.MaxValue*2.0; infinite._sizeY = float.MaxValue*2.0; infinite._sizeZ = float.MaxValue*2.0; return infinite; } #endregion Private Methods //----------------------------------------------------- // // Private Fields // //------------------------------------------------------ #region Private Fields private readonly static Rect3D s_empty = CreateEmptyRect3D(); #endregion Private Fields } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: 3D rectangle implementation. // // // // History: // 06/25/2003 : t-gregr - Created // //--------------------------------------------------------------------------- using System; using System.Windows; using System.Diagnostics; using MS.Internal; using MS.Internal.Media3D; using System.Reflection; using System.ComponentModel.Design.Serialization; using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; namespace System.Windows.Media.Media3D { ////// The primitive which represents a 3D rectangle, i.e. a box. Rect3D is stored as /// location (Point3D) and rectangle's size (Size3D). As a result, Rect3D cannot have /// negative sizes. /// public partial struct Rect3D: IFormattable { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- #region Constructors ////// Constructor which sets the initial values to the values of the parameters. /// /// Location of the new rectangle. /// Size of the new rectangle. public Rect3D(Point3D location, Size3D size) { if (size.IsEmpty) { this = s_empty; } else { _x = location._x; _y = location._y; _z = location._z; _sizeX = size._x; _sizeY = size._y; _sizeZ = size._z; } Debug.Assert(size.IsEmpty == IsEmpty); } ////// Constructor which sets the initial values to the values of the parameters. /// SizeX, sizeY, sizeZ must be non-negative. /// /// Value of the X location coordinate of the new rectangle. /// Value of the X location coordinate of the new rectangle. /// Value of the X location coordinate of the new rectangle. /// Size of the new rectangle in X dimension. /// Size of the new rectangle in Y dimension. /// Size of the new rectangle in Z dimension. public Rect3D(double x, double y, double z, double sizeX, double sizeY, double sizeZ) { if (sizeX < 0 || sizeY < 0 || sizeZ < 0) { throw new System.ArgumentException(SR.Get(SRID.Size3D_DimensionCannotBeNegative)); } _x = x; _y = y; _z = z; _sizeX = sizeX; _sizeY = sizeY; _sizeZ = sizeZ; } ////// Constructor which sets the initial values to bound the two points provided. /// /// First point. /// Second point. internal Rect3D(Point3D point1, Point3D point2) { _x = Math.Min(point1._x, point2._x); _y = Math.Min(point1._y, point2._y); _z = Math.Min(point1._z, point2._z); _sizeX = Math.Max(point1._x, point2._x) - _x; _sizeY = Math.Max(point1._y, point2._y) - _y; _sizeZ = Math.Max(point1._z, point2._z) - _z; } ////// Constructor which sets the initial values to bound the point provided and the point /// which results from point + vector. /// /// Location of the rectangle. /// Vector extending the rectangle from the location. internal Rect3D(Point3D point, Vector3D vector): this(point, point+vector) { } #endregion Constructors //------------------------------------------------------ // // Public Properties // //----------------------------------------------------- #region Public Properties ////// Empty - a static property which provides an Empty rectangle. X, Y, and Z are /// positive-infinity and sizes are negative infinity. This is the only situation /// where size can be negative. /// public static Rect3D Empty { get { return s_empty; } } ////// IsEmpty - this returns true if this rect is the Empty rectangle. /// Note: If size is 0 this Rectangle still contains a 0 or 1 dimensional set /// of points, so this method should not be used to check for 0 area. /// public bool IsEmpty { get { return _sizeX < 0; } } ////// The point representing the origin of the rectangle. /// public Point3D Location { get { return new Point3D(_x, _y, _z); } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } _x = value._x; _y = value._y; _z = value._z; } } ////// The size representing the area of the rectangle. /// public Size3D Size { get { if( IsEmpty ) return Size3D.Empty; else return new Size3D(_sizeX, _sizeY, _sizeZ); } set { if (value.IsEmpty) { this = s_empty; } else { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } _sizeX = value._x; _sizeY = value._y; _sizeZ = value._z; } } } ////// Size of the rectangle in the X dimension. /// public double SizeX { get { return _sizeX; } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } if (value < 0) { throw new System.ArgumentException(SR.Get(SRID.Size3D_DimensionCannotBeNegative)); } _sizeX = value; } } ////// Size of the rectangle in the Y dimension. /// public double SizeY { get { return _sizeY; } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } if (value < 0) { throw new System.ArgumentException(SR.Get(SRID.Size3D_DimensionCannotBeNegative)); } _sizeY = value; } } ////// Size of the rectangle in the Z dimension. /// public double SizeZ { get { return _sizeZ; } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } if (value < 0) { throw new System.ArgumentException(SR.Get(SRID.Size3D_DimensionCannotBeNegative)); } _sizeZ = value; } } ////// Value of the X coordinate of the rectangle. /// public double X { get { return _x; } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } _x = value; } } ////// Value of the Y coordinate of the rectangle. /// public double Y { get { return _y; } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } _y = value; } } ////// Value of the Z coordinate of the rectangle. /// public double Z { get { return _z; } set { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotModifyEmptyRect)); } _z = value; } } #endregion Public Properties //------------------------------------------------------ // // Public Methods // //------------------------------------------------------ #region Public Methods ////// Returns true if the point is within the rectangle, inclusive of the edges. /// Returns false otherwise. /// /// The point which is being tested. ///True if the point is within the rectangle. False otherwise public bool Contains(Point3D point) { return Contains(point._x, point._y, point._z); } ////// Contains - Returns true if the Point represented by x,y,z is within the rectangle /// inclusive of the edges. Returns false otherwise. /// /// X coordinate of the point which is being tested. /// Y coordinate of the point which is being tested. /// Y coordinate of the point which is being tested. ///True if the Point represented by x,y is within the rectangle. /// False otherwise. public bool Contains(double x, double y, double z) { if (IsEmpty) { return false; } return ContainsInternal(x, y, z); } ////// Returns true if the rectangle is non-Empty and is entirely contained within the /// rectangle, inclusive of the edges. Returns false otherwise. /// /// Rectangle being tested. ///Returns true if the rectangle is non-Empty and is entirely contained within the /// rectangle, inclusive of the edges. Returns false otherwise. public bool Contains(Rect3D rect) { if (IsEmpty || rect.IsEmpty) { return false; } return (_x <= rect._x && _y <= rect._y && _z <= rect._z && _x+_sizeX >= rect._x+rect._sizeX && _y+_sizeY >= rect._y+rect._sizeY && _z+_sizeZ >= rect._z+rect._sizeZ); } ////// Returns true if the rectangle intersects with this rectangle. /// Returns false otherwise. Note that if one edge is coincident, this is considered /// an intersection. /// /// Rectangle being tested. ///True if the rectangle intersects with this rectangle. /// False otherwise. public bool IntersectsWith(Rect3D rect) { if (IsEmpty || rect.IsEmpty) { return false; } return (rect._x <= (_x + _sizeX)) && ((rect._x + rect._sizeX) >= _x) && (rect._y <= (_y + _sizeY)) && ((rect._y + rect._sizeY) >= _y) && (rect._z <= (_z + _sizeZ)) && ((rect._z + rect._sizeZ) >= _z); } ////// Intersect - Update this rectangle to be the intersection of this and rect /// If either this or rect are Empty, the result is Empty as well. /// /// The rect to intersect with this public void Intersect(Rect3D rect) { if (IsEmpty || rect.IsEmpty || !this.IntersectsWith(rect)) { this = Empty; } else { double x = Math.Max(_x, rect._x); double y = Math.Max(_y, rect._y); double z = Math.Max(_z, rect._z); _sizeX = Math.Min(_x + _sizeX, rect._x + rect._sizeX) - x; _sizeY = Math.Min(_y + _sizeY, rect._y + rect._sizeY) - y; _sizeZ = Math.Min(_z + _sizeZ, rect._z + rect._sizeZ) - z; _x = x; _y = y; _z = z; } } ////// Return the result of the intersection of rect1 and rect2. /// If either this or rect are Empty, the result is Empty as well. /// /// First rectangle. /// Second rectangle. ///The result of the intersection of rect1 and rect2. public static Rect3D Intersect(Rect3D rect1, Rect3D rect2) { rect1.Intersect(rect2); return rect1; } ////// Update this rectangle to be the union of this and rect. /// /// Rectangle. public void Union(Rect3D rect) { if (IsEmpty) { this = rect; } else if (!rect.IsEmpty) { double x = Math.Min(_x, rect._x); double y = Math.Min(_y, rect._y); double z = Math.Min(_z, rect._z); _sizeX = Math.Max(_x + _sizeX, rect._x + rect._sizeX) - x; _sizeY = Math.Max(_y + _sizeY, rect._y + rect._sizeY) - y; _sizeZ = Math.Max(_z + _sizeZ, rect._z + rect._sizeZ) - z; _x = x; _y = y; _z = z; } } ////// Return the result of the union of rect1 and rect2. /// /// First rectangle. /// Second rectangle. ///The result of the union of the two rectangles. public static Rect3D Union(Rect3D rect1, Rect3D rect2) { rect1.Union(rect2); return rect1; } ////// Update this rectangle to be the union of this and point. /// /// Point. public void Union(Point3D point) { Union(new Rect3D(point, point)); } ////// Return the result of the union of rect and point. /// /// Rectangle. /// Point. ///The result of the union of rect and point. public static Rect3D Union(Rect3D rect, Point3D point) { rect.Union(new Rect3D(point, point)); return rect; } ////// Translate the Location by the offset provided. /// If this is Empty, this method is illegal. /// /// public void Offset(Vector3D offsetVector) { Offset(offsetVector._x, offsetVector._y, offsetVector._z); } ////// Offset - translate the Location by the offset provided /// If this is Empty, this method is illegal. /// /// /// /// public void Offset(double offsetX, double offsetY, double offsetZ) { if (IsEmpty) { throw new System.InvalidOperationException(SR.Get(SRID.Rect3D_CannotCallMethod)); } _x += offsetX; _y += offsetY; _z += offsetZ; } ////// Offset - return the result of offsetting rect by the offset provided /// If this is Empty, this method is illegal. /// /// /// ///public static Rect3D Offset(Rect3D rect, Vector3D offsetVector) { rect.Offset(offsetVector._x, offsetVector._y, offsetVector._z); return rect; } /// /// Offset - return the result of offsetting rect by the offset provided /// If this is Empty, this method is illegal. /// /// /// /// /// ///public static Rect3D Offset(Rect3D rect, double offsetX, double offsetY, double offsetZ) { rect.Offset(offsetX, offsetY, offsetZ); return rect; } #endregion Public Methods //----------------------------------------------------- // // Internal Fields // //------------------------------------------------------ #region Internal Fields internal readonly static Rect3D Infinite = CreateInfiniteRect3D(); #endregion Internal Fields //----------------------------------------------------- // // Private Methods // //----------------------------------------------------- #region Private Methods /// /// ContainsInternal - Performs just the "point inside" logic. /// /// /// /// ///bool - true if the point is inside the rect private bool ContainsInternal(double x, double y, double z) { // We include points on the edge as "contained" return ((x >= _x) && (x <= _x + _sizeX) && (y >= _y) && (y <= _y + _sizeY) && (z >= _z) && (z <= _z + _sizeZ)); } private static Rect3D CreateEmptyRect3D() { Rect3D empty = new Rect3D(); empty._x = Double.PositiveInfinity; empty._y = Double.PositiveInfinity; empty._z = Double.PositiveInfinity; // Can't use setters because they throw on negative values empty._sizeX = Double.NegativeInfinity; empty._sizeY = Double.NegativeInfinity; empty._sizeZ = Double.NegativeInfinity; return empty; } private static Rect3D CreateInfiniteRect3D() { // NTRAID#Longhorn-1044943-2005/11/15-[....] - Robustness with infinities // // Once the issue with Rect robustness with infinities is addressed we // should change the values below to make this rectangle truely extend // from -Infinite to +Infinity. // // Until then we use a Rect from -float.MaxValue to +float.MaxValue. // Because this rect is used only as a conservative bounding box for // ScreenSpaceLines3D this span should be sufficient for the following // reasons: // // 1. Our meshes and transforms are reprensented in single precision // at render time. If it's not in this range it will not be // rendered. // // 2. SSLines3Ds are constructed as simple quads at render time. // We will hit the guard band on the GPU at a limit far less than // +/- float.MaxValue. // // 3. We do our managed math in double precision so this still // leaves us ample space to account for transforms, etc. // Rect3D infinite = new Rect3D(); infinite._x = -float.MaxValue; infinite._y = -float.MaxValue; infinite._z = -float.MaxValue; infinite._sizeX = float.MaxValue*2.0; infinite._sizeY = float.MaxValue*2.0; infinite._sizeZ = float.MaxValue*2.0; return infinite; } #endregion Private Methods //----------------------------------------------------- // // Private Fields // //------------------------------------------------------ #region Private Fields private readonly static Rect3D s_empty = CreateEmptyRect3D(); #endregion Private Fields } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SqlTypeSystemProvider.cs
- RangeValuePattern.cs
- SystemException.cs
- CompilerState.cs
- InputScopeNameConverter.cs
- XmlCodeExporter.cs
- TextRangeEditTables.cs
- MethodRental.cs
- MaskInputRejectedEventArgs.cs
- XmlAttributeAttribute.cs
- CompilationLock.cs
- PropertyEmitterBase.cs
- SiteMapDataSourceDesigner.cs
- ActiveDocumentEvent.cs
- XmlSchemaComplexContentRestriction.cs
- CacheChildrenQuery.cs
- KeyValuePairs.cs
- WindowsRichEdit.cs
- WizardPanelChangingEventArgs.cs
- Int16KeyFrameCollection.cs
- CompileLiteralTextParser.cs
- ProxyWebPart.cs
- HitTestFilterBehavior.cs
- AssemblyName.cs
- ByteConverter.cs
- RequestCacheManager.cs
- LogLogRecordHeader.cs
- SchemaElement.cs
- HwndKeyboardInputProvider.cs
- MsmqTransportReceiveParameters.cs
- Int32Rect.cs
- MimeBasePart.cs
- SiblingIterators.cs
- StringAttributeCollection.cs
- DataGridRelationshipRow.cs
- GridViewEditEventArgs.cs
- _Rfc2616CacheValidators.cs
- BinaryUtilClasses.cs
- DataGridViewTextBoxColumn.cs
- OperandQuery.cs
- HMACSHA1.cs
- DataList.cs
- SimpleTypeResolver.cs
- KnowledgeBase.cs
- SerializationInfo.cs
- XmlFormatExtensionAttribute.cs
- OnOperation.cs
- CodeObjectCreateExpression.cs
- RayHitTestParameters.cs
- PointHitTestParameters.cs
- UnsafeNativeMethods.cs
- EmissiveMaterial.cs
- SafeBuffer.cs
- Attributes.cs
- xml.cs
- CodeVariableDeclarationStatement.cs
- AutomationPropertyInfo.cs
- BorderGapMaskConverter.cs
- RecordConverter.cs
- GridViewCommandEventArgs.cs
- safelinkcollection.cs
- Int16AnimationBase.cs
- FilterQueryOptionExpression.cs
- SystemTcpConnection.cs
- DbConnectionInternal.cs
- ExpandCollapseProviderWrapper.cs
- KnownAssemblyEntry.cs
- LambdaCompiler.Generated.cs
- LoadedOrUnloadedOperation.cs
- TreeNodeBinding.cs
- TypefaceCollection.cs
- DataFieldConverter.cs
- AmbientLight.cs
- ButtonBase.cs
- CLSCompliantAttribute.cs
- DocumentViewerHelper.cs
- PasswordBox.cs
- ThreadPool.cs
- TemplateColumn.cs
- System.Data_BID.cs
- SqlWebEventProvider.cs
- SessionParameter.cs
- HttpPostedFileBase.cs
- TextCharacters.cs
- ProfilePropertySettings.cs
- RenderData.cs
- DiscreteKeyFrames.cs
- printdlgexmarshaler.cs
- ValidationPropertyAttribute.cs
- Transform.cs
- updateconfighost.cs
- COM2ColorConverter.cs
- BindingSourceDesigner.cs
- WebBrowserDocumentCompletedEventHandler.cs
- JsonStringDataContract.cs
- GridLengthConverter.cs
- FontSource.cs
- Visitor.cs
- BitStream.cs
- CodeBlockBuilder.cs