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++程序设计有所帮助。