Objective-C 矩形相交程序
2013-11-23 09:27 EraNi 阅读(296) 评论(0) 收藏 举报#import <Foundation/Foundation.h> #import "XYPoint.h" #import "GraphicObject.h" @interface Rectangle : GraphicObject @property int width,height; -(XYPoint *)origin; -(void) setOrigin:(XYPoint *)pt; -(int) area; -(int) perimeter; -(void)setWidth:(int)w andHeight:(int)h; -(BOOL)containsPoint:(XYPoint *)pt; -(Rectangle *)interact:(Rectangle *)rec; -(int)Max:(int)a :(int)b; -(int)Min:(int)a :(int)b; -(int)LabelArea:(XYPoint *)pt; @end #import "Rectangle.h" #import "XYPoint.h" @implementation Rectangle{ XYPoint *origin; } @synthesize width,height; -(void)setWidth:(int)w andHeight:(int)h { width=w; height=h; } -(int) area{ return width*height; } -(int) perimeter{ return (width+height)*2; } -(void)setOrigin:(XYPoint *)pt{ if(!origin){ origin=[[XYPoint alloc]init]; origin.x=pt.x; origin.y=pt.y; } origin=pt; } -(XYPoint *)origin{ return origin; } -(BOOL)containsPoint:(XYPoint *)pt{ //包含正好在边上 if(pt.x>=origin.x){ if(pt.x<=(origin.x+width)){ if(pt.y>=origin.y){ if(pt.y<=(origin.y+height)) return YES; } } } return NO; } -(int)Max:(int)a :(int)b{ return (a>b)?a:b; } -(int)Min:(int)a :(int)b{ return (a<b)?a:b; } //用来标记传入点所在矩形的那个范围区域内 -(int)LabelArea:(XYPoint *)pt{ if((pt.x<=origin.x)&&(pt.y>=origin.y+height)){ return 0; } else if((pt.x>=origin.x)&&(pt.y>=origin.y+height)&&(pt.x<=origin.x+width)){ return 1; } else if((pt.x>=origin.x+width)&&(pt.y>=origin.y+height)){ return 2; } else if((pt.x<=origin.x)&&(pt.y>=origin.y)&&(pt.y<=origin.y+height)){ return 3; } else if((pt.x>=origin.x+width)&&(pt.y>=origin.y)&&(pt.y<=origin.y+height)){ return 4; } else if((pt.x<=origin.x)&&(pt.y<=origin.y)){ return 5; } else if((pt.x>=origin.x)&&(pt.y<=origin.y)&&(pt.x<=origin.x+width)){ return 6; } else return 7; } -(Rectangle *)interact:(Rectangle *)rec{ XYPoint *resultPt=[[XYPoint alloc]init]; Rectangle *resultRect=[[Rectangle alloc]init]; [resultPt setX:0 andY:0]; [resultRect setOrigin:resultPt]; [resultRect setWidth:0 andHeight:0]; XYPoint *secondLeftDown=[[XYPoint alloc]init]; [secondLeftDown setX:rec.origin.x andY:rec.origin.y]; XYPoint *secondRightUp=[[XYPoint alloc]init]; [secondRightUp setX:rec.origin.x+rec.width andY:rec.origin.y+rec.height]; //第二个矩形的左下角点不在第一个矩形内 if(![self containsPoint:secondLeftDown]){ int leftDownCor=[self LabelArea:secondLeftDown]; int rightUpCor=[self LabelArea:secondRightUp]; switch (leftDownCor) { case 0: //这种情况下两个矩形肯定不相交 break; case 1: //这种情况下两个矩形肯定不相交 break; case 2: //这种情况下两个矩形肯定不相交 break; case 3: if(rightUpCor==0){ //这种情况下两个矩形肯定不相交 } else if(rightUpCor==1){ [resultPt setX:origin.x andY:rec.origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:rec.origin.x+rec.width-origin.x andHeight:origin.y+height-rec.origin.y]; //可能将宽或高置为了0 } else if(rightUpCor==2){ [resultPt setX:origin.x andY:rec.origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:width andHeight:origin.y+height-rec.origin.y]; //可能将宽或高置为了0 } else if(rightUpCor==4){ [resultPt setX:origin.x andY:rec.origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:width andHeight:rec.height]; } else{ //这种情况下另一个矩形的右上角点在第一个矩形内 [resultPt setX:origin.x andY:rec.origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:rec.origin.x+rec.width-origin.x andHeight:rec.height]; } break; case 4: //这种情况下两个矩形肯定不相交 break; case 5: if(rightUpCor==0){ //这种情况下两个矩形肯定不相交 } else if(rightUpCor==1){ [resultPt setX:origin.x andY:origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:rec.origin.x+rec.width-origin.x andHeight:height]; } else if(rightUpCor==2){ [resultPt setX:origin.x andY:origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:width andHeight:height]; } else if(rightUpCor==3){ //这种情况下两个矩形肯定不相交 } else if(rightUpCor==4){ [resultPt setX:origin.x andY:origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:width andHeight:rec.origin.y+rec.height-origin.y]; } else if(rightUpCor==5||rightUpCor==6||rightUpCor==7){ //这种情况下两个矩形肯定不相交 } else{ //这种情况下另一个矩形的右上角点在第一个矩形内 [resultPt setX:origin.x andY:origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:rec.origin.x+rec.width-origin.x andHeight:rec.origin.y+rec.height-origin.y]; } break; case 6: if(rightUpCor==1){ [resultPt setX:rec.origin.x andY:origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:rec.width andHeight:height]; } else if(rightUpCor==2){ [resultPt setX:rec.origin.x andY:origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:origin.x+width-rec.origin.x andHeight:height]; } else if(rightUpCor==4){ [resultPt setX:rec.origin.x andY:origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:origin.x+width-rec.origin.x andHeight:rec.origin.y+rec.height-origin.y]; } else if(rightUpCor==6||rightUpCor==7){ //这种情况下两个矩形肯定不相交 } else{ //这种情况下另一个矩形的右上角点在第一个矩形内 [resultPt setX:rec.origin.x andY:origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:rec.width andHeight:rec.origin.y+rec.height-origin.y]; } break; case 7: //这种情况下两个矩形肯定不相交 break; default: break; } } ////////////////////////////////////////// else { //第二个矩形的左下角点在第一个矩形内 int rightUpCor=[self LabelArea:secondRightUp]; switch (rightUpCor) { case 1: [resultPt setX:rec.origin.x andY:rec.origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:rec.width andHeight:rec.origin.y+height-rec.origin.y]; break; case 2: [resultPt setX:rec.origin.x andY:rec.origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:origin.x+width-rec.origin.x andHeight:origin.y+height-rec.origin.y]; break; case 4: [resultPt setX:rec.origin.x andY:rec.origin.y]; [resultRect setOrigin:resultPt]; [resultRect setWidth:origin.x+width-rec.origin.x andHeight:rec.height]; break; default: break; } } if(resultRect.width==0||resultRect.height==0){ [resultPt setX:0 andY:0]; [resultRect setOrigin:resultPt]; [resultRect setWidth:0 andHeight:0]; } return resultRect; } @end
这个程序写得比较繁琐了,我的主要想法是在确定一个矩形之后,把整个平面划分区域,然后判断另一个矩形的点在哪个区域内进而判断两个矩形的关系。
最近在学objective-C,这是一道练习题