#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,这是一道练习题