C++判断矩形相交的方法
本文实例讲述了C++判断矩形相交的方法。分享给大家供大家参考。具体如下:
已知2矩形原点和宽高,判断2矩形相交,相交矩形
相交判断原理:
假定矩形是用一对点表达的(minx,miny)(maxx,maxy),那么两个矩形
rect1{(minx1,miny1)(maxx1,maxy1)}
rect2{(minx2,miny2)(maxx2,maxy2)}
相交的结果一定是个矩形,构成这个相交矩形rect{(minx,miny)(maxx,maxy)}的点对坐标是:
minx = max(minx1, minx2)
miny = max(miny1, miny2)
maxx = min(maxx1, maxx2)
maxy = min(maxy1, maxy2)
如果两个矩形不相交,那么计算得到的点对坐标必然满足:
(minx > maxx)或者(miny > maxy)
判定是否相交,以及相交矩形是什么都可以用这个方法一体计算完成
设计3个类:
1.点类:x,y
2.矩形类:点,宽,高
3.判断相交类
程序实现:
CPoint.h #import<Foundation/Foundation.h> @interfaceCPoint:NSObject { intx;//点坐标 inty; } -(void)print; -(void)setX:(int)vx; -(void)setY:(int)vy; -(void)setXY:(int)vx:(int)vy; -(int)x; -(int)y; @end CPoint.m #import"CPoint.h" @implementationCPoint -(void)print { NSLog(@"thepointis(%i,%i)",x,y); } -(void)setX:(int)vx { x=vx; } -(void)setY:(int)vy { y=vy; } -(void)setXY:(int)vx:(int)vy { x=vx; y=vy; } -(int)x { returnx; } -(int)y { returny; } @end CRect.h #import<Foundation/Foundation.h> #import"CPoint.h" @interfaceCRect:NSObject { intw;//矩形长 inth;//矩形高 } -(void)print; -(int)w; -(int)h; -(void)setW:(int)vw; -(void)setH:(int)vh; -(void)setWH:(int)vw:(int)vh; -(CPoint*)origin; -(void)setOrigin:(CPoint*)pt; @end CRect.m #import"CRect.h" @implementationCRect { CPoint*origin;//点 } -(void)print { NSLog(@"therect:(x:%i,y:%i,w:%i,h:%i)",origin.x,origin.y,w,h); } -(int)w { returnw; } -(int)h { returnh; } -(void)setW:(int)vw { w=vw; } -(void)setH:(int)vh { h=vh; } -(void)setWH:(int)vw:(int)vh { w=vw; h=vh; } -(CPoint*)origin { returnorigin; } -(void)setOrigin:(CPoint*)pt { origin=pt; } @end DoCRect.h #import<Foundation/Foundation.h> #import"CRect.h" @interfaceDoCRect:NSObject -(BOOL)isIntersect:(CRect*)rect1:(CRect*)rect2;//矩形相交否 -(CRect*)intersectRect:(CRect*)rect1:(CRect*)rect2;//相交矩形 @end DoCRect.m #import"DoCRect.h" @implementationDoCRect //矩形是否相交 -(BOOL)isIntersect:(CRect*)rect1:(CRect*)rect2 { intminx=MAX(rect1.origin.x,rect2.origin.x); intminy=MAX(rect1.origin.y,rect2.origin.y); intmaxx=MIN(rect1.origin.x+rect1.w,rect2.origin.x+rect2.w); intmaxy=MIN(rect1.origin.y+rect1.h,rect2.origin.y+rect2.h); if(minx>maxx||miny>maxy) { returnNO; } returnYES; } -(CRect*)intersectRect:(CRect*)rect1:(CRect*)rect2 { intminx=MAX(rect1.origin.x,rect2.origin.x); intminy=MAX(rect1.origin.y,rect2.origin.y); intmaxx=MIN(rect1.origin.x+rect1.w,rect2.origin.x+rect2.w); intmaxy=MIN(rect1.origin.y+rect1.h,rect2.origin.y+rect2.h); CRect*rect=[[CRectalloc]init]; CPoint*p=[[CPointalloc]init]; if(NO==[selfisIntersect:rect1:rect2])//noisIntersect { [psetXY:minx:miny]; [rectsetOrigin:p]; rect.w=0; rect.h=0; returnrect; } [psetXY:minx:miny]; [rectsetOrigin:p]; rect.w=ABS(maxx-minx); rect.h=ABS(maxy-miny); returnrect; } @end main.m测试 #import<Foundation/Foundation.h> #import"DoCRect.h" intmain(intargc,constchar*argv[]) { @autoreleasepool { NSLog(@"Hello,判断矩形相交,返回矩形的原点和长高"); //初始化对象 CRect*myrect1=[[CRectalloc]init]; CRect*myrect2=[[CRectalloc]init]; CPoint*p1=[[CPointalloc]init]; CPoint*p2=[[CPointalloc]init]; DoCRect*dorect=[[DoCRectalloc]init]; //原点变量 [p1setXY:200:420]; [p2setXY:400:300]; //设置矩形原点 [myrect1setOrigin:p1]; [myrect1setWH:250:75]; [myrect1print]; [myrect2setOrigin:p2]; [myrect2setWH:100:180]; [myrect2print]; //判断2矩形是否相交 BOOLinsersect=[dorectisIntersect:myrect1:myrect1]; NSLog(@"tworectis:%@",insersect?@"YES":@"NO"); //返回相交矩形 //CRect*inserectRect=[[CRectalloc]init]; CRect*inserectRect=[dorectintersectRect:myrect1:myrect2]; [inserectRectprint]; } return0; }
希望本文所述对大家的C++程序设计有所帮助。