summaryrefslogtreecommitdiff
path: root/platform/darwin/include/MGLGeometry.h
diff options
context:
space:
mode:
Diffstat (limited to 'platform/darwin/include/MGLGeometry.h')
-rw-r--r--platform/darwin/include/MGLGeometry.h98
1 files changed, 98 insertions, 0 deletions
diff --git a/platform/darwin/include/MGLGeometry.h b/platform/darwin/include/MGLGeometry.h
new file mode 100644
index 0000000000..8cb1da10fc
--- /dev/null
+++ b/platform/darwin/include/MGLGeometry.h
@@ -0,0 +1,98 @@
+#import <Foundation/Foundation.h>
+#import <CoreLocation/CoreLocation.h>
+#import <CoreGraphics/CGBase.h>
+
+#import "MGLTypes.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** Defines the area spanned by an `MGLCoordinateBounds`. */
+typedef struct MGLCoordinateSpan {
+ /** Latitudes spanned by an `MGLCoordinateBounds`. */
+ CLLocationDegrees latitudeDelta;
+ /** Longitudes spanned by an `MGLCoordinateBounds`. */
+ CLLocationDegrees longitudeDelta;
+} MGLCoordinateSpan;
+
+/** Creates a new `MGLCoordinateSpan` from the given latitudinal and longitudinal deltas. */
+NS_INLINE MGLCoordinateSpan MGLCoordinateSpanMake(CLLocationDegrees latitudeDelta, CLLocationDegrees longitudeDelta) {
+ MGLCoordinateSpan span;
+ span.latitudeDelta = latitudeDelta;
+ span.longitudeDelta = longitudeDelta;
+ return span;
+}
+
+/** Returns `YES` if the two coordinate spans represent the same latitudinal change and the same longitudinal change. */
+NS_INLINE BOOL MGLCoordinateSpanEqualToCoordinateSpan(MGLCoordinateSpan span1, MGLCoordinateSpan span2) {
+ return (span1.latitudeDelta == span2.latitudeDelta &&
+ span1.longitudeDelta == span2.longitudeDelta);
+}
+
+/** An area of zero width and zero height. */
+extern const MGLCoordinateSpan MGLCoordinateSpanZero;
+
+/** A rectangular area as measured on a two-dimensional map projection. */
+typedef struct MGLCoordinateBounds {
+ /** Coordinate at the southwest corner. */
+ CLLocationCoordinate2D sw;
+ /** Coordinate at the northeast corner. */
+ CLLocationCoordinate2D ne;
+} MGLCoordinateBounds;
+
+/** Creates a new `MGLCoordinateBounds` structure from the given southwest and northeast coordinates. */
+NS_INLINE MGLCoordinateBounds MGLCoordinateBoundsMake(CLLocationCoordinate2D sw, CLLocationCoordinate2D ne) {
+ MGLCoordinateBounds bounds;
+ bounds.sw = sw;
+ bounds.ne = ne;
+ return bounds;
+}
+
+/** Returns `YES` if the two coordinate bounds are equal to each other. */
+NS_INLINE BOOL MGLCoordinateBoundsEqualToCoordinateBounds(MGLCoordinateBounds bounds1, MGLCoordinateBounds bounds2) {
+ return (bounds1.sw.latitude == bounds2.sw.latitude &&
+ bounds1.sw.longitude == bounds2.sw.longitude &&
+ bounds1.ne.latitude == bounds2.ne.latitude &&
+ bounds1.ne.longitude == bounds2.ne.longitude);
+}
+
+/** Returns the area spanned by the coordinate bounds. */
+NS_INLINE MGLCoordinateSpan MGLCoordinateBoundsGetCoordinateSpan(MGLCoordinateBounds bounds) {
+ return MGLCoordinateSpanMake(bounds.ne.latitude - bounds.sw.latitude,
+ bounds.ne.longitude - bounds.sw.longitude);
+}
+
+/** Returns a coordinate bounds with southwest and northeast coordinates that are offset from those of the source bounds. */
+NS_INLINE MGLCoordinateBounds MGLCoordinateBoundsOffset(MGLCoordinateBounds bounds, MGLCoordinateSpan offset) {
+ MGLCoordinateBounds offsetBounds = bounds;
+ offsetBounds.sw.latitude += offset.latitudeDelta;
+ offsetBounds.sw.longitude += offset.longitudeDelta;
+ offsetBounds.ne.latitude += offset.latitudeDelta;
+ offsetBounds.ne.longitude += offset.longitudeDelta;
+ return offsetBounds;
+}
+
+/** Returns `YES` if the coordinate bounds covers no area.
+ Note that a bounds may be empty but have a non-zero coordinate span (e.g., when its northeast point lies due north of its southwest point). */
+NS_INLINE BOOL MGLCoordinateBoundsIsEmpty(MGLCoordinateBounds bounds) {
+ MGLCoordinateSpan span = MGLCoordinateBoundsGetCoordinateSpan(bounds);
+ return span.latitudeDelta == 0 || span.longitudeDelta == 0;
+}
+
+/** Returns a formatted string for the given coordinate bounds. */
+NS_INLINE NSString *MGLStringFromCoordinateBounds(MGLCoordinateBounds bounds) {
+ return [NSString stringWithFormat:@"{{%.1f, %.1f}, {%.1f, %.1f}}",
+ bounds.sw.latitude, bounds.sw.longitude,
+ bounds.ne.latitude, bounds.ne.longitude];
+}
+
+/** Returns radians, converted from degrees. */
+NS_INLINE CGFloat MGLRadiansFromDegrees(CLLocationDegrees degrees) {
+ return (CGFloat)(degrees * M_PI) / 180;
+}
+
+/** Returns degrees, converted from radians. */
+NS_INLINE CLLocationDegrees MGLDegreesFromRadians(CGFloat radians) {
+ return radians * 180 / M_PI;
+}
+
+NS_ASSUME_NONNULL_END