1 /*
2  *  This file is part of the "GKMap".
3  *  GKMap project borrowed from GMap.NET (by radioman).
4  *
5  *  Copyright (C) 2009-2018 by radioman (email@radioman.lt).
6  *  This program is licensed under the FLAT EARTH License.
7  */
8 
9 using System.Globalization;
10 
11 namespace GKMap
12 {
13     /// <summary>
14     /// the rect of coordinates
15     /// </summary>
16     public struct RectLatLng
17     {
18         public static readonly RectLatLng Empty = new RectLatLng();
19 
20 
21         private double fLng;
22         private double fLat;
23         private double fWidthLng;
24         private double fHeightLat;
25         private bool fNotEmpty;
26 
27 
28         public PointLatLng LocationTopLeft
29         {
30             get {
31                 return new PointLatLng(fLat, fLng);
32             }
33             set {
34                 fLng = value.Lng;
35                 fLat = value.Lat;
36             }
37         }
38 
39         public PointLatLng LocationRightBottom
40         {
41             get {
42                 PointLatLng ret = new PointLatLng(Lat, Lng);
43                 ret.Offset(HeightLat, WidthLng);
44                 return ret;
45             }
46         }
47 
48         public SizeLatLng Size
49         {
50             get {
51                 return new SizeLatLng(fHeightLat, fWidthLng);
52             }
53             set {
54                 fWidthLng = value.WidthLng;
55                 fHeightLat = value.HeightLat;
56             }
57         }
58 
59         public double Lng
60         {
61             get {
62                 return fLng;
63             }
64             set {
65                 fLng = value;
66             }
67         }
68 
69         public double Lat
70         {
71             get {
72                 return fLat;
73             }
74             set {
75                 fLat = value;
76             }
77         }
78 
79         public double WidthLng
80         {
81             get {
82                 return fWidthLng;
83             }
84             set {
85                 fWidthLng = value;
86             }
87         }
88 
89         public double HeightLat
90         {
91             get {
92                 return fHeightLat;
93             }
94             set {
95                 fHeightLat = value;
96             }
97         }
98 
99         /// <summary>
100         /// returns true if coordinates wasn't assigned
101         /// </summary>
102         public bool IsEmpty
103         {
104             get {
105                 return !fNotEmpty;
106             }
107         }
108 
RectLatLngGKMap.RectLatLng109         public RectLatLng(double lat, double lng, double widthLng, double heightLat)
110         {
111             fLng = lng;
112             fLat = lat;
113             fWidthLng = widthLng;
114             fHeightLat = heightLat;
115             fNotEmpty = true;
116         }
117 
FromLTRBGKMap.RectLatLng118         public static RectLatLng FromLTRB(double leftLng, double topLat, double rightLng, double bottomLat)
119         {
120             return new RectLatLng(topLat, leftLng, rightLng - leftLng, topLat - bottomLat);
121         }
122 
EqualsGKMap.RectLatLng123         public override bool Equals(object obj)
124         {
125             if (!(obj is RectLatLng)) {
126                 return false;
127             }
128             RectLatLng ef = (RectLatLng)obj;
129             return ((((ef.Lng == Lng) && (ef.Lat == Lat)) && (ef.WidthLng == WidthLng)) && (ef.HeightLat == HeightLat));
130         }
131 
operator ==GKMap.RectLatLng132         public static bool operator ==(RectLatLng left, RectLatLng right)
133         {
134             return ((((left.Lng == right.Lng) && (left.Lat == right.Lat)) && (left.WidthLng == right.WidthLng)) && (left.HeightLat == right.HeightLat));
135         }
136 
operator !=GKMap.RectLatLng137         public static bool operator !=(RectLatLng left, RectLatLng right)
138         {
139             return !(left == right);
140         }
141 
ContainsGKMap.RectLatLng142         public bool Contains(double lat, double lng)
143         {
144             return ((((Lng <= lng) && (lng < (Lng + WidthLng))) && (Lat >= lat)) && (lat > (Lat - HeightLat)));
145         }
146 
ContainsGKMap.RectLatLng147         public bool Contains(PointLatLng pt)
148         {
149             return Contains(pt.Lat, pt.Lng);
150         }
151 
GetHashCodeGKMap.RectLatLng152         public override int GetHashCode()
153         {
154             if (IsEmpty) {
155                 return 0;
156             }
157             return (((Lng.GetHashCode() ^ Lat.GetHashCode()) ^ WidthLng.GetHashCode()) ^ HeightLat.GetHashCode());
158         }
159 
ToStringGKMap.RectLatLng160         public override string ToString()
161         {
162             return ("{Lat=" + Lat.ToString(CultureInfo.CurrentCulture) + ",Lng=" + Lng.ToString(CultureInfo.CurrentCulture) + ",WidthLng=" + WidthLng.ToString(CultureInfo.CurrentCulture) + ",HeightLat=" + HeightLat.ToString(CultureInfo.CurrentCulture) + "}");
163         }
164     }
165 }
166