国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++判斷矩形相交的方法

2020-01-26 15:02:38
字體:
來源:轉載
供稿:網友

本文實例講述了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>@interface CPoint : NSObject {  int x; //點坐標  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;}@endCRect.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;@endCRect.m#import "CRect.h"@implementation CRect{  CPoint *origin; //點}-(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;}@endDoCRect.h#import <Foundation/Foundation.h>#import "CRect.h"@interface DoCRect : NSObject-(BOOL) isIntersect:(CRect *) rect1 :(CRect *) rect2; //矩形相交否-(CRect *) intersectRect: (CRect *) rect1 :(CRect *) rect2; //相交矩形@endDoCRect.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; }@endmain.m 測試#import <Foundation/Foundation.h>#import "DoCRect.h"int main(int argc, const char * argv[]){  @autoreleasepool  {    NSLog(@"Hello,判斷矩形相交,返回矩形的原點和長高");    //初始化對象    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];    //原點變量    [p1 setXY:200 :420];    [p2 setXY:400 :300];    //設置矩形原點    [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++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石棉县| 乌恰县| 柳林县| 若尔盖县| 珲春市| 彰武县| 临沂市| 故城县| 瑞金市| 莱芜市| 磐石市| 丰顺县| 七台河市| 汾阳市| 色达县| 登封市| 崇信县| 济宁市| 邹城市| 米林县| 兴化市| 什邡市| 南昌市| 兴义市| 伊宁市| 昭平县| 松滋市| 双桥区| 年辖:市辖区| 天津市| 酉阳| 个旧市| 苍梧县| 襄樊市| 澎湖县| 公安县| 昭通市| 成都市| 龙南县| 镇江市| 梨树县|