#import <Foundation/Foundation.h> #import "cocos2d.h" @interface MTQuadrilateral : CCNode { //左下角 CGPoint point_lb; //左上角 CGPoint point_lt; //右上角 CGPoint point_rt; //右下角 CGPoint point_rb; } @property CGPoint point_lb; @property CGPoint point_lt; @property CGPoint point_rt; @property CGPoint point_rb; -(id) initWithPointLB:(CGPoint) lb LT:(CGPoint) lt RT:(CGPoint) rt RB:(CGPoint) rb; -(BOOL) containsPoint:(CGPoint) point; @end
#import "MTQuadrilateral.h" @implementation MTQuadrilateral @synthesize point_lb; @synthesize point_lt; @synthesize point_rt; @synthesize point_rb; -(id) initWithPointLB:(CGPoint) lb LT:(CGPoint) lt RT:(CGPoint) rt RB:(CGPoint) rb { if(!(self = [super init])) return self; self.point_lb = lb; self.point_lt = lt; self.point_rt = rt; self.point_rb = rb; return self; } /************************************************************************** ********************* B(lt) C(rt) ************************** ********************* -------------- ******************************* ********************* / O / ******************************* ********************* / * / ******************************* ********************* / / ******************************* ********************* ------ ******************************* ********************* A(lb) D(rb) ******************************* *************************************************************************/ -(BOOL) containsPoint:(CGPoint) point { float ab = *****Distance(point_lb, point_lt); float bc = *****Distance(point_lt, point_rt); float cd = *****Distance(point_rt, point_rb); float da = *****Distance(point_rb, point_lb); float oa = *****Distance(point, point_lb); float ob = *****Distance(point, point_lt); float oc = *****Distance(point, point_rt); float od = *****Distance(point, point_rb); float cos_AOB = (oa * oa + ob * ob - ab * ab) / (2 * oa * ob); float cos_BOC = (ob * ob + oc * oc - bc * bc) / (2 * ob * oc); float cos_COD = (oc * oc + od * od - cd * cd) / (2 * oc * od); float cos_DOA = (od * od + oa * oa - da * da) / (2 * oa * od); float AOB = acosf(cos_AOB); float BOC = acosf(cos_BOC); float COD = acosf(cos_COD); float DOA = acosf(cos_DOA); if(fabsf(AOB + BOC + COD + DOA - M_PI * 2) < 0.01f) return YES; return NO; } @end