0

私はプログラミングとObjective-cに不慣れであり(したがって、ここから離れることができます)、Objective C第4版の教科書でプログラミングを進めており、演習の1つに固執しています。

以下の方法の何が問題になっているのか誰かに教えてもらえますか?私のプログラムには、幅、高さ、および原点(XYPointと呼ばれるクラスから)を設定するメソッドを持つ長方形クラスがあります。

containsPointメソッドは、長方形の原点が別の長方形内にあるかどうかを確認します。このメソッドをテストすると、長方形に点が含まれている場合でも、常に「いいえ」が返されます。

交差メソッドは、引数(aRect)として長方形を取り、ifステートメントでcontainsPointメソッドを使用して、受信者と交差するかどうかを確認します。交差する場合は、交差に原点があり、正しい幅と高さの長方形を返します。

-(BOOL) containsPoint:(XYPoint *) aPoint
{
//create two variables to be used within the method 
float upperX, upperY;

//assign them values, add the height and width to the origin values to range which the XYPoint must fall into 
upperX = origin.x + height;
upperY = origin.y + width;    

//if the value of aPoint's x and y points fall between the object's origin and the upperX or upperY values then the rectangle must contain the XYPoint and a message is sent to NSLog

if ((aPoint.x >= origin.x) && (aPoint.x <= upperX) && (aPoint.y >= origin.y) && (aPoint.y <= upperY) ) 
{
    NSLog(@"Contains point");
    return YES;

}

else
{
    NSLog(@"Does not contain point");
    return NO;

}


}


-(Rectangle *) intersects: (Rectangle *) aRect
{
//create new  variables, Rectangle and XYPoint objects to use within the method
Rectangle *intersectRect = [[Rectangle alloc] init];
XYPoint *aRectOrigin = [[XYPoint alloc] init];
float wi, he;   //create some variables

if ([self containsPoint:aRect.origin]) {     //send the containsPoint method to self to test if the intersect
    [aRectOrigin setX:aRect.origin.x andY:origin.y];   //set the origin for the new intersecting rectangle
    [intersectRect setOrigin:aRectOrigin];
    wi = (origin.x + width) - aRect.origin.x;   //determine the width of the intersecting rectangle
    he = (origin.y + height) - aRect.origin.y;  //determine the height of the intersecting rectangle
    [intersectRect setWidth:wi andHeight:he];   //set the rectangle's width and height

    NSLog(@"The shapes intersect");
    return intersectRect;
}

//if the test returned NO then send back these values
else {
    [intersectRect setWidth:0. andHeight:0.];
    [aRectOrigin setX:0. andY:0.];
    [intersectRect setOrigin:aRectOrigin];

    NSLog(@"The shapes do not intersect");
    return intersectRect;
}
}

次のコードでテストすると

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

        Rectangle *aRectangle = [[Rectangle alloc] init];
        Rectangle *bRectangle = [[Rectangle alloc] init];
        Rectangle *intersectRectangle = [[Rectangle alloc] init];
        XYPoint *aPoint = [[XYPoint alloc] init];
        XYPoint *bPoint = [[XYPoint alloc] init];

        [aPoint setX:200.0 andY:420.00];
        [bPoint setX:400.0 andY:300.0];

        [aRectangle setWidth:250.00 andHeight:75.00];
        [aRectangle setOrigin:aPoint];

        [bRectangle setWidth:100.00 andHeight:180.00];
        [bRectangle setOrigin:bPoint];    

        printf("Are the points within the rectangle's borders?  ");  
        [aRectangle containsPoint: bPoint] ? printf("YES\n") : printf("NO\n");  
        intersectRectangle = [aRectangle intersects:bRectangle];

}
    return 0;   
}

次の出力が得られます

Contains point  
The origin is at 0.000000,0.000000, the width is 250.000000 and the height is 75.000000  
4

4 に答える 4

3

