2013-01-01 78 views
1

快樂2013年目標C對象的方法

我有一點與2個矩形的交集方法的問題,但我有一個問題,它不會讓我提前在這個題目跳閘。

我正在使用4個對象,2個點和2個矩形。 Point1是矩形1的原點,而Point2是矩形2的原點。

然後我調用矩形1的相交方法併發送矩形2對象以查看是否存在交集。

這裏的問題是,在方法內部,兩個矩形的原點都是相同的座標,因此,如果我沒有不同的原點,我不會得到好的信息。

這裏是我的.h文件:

@interface XYPoint : NSObject 

@property int x,y; 

-(void) setX:(int)xVal andY: (int) yVal; 

@end 

@interface Rectangle: graphicObject 

@property float width, height; 

- (void) setWidth:(float)w andHeight: (float) h; 
- (void) setOrigin: (XYPoint *) pt; 
- (bool) containsPoint: (XYPoint *) aPoint; 
- (void) intersect: (Rectangle *) rect; 

@end 

這裏是我的.m文件:

@implementation XYPoint 

@synthesize x,y; 

-(void) setX:(int)xVal andY:(int)yVal; 
{ 
    x = xVal; 
    y = yVal; 
} 

@end 

@implementation Rectangle 

@synthesize width, height; 

XYPoint *origin; 

- (void) setWidth:(float) w andHeight: (float) h; 
{ 
    width = w; 
    height = h; 
} 
- (float) area 
{ 
    return width * height; 
} 
- (float) perimeter 
{ 
    return (2*width) + (2*height); 
} 
-(void) setOrigin: (XYPoint *) pt 
{ 
    if (! origin) 
    { 
     origin = [[XYPoint alloc]init]; 
    } 
    origin.x = pt.x; 
    origin.y = pt.y; 
} 

- (XYPoint *) origin 

{ 
    return origin; 
} 

-(void) intersect: (Rectangle *) rect // 
{ 
    int pointCount; 
    pointCount = 0; 

    /* R1o   R2o     R1F    R2F */ 
    /* origin.x  rect.origin.x  origin.x+w  rect.origin.x+w */ 


    if ( (origin.x <= rect.origin.x) && (rect.origin.x <= (origin.x + width)) ) 
     pointCount = pointCount +1; 
    NSLog(@"width = %g height = %g origin = (%d,%d)", width, height, origin.x, origin.y); 


    NSLog(@"rect.width = %g rect.height = %g rect.origin (%d,%d)", rect.width, rect.height, rect.origin.x, rect.origin.y); 

    if ( (rect.origin.x <= (origin.x + width)) && (origin.x + width <= rect.origin.x + rect.width)  ) 
     pointCount = pointCount + 1; 

    if ( (origin.y <= rect.origin.y) && (rect.origin.y <= (origin.y + height))) 
     pointCount = pointCount + 1; 

    if ( (rect.origin.y <= (origin.y + height) && (origin.y + height <= rect.origin.y + rect.height))) 
     pointCount = pointCount +1; 

    if (pointCount == 4) 
     NSLog (@"the rectangles intersect!"); 
    else 
     NSLog (@"The rectangles don't intersect."); 
} 

@end 

這是我的主要文件:

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     Rectangle * myRectangle1 = [[Rectangle alloc] init]; 


     XYPoint * myPoint1 = [[XYPoint alloc]init]; 
     [myPoint1 setX: 0 andY: 0]; 
     [myRectangle1 setWidth: 3 andHeight: 3]; 
     [myRectangle1 setOrigin : myPoint1]; 

     Rectangle * myRectangle2 = [[Rectangle alloc] init]; 
     XYPoint * myPoint2 = [[XYPoint alloc]init]; 
     [myPoint2 setX: 2 andY: 2]; 
     [myRectangle2 setWidth: 4 andHeight: 4]; 
     [myRectangle2 setOrigin : myPoint2]; 

     [myRectangle1 intersect: myRectangle2]; 

    } 
    return 0; 
} 

我最後一次跑它,我有這個:

width = 3 hei GH T = 3原點=(2,2)

rect.width = 4 rect.height = 4 rect.origin(2,2)

矩形相交!

請參閱?兩個矩形都有相同的原點,儘管它們的設置都不相同。

非常感謝!

+1

這只是一個智力練習,而且您故意不使用任何已經可用的幾何結構或函數? – jrturton

+0

jrTurton:是的,它只是一個智力的例子,我是一個試圖爲了好玩而自己學習Objective-C的新手!謝謝。 –

+0

然後玩得開心!祝你好運! – jrturton

回答

2

您目前有:

@implementation Rectangle 

@synthesize width, height; 

XYPoint *origin; 

這聲明origin全球變量,而不是一個實例變量;所以不是每個矩形都有一個變量,所有矩形共享一個變量。將這些行更改爲:

@implementation Rectangle 
{ 
    XYPoint *origin; 
} 

@synthesize width, height; 

這使得origin成爲一個實例變量。

[注意:較早的編譯器要求您在@interface中聲明實例變量,但使用當前的編譯器,您可以在@implementation中聲明它們。從設計的角度來看這更好。]

+0

CRD,非常感謝,它確實糾正了我的問題,我已經過了幾天。再次感謝! –

2

您在矩形類.m文件中將origin聲明爲文件級別的全局變量,這意味着每個Rectangle實例將爲origin使用相同的變量實例。您需要將其聲明爲.h文件內的接口中的成員變量。

更新爲@Chuck的更正。 (感謝)

+2

實際上,他將其聲明爲* global *變量。沒有靜態關鍵字。 – Chuck

+0

嗨查克,對不起,我是一個新手,我不得不閱讀CRD的答案,以瞭解你的,現在我明白了,非常感謝你的回答! –