Files
MapLibreParticleLab/platform/darwin/include/MGLGeometry.h
Minh Nguyễn a852ee24fb [ios, osx] Geometry value methods
Added category methods on NSValue for converting to and from the structure types defined in MGLGeometry.h.

Fixes #4485.
2016-04-22 11:13:02 -07:00

148 lines
5.5 KiB
Objective-C

#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:@"{ sw = {%.1f, %.1f}, ne = {%.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;
}
/**
Methods for round-tripping Mapbox geometry structure values.
*/
@interface NSValue (MGLGeometryAdditions)
/**
Creates a new value object containing the specified Core Location geographic
coordinate structure.
@param coordinate The value for the new object.
@return A new value object that contains the geographic coordinate information.
*/
+ (instancetype)valueWithMGLCoordinate:(CLLocationCoordinate2D)coordinate;
/**
The Core Location geographic coordinate structure representation of the value.
*/
@property (readonly) CLLocationCoordinate2D MGLCoordinateValue;
/**
Creates a new value object containing the specified Mapbox coordinate span
structure.
@param span The value for the new object.
@return A new value object that contains the coordinate span information.
*/
+ (instancetype)valueWithMGLCoordinateSpan:(MGLCoordinateSpan)span;
/**
The Mapbox coordinate span structure representation of the value.
*/
@property (readonly) MGLCoordinateSpan MGLCoordinateSpanValue;
/**
Creates a new value object containing the specified Mapbox coordinate bounds
structure.
@param bounds The value for the new object.
@return A new value object that contains the coordinate bounds information.
*/
+ (instancetype)valueWithMGLCoordinateBounds:(MGLCoordinateBounds)bounds;
/**
The Mapbox coordinate bounds structure representation of the value.
*/
@property (readonly) MGLCoordinateBounds MGLCoordinateBoundsValue;
@end
NS_ASSUME_NONNULL_END