C++判斷矩形相交的方法
本文實(shí)例講述了C++判斷矩形相交的方法。分享給大家供大家參考。具體如下:
已知2矩形原點(diǎn)和寬高,判斷2矩形相交,相交矩形
相交判斷原理:
假定矩形是用一對點(diǎn)表達(dá)的(minx, miny) (maxx, maxy),那么兩個矩形
rect1{(minx1, miny1)(maxx1, maxy1)}
rect2{(minx2, miny2)(maxx2, maxy2)}
相交的結(jié)果一定是個矩形,構(gòu)成這個相交矩形rect{(minx, miny) (maxx, maxy)}的點(diǎn)對坐標(biāo)是:
minx = max(minx1, minx2)
miny = max(miny1, miny2)
maxx = min(maxx1, maxx2)
maxy = min(maxy1, maxy2)
如果兩個矩形不相交,那么計(jì)算得到的點(diǎn)對坐標(biāo)必然滿足:
( minx > maxx ) 或者 ( miny > maxy )
判定是否相交,以及相交矩形是什么都可以用這個方法一體計(jì)算完成
設(shè)計(jì)3個類:
1. 點(diǎn)類:x,y
2. 矩形類:點(diǎn),寬,高
3. 判斷相交類
程序?qū)崿F(xiàn):
CPoint.h #import <Foundation/Foundation.h> @interface CPoint : NSObject { int x; //點(diǎn)坐標(biāo) int y; } -(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" @implementation CPoint -(void) print { NSLog(@"the point is (%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 { return x; } -(int) y { return y; } @end CRect.h #import <Foundation/Foundation.h> #import "CPoint.h" @interface CRect : NSObject { int w; //矩形長 int h; //矩形高 } -(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" @implementation CRect { CPoint *origin; //點(diǎn) } -(void) print { NSLog(@"the rect:(x:%i, y:%i, w:%i,h:%i)",origin.x, origin.y, w, h); } -(int) w { return w; } -(int) h { return h; } -(void) setW:(int)vw { w = vw; } -(void) setH:(int)vh { h = vh; } -(void) setWH:(int)vw :(int)vh { w = vw; h = vh; } -(CPoint *) origin { return origin; } -(void) setOrigin:(CPoint *)pt { origin = pt; } @end DoCRect.h #import <Foundation/Foundation.h> #import "CRect.h" @interface DoCRect : NSObject -(BOOL) isIntersect:(CRect *) rect1 :(CRect *) rect2; //矩形相交否 -(CRect *) intersectRect: (CRect *) rect1 :(CRect *) rect2; //相交矩形 @end DoCRect.m #import "DoCRect.h" @implementation DoCRect //矩形是否相交 -(BOOL) isIntersect:(CRect *)rect1 :(CRect *)rect2 { int minx = MAX(rect1.origin.x, rect2.origin.x); int miny = MAX(rect1.origin.y, rect2.origin.y); int maxx = MIN(rect1.origin.x+rect1.w, rect2.origin.x+rect2.w); int maxy = MIN(rect1.origin.y+rect1.h, rect2.origin.y+rect2.h); if (minx>maxx || miny>maxy) { return NO; } return YES; } -(CRect *) intersectRect:(CRect *)rect1 :(CRect *)rect2 { int minx = MAX(rect1.origin.x, rect2.origin.x); int miny = MAX(rect1.origin.y, rect2.origin.y); int maxx = MIN(rect1.origin.x+rect1.w, rect2.origin.x+rect2.w); int maxy = MIN(rect1.origin.y+rect1.h, rect2.origin.y+rect2.h); CRect * rect = [[CRect alloc] init]; CPoint *p = [[CPoint alloc] init]; if (NO == [self isIntersect:rect1 :rect2])//no isIntersect { [p setXY:minx :miny]; [rect setOrigin:p]; rect.w = 0; rect.h = 0; return rect; } [p setXY:minx :miny]; [rect setOrigin:p]; rect.w = ABS(maxx-minx); rect.h = ABS(maxy - miny); return rect; } @end main.m 測試 #import <Foundation/Foundation.h> #import "DoCRect.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello,判斷矩形相交,返回矩形的原點(diǎn)和長高"); //初始化對象 CRect *myrect1 = [[CRect alloc] init]; CRect *myrect2 = [[CRect alloc] init]; CPoint *p1 = [[CPoint alloc] init]; CPoint *p2 = [[CPoint alloc] init]; DoCRect *dorect = [[DoCRect alloc] init]; //原點(diǎn)變量 [p1 setXY:200 :420]; [p2 setXY:400 :300]; //設(shè)置矩形原點(diǎn) [myrect1 setOrigin:p1]; [myrect1 setWH:250 :75]; [myrect1 print]; [myrect2 setOrigin:p2]; [myrect2 setWH:100 :180]; [myrect2 print]; //判斷2矩形是否相交 BOOL insersect = [dorect isIntersect:myrect1 :myrect1]; NSLog(@" two rect is :%@",insersect?@"YES":@"NO"); //返回相交矩形 //CRect *inserectRect = [[CRect alloc] init]; CRect *inserectRect = [dorect intersectRect:myrect1 :myrect2]; [inserectRect print]; } return 0; }
希望本文所述對大家的C++程序設(shè)計(jì)有所幫助。
相關(guān)文章
C++語言實(shí)現(xiàn)線性表之?dāng)?shù)組實(shí)例
這篇文章主要介紹了C++語言實(shí)現(xiàn)線性表之?dāng)?shù)組,實(shí)例分析了C++實(shí)現(xiàn)數(shù)組形式線性表的原理與方法,需要的朋友可以參考下2015-04-04詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法
這篇文章主要介紹了詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09你真的理解C語言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù)
這篇文章主要介紹了你真的理解C語言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù),本篇將引入一個庫函數(shù)來實(shí)現(xiàn)我們希望的順序,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02Qt實(shí)現(xiàn)小功能之圓形進(jìn)度條的方法詳解
在Qt自帶的控件中,只有垂直進(jìn)度條、水平進(jìn)度條兩種。在平時做頁面開發(fā)時,有些時候會用到圓形進(jìn)度條,比如說:下載某個文件的下載進(jìn)度。本文就來實(shí)現(xiàn)一個圓形進(jìn)度條,需要的可以參考一下2022-10-10內(nèi)聯(lián)函數(shù)inline與宏定義深入解析
類的內(nèi)斂函數(shù)是一個真正的函數(shù)。使用內(nèi)聯(lián)函數(shù)inline可以完全取代表達(dá)式形式的宏定義2013-09-09