これがコードです(私は現在、Stephen Kochanによる「Objective-Cの第5版でのプログラミング」を使用しています)、変数と構文から判断すると、あなたもそうであるように見えます.

    // Use Floats for XYPoint and Rectangular exercise 8.4 on pg. 166

import "Rectangle.h"

import "XYPoint.h"

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

@autoreleasepool {
    Rectangle *myRect = [[Rectangle alloc] init];
    Rectangle *yourRect = [[Rectangle alloc] init];
    XYPoint   *myPoint = [[XYPoint alloc] init];
    XYPoint   *yourPoint = [[XYPoint alloc] init];

    // For first Rectangle set w, h, origin
    [myRect setWidth:250 andHeight:75];
    [myPoint setX:200 andY:420];
    myRect.origin = myPoint;

    // Second Rectangle
    [yourRect setWidth:100 andHeight:180];
    [yourPoint setX:400 andY:300];
    yourRect.origin = yourPoint;

    // Find Points of intersection
    float x1, x2, y1, y2;
    x1 = MAX(myRect.origin.x, yourRect.origin.x);
    x2 = MIN(myRect.origin.x + myRect.width, yourRect.origin.x + yourRect.width);
    y1 = MAX(myRect.origin.y, yourRect.origin.y);
    y2 = MIN(myRect.origin.y + myRect.height, yourRect.origin.y + yourRect.height);

    // Make Intersecting Rectangle
    Rectangle *intrRect = [[Rectangle alloc] init];
    [intrRect setWidth: abs(x2 - x1) andHeight: abs(y2 - y1)];

    // Print Intersecting Rectangle's infor for a check
    NSLog(@"Width = %g, Height = %g, Bottom point = (%g, %g), Top point = (%g, %g)", intrRect.width, intrRect.height, x1, y1, x2, y2);

}
return 0;

}

于 2013-03-29T04:51:56.803 に答える
2

交差点や包含を決定するために、含まれている関数を使用しないのはなぜですか。

if (CGRectContainsPoint(CGRect rect, CGPoint point))
{
    // Contains point...
}

また

if (CGRectIntersectsRect(CGRect rectOne, CGRect rectTwo))
{
    // Rects intersect...
}

また

if (CGRectContainsRect(CGRect rectOne, CGRect rectTwo))
{
    // RectOne contains rectTwo...
}
于 2012-10-02T22:31:42.237 に答える
0

ジオメトリと Objective-C の両方で多くのエラーを犯しましたが、これが学習方法です。

  1. ジオメトリ: 2 つの長方形が交差する場合、一方の原点が他方の領域内にある必要はありません。2 つの長方形は交差しますが、交点には原点が含まれていません。だからあなたcontainsPoint:は戻ってきNOます。
  2. 呼び出すコードがオブジェクトを作成して返す場合ではなく、作成した場合にのみオブジェクトを割り当てます。したがって、割り当てRectangle *intersectRectangle = [[Rectangle alloc] init];によってオブジェクトが作成され、割り当てによって破棄されますintersectRectangle = [aRectangle intersects:bRectangle];
  3. これらのような単純なクラスの場合init、プロパティを設定せずにオブジェクトを作成するのは役に立たないため、通常、プロパティを設定するメソッドを作成します。たとえば、XYPointクラスの場合、通常は初期化メソッドがあります- (id) initWithX:(float)x andY:(float)y;。次に[[XYPoint alloc] initWithX:200.0 andY:420.0]]、一度に作成して初期化するために使用します。
  4. 実験しているので、これは重要ではありませんが、値のセマンティクスを持つ非常に単純で小さなクラスの実際のコードでは、整数や浮動小数点のように動作することを意味しstructます。オブジェクトやメソッドではなく、構造体 ( ) と関数を使用するのが一般的です。NSRect例としてとの定義を調べてくださいNSPoint

HTH

于 2012-10-02T23:26:08.840 に答える