Cross posting from [Stack Overflow][1] (not sure how to more correctly cross-post).


This started simple, as most things do...
I just wanted a little structure to hold polar coordinates for a totally minor class...
But starting with [the second answer][2] and borrowing from existing Objective-C concepts like CGPoint and CGSize, the simple struct quickly morphed into a more complete solution.

I have this all in a _polar.h file that I have included in my files and I was wondering what other things should be included and/or other criticism of my technique.

Am I approaching this thing correctly?

(note: startPoint and endPoint are part of the structure to help solve other problems in my class and are not necessarily "normal" parts of a polar structure)


    #ifndef Polar__polar_h
    #define Polar__polar_h
    
	struct _Polar {
		CGFloat angle;
		CGFloat r;
		CGPoint startPoint;
		CGPoint endPoint;
	};
	typedef struct _Polar Polar;

	static inline Polar
	PolarMakeFromPoints(CGPoint startPoint, CGPoint endPoint) {
		Polar polar;
		polar.startPoint =startPoint;
		polar.endPoint =endPoint;
		polar.angle =atan2f(endPoint.y -startPoint.y, endPoint.x -startPoint.x);
		polar.r =sqrtf(powf(endPoint.x -startPoint.x, 2.0) + pow(endPoint.y -startPoint.y, 2.0));
		return polar;
	}
	static inline Polar
	PolarMake(CGFloat angle, CGFloat r) {
		Polar polar;
		polar.angle =angle;
		polar.r =r;
		polar.startPoint =CGPointZero;
		polar.endPoint =CGPointMake((cos(angle) *r), (sin(angle) *r));
		return polar;
	}
	static inline bool
	PolarEqualToPolar(Polar polar1, Polar polar2) {
		return polar1.angle ==polar2.angle && polar1.r ==polar2.r;
	}
	static inline bool
	PolarIdenticalToPolar(Polar polar1, Polar polar2) {
		return CGPointEqualToPoint(polar1.startPoint, polar2.startPoint)
			&& CGPointEqualToPoint(polar1.endPoint, polar2.endPoint);
	}
	
	static inline Polar
	_PolarZero() {
		Polar polar;
		polar.angle =0.0;
		polar.r =0.0;
		polar.startPoint =CGPointZero;
		polar.endPoint =CGPointZero;
		return polar;
	}
	#define PolarZero _PolarZero()

	static inline NSString
	*NSStringFromPolar(Polar polar) {
		return [NSString stringWithFormat:@"a=%f r=%f", polar.angle, polar.r];
	}


    // Extend NSValue to work with Polar
	@interface NSValue (Polar)
	+(id)valueWithPolar:(Polar)polar;
	-(Polar)polarValue;
	@end
	@implementation NSValue (Polar)
	+(id)valueWithPolar:(Polar)polar {
		return [NSValue value:&polar withObjCType:@encode(Polar)];
	}
	-(Polar)polarValue {
		Polar polar;
		[self getValue:&polar];
		return polar;
	}
	@end


	@interface NSString (Polar)
	@end
	@implementation NSString (Polar)

	@end
    
    #endif


  [1]: https://stackoverflow.com/questions/15745964/objective-c-polar-helper
  [2]: https://stackoverflow.com/questions/5691881/how-to-wrap-a-struct-into-nsobject