C++判斷矩形相交的方法
本文實(shí)例講述了C++判斷矩形相交的方法。分享給大家供大家參考。具體如下:
已知2矩形原點(diǎn)和寬高,判斷2矩形相交,相交矩形
相交判斷原理:
假定矩形是用一對(duì)點(diǎn)表達(dá)的(minx, miny) (maxx, maxy),那么兩個(gè)矩形
rect1{(minx1, miny1)(maxx1, maxy1)}
rect2{(minx2, miny2)(maxx2, maxy2)}
相交的結(jié)果一定是個(gè)矩形,構(gòu)成這個(gè)相交矩形rect{(minx, miny) (maxx, maxy)}的點(diǎn)對(duì)坐標(biāo)是:
minx = max(minx1, minx2)
miny = max(miny1, miny2)
maxx = min(maxx1, maxx2)
maxy = min(maxy1, maxy2)
如果兩個(gè)矩形不相交,那么計(jì)算得到的點(diǎn)對(duì)坐標(biāo)必然滿足:
( minx > maxx ) 或者 ( miny > maxy )
判定是否相交,以及相交矩形是什么都可以用這個(gè)方法一體計(jì)算完成
設(shè)計(jì)3個(gè)類(lèi):
1. 點(diǎn)類(lèi):x,y
2. 矩形類(lèi):點(diǎn),寬,高
3. 判斷相交類(lèi)
程序?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; //矩形長(zhǎng) 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 測(cè)試 #import <Foundation/Foundation.h> #import "DoCRect.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello,判斷矩形相交,返回矩形的原點(diǎn)和長(zhǎng)高"); //初始化對(duì)象 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; }
希望本文所述對(duì)大家的C++程序設(shè)計(jì)有所幫助。
上一篇:C語(yǔ)言打印華氏-攝氏溫度對(duì)照表的方法
欄 目:C語(yǔ)言
下一篇:C語(yǔ)言統(tǒng)計(jì)字符個(gè)數(shù)代碼分享
本文標(biāo)題:C++判斷矩形相交的方法
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2991.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10如何判斷一個(gè)數(shù)是否為2的冪次方?若是,并判斷出來(lái)是多少次方
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10如何判斷一個(gè)數(shù)是否為4的冪次方?若是,并判斷出來(lái)是多少次方
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類(lèi)算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什