You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							173 lines
						
					
					
						
							4.6 KiB
						
					
					
				
			
		
		
	
	
							173 lines
						
					
					
						
							4.6 KiB
						
					
					
				| //-----------------------------------------------------------------------
 | |
| // <copyright file="Vector2dBounds.cs" company="Mapbox">
 | |
| //     Copyright (c) 2016 Mapbox. All rights reserved.
 | |
| // </copyright>
 | |
| //-----------------------------------------------------------------------
 | |
| 
 | |
| namespace Mapbox.Utils
 | |
| {
 | |
| 	/// <summary> Represents a bounding box derived from a southwest corner and a northeast corner. </summary>
 | |
| 	public struct Vector2dBounds
 | |
| 	{
 | |
| 		/// <summary> Southwest corner of bounding box. </summary>
 | |
| 		public Vector2d SouthWest;
 | |
| 
 | |
| 		/// <summary> Northeast corner of bounding box. </summary>
 | |
| 		public Vector2d NorthEast;
 | |
| 
 | |
| 		/// <summary> Initializes a new instance of the <see cref="Vector2dBounds" /> struct. </summary>
 | |
| 		/// <param name="sw"> Geographic coordinate representing southwest corner of bounding box. </param>
 | |
| 		/// <param name="ne"> Geographic coordinate representing northeast corner of bounding box. </param>
 | |
| 		public Vector2dBounds(Vector2d sw, Vector2d ne)
 | |
| 		{
 | |
| 			this.SouthWest = sw;
 | |
| 			this.NorthEast = ne;
 | |
| 		}
 | |
| 
 | |
| 		/// <summary> Gets the south latitude. </summary>
 | |
| 		/// <value> The south latitude. </value>
 | |
| 		public double South {
 | |
| 			get {
 | |
| 				return this.SouthWest.x;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary> Gets the west longitude. </summary>
 | |
| 		/// <value> The west longitude. </value>
 | |
| 		public double West {
 | |
| 			get {
 | |
| 				return this.SouthWest.y;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary> Gets the north latitude. </summary>
 | |
| 		/// <value> The north latitude. </value>
 | |
| 		public double North {
 | |
| 			get {
 | |
| 				return this.NorthEast.x;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary> Gets the east longitude. </summary>
 | |
| 		/// <value> The east longitude. </value>
 | |
| 		public double East {
 | |
| 			get {
 | |
| 				return this.NorthEast.y;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		///     Gets or sets the central coordinate of the bounding box. When
 | |
| 		///     setting a new center, the bounding box will retain its original size.
 | |
| 		/// </summary>
 | |
| 		/// <value> The central coordinate. </value>
 | |
| 		public Vector2d Center {
 | |
| 			get {
 | |
| 				var lat = (this.SouthWest.x + this.NorthEast.x) / 2;
 | |
| 				var lng = (this.SouthWest.y + this.NorthEast.y) / 2;
 | |
| 
 | |
| 				return new Vector2d(lat, lng);
 | |
| 			}
 | |
| 
 | |
| 			set {
 | |
| 				var lat = (this.NorthEast.x - this.SouthWest.x) / 2;
 | |
| 				this.SouthWest.x = value.x - lat;
 | |
| 				this.NorthEast.x = value.x + lat;
 | |
| 
 | |
| 				var lng = (this.NorthEast.y - this.SouthWest.y) / 2;
 | |
| 				this.SouthWest.y = value.y - lng;
 | |
| 				this.NorthEast.y = value.y + lng;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		///     Creates a bound from two arbitrary points. Contrary to the constructor,
 | |
| 		///     this method always creates a non-empty box.
 | |
| 		/// </summary>
 | |
| 		/// <param name="a"> The first point. </param>
 | |
| 		/// <param name="b"> The second point. </param>
 | |
| 		/// <returns> The convex hull. </returns>
 | |
| 		public static Vector2dBounds FromCoordinates(Vector2d a, Vector2d b)
 | |
| 		{
 | |
| 			var bounds = new Vector2dBounds(a, a);
 | |
| 			bounds.Extend(b);
 | |
| 
 | |
| 			return bounds;
 | |
| 		}
 | |
| 
 | |
| 		/// <summary> A bounding box containing the world. </summary>
 | |
| 		/// <returns> The world bounding box. </returns>
 | |
| 		public static Vector2dBounds World()
 | |
| 		{
 | |
| 			var sw = new Vector2d(-90, -180);
 | |
| 			var ne = new Vector2d(90, 180);
 | |
| 
 | |
| 			return new Vector2dBounds(sw, ne);
 | |
| 		}
 | |
| 
 | |
| 		/// <summary> Extend the bounding box to contain the point. </summary>
 | |
| 		/// <param name="point"> A geographic coordinate. </param>
 | |
| 		public void Extend(Vector2d point)
 | |
| 		{
 | |
| 			if (point.x < this.SouthWest.x)
 | |
| 			{
 | |
| 				this.SouthWest.x = point.x;
 | |
| 			}
 | |
| 
 | |
| 			if (point.x > this.NorthEast.x)
 | |
| 			{
 | |
| 				this.NorthEast.x = point.x;
 | |
| 			}
 | |
| 
 | |
| 			if (point.y < this.SouthWest.y)
 | |
| 			{
 | |
| 				this.SouthWest.y = point.y;
 | |
| 			}
 | |
| 
 | |
| 			if (point.y > this.NorthEast.y)
 | |
| 			{
 | |
| 				this.NorthEast.y = point.y;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary> Extend the bounding box to contain the bounding box. </summary>
 | |
| 		/// <param name="bounds"> A bounding box. </param>
 | |
| 		public void Extend(Vector2dBounds bounds)
 | |
| 		{
 | |
| 			this.Extend(bounds.SouthWest);
 | |
| 			this.Extend(bounds.NorthEast);
 | |
| 		}
 | |
| 
 | |
| 		/// <summary> Whenever the geographic bounding box is empty. </summary>
 | |
| 		/// <returns> <c>true</c>, if empty, <c>false</c> otherwise. </returns>
 | |
| 		public bool IsEmpty()
 | |
| 		{
 | |
| 			return this.SouthWest.x > this.NorthEast.x ||
 | |
| 					   this.SouthWest.y > this.NorthEast.y;
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Converts to an array of doubles.
 | |
| 		/// </summary>
 | |
| 		/// <returns>An array of coordinates.</returns>
 | |
| 		public double[] ToArray()
 | |
| 		{
 | |
| 			double[] array =
 | |
| 			{
 | |
| 				this.SouthWest.x,
 | |
| 				this.SouthWest.y,
 | |
| 				this.NorthEast.x,
 | |
| 				this.NorthEast.y
 | |
| 			};
 | |
| 
 | |
| 			return array;
 | |
| 		}
 | |
| 
 | |
| 		/// <summary> Converts the Bbox to a URL snippet. </summary>
 | |
| 		/// <returns> Returns a string for use in a Mapbox query URL. </returns>
 | |
| 		public override string ToString()
 | |
| 		{
 | |
| 			return string.Format("{0},{1}", this.SouthWest.ToString(), this.NorthEast.ToString());
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 |