代码改变世界

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