黑马程序员-两种方法做计算两个圆是否相交

这篇博客介绍了使用Objective-C(OC)设计并实现计算两个圆是否相交的方法。首先定义了一个Point2D类表示二维平面上的点,包含属性x和y以及相关方法。接着创建了Circle类,包含半径radius和圆心point,实现了判断两个圆是否相交的逻辑。博客中提到了初学者在实现过程中可能遇到的问题,以及Xcode的高级功能在代码调试中的帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在初步学习OC之后迎来了一道 难度较高的题目,计算两个圆是否相交。

这道题和之前那些编程改错啥的一比真的难度上升很多(对我来说),要先设置Point2D类 然后 再设置Circle类 组合圆心类

说实话这题在没看MJ老师点评之前 自己没法独立完成 我只做到了 程序无错误但是 运行结果就是0 那些参数也都是0也不知道哪错了。只好看了点评的视频才知道是那些对象没创建里面都是空 你就往里面赋值赋不进去啊!貌似是经典错误。。。 

然后MJ老师在后面讲到了Xcode 的高级功能 立马把文件转了高级功能 真的比以前CC -C啥的犀利多了。

这是我做的代码 可以运行但是可能有些地方格式或用法不完善还请大神指正

--------------------------------------------------

Point2D.h   圆心类声明

//  Point2D.h

//  11-计算圆是否相交

//

//  Created by 尚先 on 14-9-30.

//  Copyright (c) 2014 dsx. All rights reserved.

//


/*

 

 5.设计一个类Point2D,用来表示二维平面中某个点

 1> 属性

 * double x

 * double y

 

 2> 方法

 * 属性相应的setget方法

 * 设计一个对象方法同时设置xy

 * 设计一个对象方法计算跟其他点的距离

 * 设计一个类方法计算两个点之间的距离

 

 3> 提示

 * C语言的math.h中有个函数:double pow(double n, double m);计算nm次方

 * C语言的math.h中有个函数:double sqrt(double n);计算根号n的值(对n进行开根)

 

 

 */

#import <Foundation/Foundation.h>


@interface Point2D :NSObject

{

    // 成员变量

   double _x;

   double _y;

}

//xysetter and getter

- (void)setX:(double)x;

- (double)x;


- (void)setY:(double)y;

- (double)y;


- (void)YQsetX:(double)x andY:(double)y;// 同时设置xy

- (double)DeltaDistanceWithOther:(Point2D *)other;// 对象方法计算两点距离

+ (double)DeltaDistancePoint1:(Point2D *)p1 andPoint2:(Point2D *)p2;// 类方法计算两点距离


@end

-----------------------------------------
Point2D.m    圆心类实现

//

//  Point2D.m

//  11-计算圆是否相交

//

//  Created by 尚先 on 14-9-30.

//  Copyright (c) 2014 dsx. All rights reserved.

//


#import "Point2D.h"

#import <math.h>

@implementation Point2D

- (void)setX:(double)x

{

   _x = x;

}

- (double)x;

{

   return _x;

}


- (void)setY:(double)y

{

   _y = y;

}

- (double)y;

{

   return _y;

}

// 同时设置xy

- (void)YQsetX:(double)x andY:(double)y

{

    [selfsetX:x];

    [selfsetY:y];

}

// 对象方法计算两点距离

- (double)DeltaDistanceWithOther:(Point2D *)other

{

    // xy的差值

   double xDelta = [selfx] - [other x];

   double yDelta = [selfy] - [other y];

     //算出两个差值的平方

   double xDeltaPF = pow(xDelta,2);

   double yDeltaPF = pow(yDelta,2);

    //返回平方和的开根结果

   double c = sqrt(xDeltaPF + yDeltaPF);

   return c;

}

// 类方法计算两点距离

+ (double)DeltaDistancePoint1:(Point2D *)p1 andPoint2:(Point2D *)p2

{

    

    return [p1DeltaDistanceWithOther:p2]; //调用对象方法解决问题

}

@end


-----------------------------------------
Circle.h      圆类声明

//

//  Circle.h

//  11-计算圆是否相交

//

//  Created by 尚先 on 14-9-30.

//  Copyright (c) 2014 dsx. All rights reserved.

//

/*

 6.设计一个类Circle,用来表示二维平面中的圆

 1> 属性

 * double _radius (半径)

 * Point2D *_point (圆心)

 

 2> 方法

 * 属性相应的setget方法

 * 设计一个对象判断跟其他圆是否重叠(重叠返回YES,否则返回NO

 * 设计一个类方法判断两个圆是否重叠(重叠返回YES,否则返回NO

 */


#import <Foundation/Foundation.h>

#import "Point2D.h"

@interface Circle :NSObject

{

    // 成员变量

   double _radius;

   Point2D * _Point;

}

// 半径和圆心的getset算法声明

- (void)setRadius:(double)radius;

- (double)radius;


- (void)setPoint:(Point2D *)point;

- (Point2D *)point;


// 对象方法判断该对象和另一个圆是否相交

- (BOOL)isFixWithOtherCircle:(Circle *)other;

// 类方法判断两个圆是否相交

+ (BOOL)isFixWithOtherCircle:(Circle *)c1 andCircle:(Circle *)c2;


@end


----------------------------------------------
Circle.m   圆类实现

//

//  Circle.m

//  11-计算圆是否相交

//

//  Created by 尚先 on 14-9-30.

//  Copyright (c) 2014 dsx. All rights reserved.

//


/*

 6.设计一个类Circle,用来表示二维平面中的圆

 1> 属性

 * double _radius (半径)

 * Point2D *_point (圆心)

 

 2> 方法

 * 属性相应的setget方法

 * 设计一个对象判断跟其他圆是否重叠(重叠返回YES,否则返回NO

 * 设计一个类方法判断两个圆是否重叠(重叠返回YES,否则返回NO

 */

#import "Circle.h"

#import "Point2D.h"

#import <math.h>

@implementation Circle


// 半径和圆心的getset算法实现

- (void)setRadius:(double)radius

{

   _radius = radius;

}

- (double)radius

{

    return_radius;

}


- (void)setPoint:(Point2D *)point

{

   _Point = point;

}

- (Point2D *)point

{

   return _Point;

}


// 对象方法判断该对象和另一个圆是否相交

- (BOOL)isFixWithOtherCircle:(Circle *)other

{

    //return [Circle isFixWithOtherCircle:self andCircle:other];

    

    //给两个圆选好圆心

   Point2D *point1 = [selfpoint];

   Point2D *point2 = [other point];

    

    // 算出圆心距

   double DeltaPoint = [point1 DeltaDistanceWithOther:point2];

    // 算出半径之和

   double RadiusSum = self -> _radius + other -> _radius;

    

   return DeltaPoint < RadiusSum; // 半径和大于圆心距就是反回相交


}

// 类方法判断两个圆是否相交

+ (BOOL)isFixWithOtherCircle:(Circle *)c1 andCircle:(Circle *)c2

{

   /*

    Point2D *point1 = [c1 point];

    Point2D *point2 = [c2 point];

    

    double DeltaPoint = [point1 DeltaDistanceWithOther:point2];

    double RadiusSum = c1->_radius + c2->_radius;

    

    return DeltaPoint < RadiusSum ;

     */

    return [c1isFixWithOtherCircle:c2]; //直接调用类方法解决

}

@end


---------------------------------------------------
主函数

//

//  main.m

//  11-计算圆是否相交

//

//  Created by 尚先 on 14-9-30.

//  Copyright (c) 2014 dsx. All rights reserved.

//


#import <Foundation/Foundation.h>

#import "Circle.h"

#import "Point2D.h"

int main()

{

    // 建立两个圆对象

   Circle *Cir1 = [Circlenew];

   Circle *Cir2 = [Circlenew];

    

    //set算法把两个圆的半径设置成2

    [Cir1setRadius:2];

    [Cir2setRadius:2];

    

     // 建立两个圆心对象

   Point2D *p1 = [Point2Dnew];

   Point2D *p2 = [Point2Dnew];

    

    // 把两个圆的圆心设置成p1p2

    [Cir1setPoint:p1];

    [Cir2setPoint:p2];

    

    //通过一起赋值的算法把两个圆心数据都赋值进去

    [p1YQsetX:15 andY:20];

    [p2YQsetX:16 andY:19];


    // 判断是否相交

    BOOL bb = [CircleisFixWithOtherCircle:Cir1 andCircle:Cir2];

    NSLog(@"到底是否相交 %d",bb);

    

}



我这些数了一共是300多行代码,我感觉代码已经很精简啦  比如return [c1 isFixWithOtherCircle:c2]; 等等  MJ老师告诉了我们一个个可以省代码的方法。 然后接下来的课程是 《点语法》 和 《@property》方法 让我初次感受到了Xcode的强大力量。 然后也乖乖的完成了课后的作业吧之前的代码又重新建了个项目编写了一遍。 因为严格按照老师说的关闭Suggest ,所以有的方法名什么的可能与前一次写的不一样。

//

//  Point2D.h

//  12-精简的计算圆是否相交

//

//  Created by 尚先 on 14-10-3.

//  Copyright (c) 2014 dsx. All rights reserved.

//

#import <Foundation/Foundation.h>


@interface Point2D :NSObject

// property算法直接生成xygetset算法的声明和实现

@property double x;

@property double y;


// 一起给xy赋值方法

- (void)YQsetX:(double)x andY:(double)y;

// 对象方法计算该对象和另一个圆心的距离

- (double)DeltaDistanceWithOther:(Point2D *)other;

// 类方法计算两个圆心的距离

+ (double)DeltaDistancePoint1:(Point2D *)p1 andPoint2:(Point2D *)p2;

@end

-------------------------

//

//  Point2D.m

//  12-精简的计算圆是否相交

//

//  Created by 尚先 on 14-10-3.

//  Copyright (c) 2014 dsx. All rights reserved.

//


#import "Point2D.h"

#import <math.h>

@implementation Point2D


// 一起给xy赋值

- (void)YQsetX:(double)x andY:(double)y

{

   self.x = x;

   self.y = y;

}

// 对象方法计算该对象和另一个圆心的距离

- (double)DeltaDistanceWithOther:(Point2D *)other

{

    // 计算xy的差值

   double DeltaX = self.x - other.x;

   double DeltaY = self.y - other.y;

    //算出两个差值的平方

   double DeltaXPF = pow(DeltaX,2);

   double DeltaYPF = pow(DeltaY,2);

    //返回平方和的开根结果

   return sqrt(DeltaXPF + DeltaYPF);

}

// 类方法计算两个圆心的距离

+ (double)DeltaDistancePoint1:(Point2D *)p1 andPoint2:(Point2D *)p2

{

    return [p1DeltaDistanceWithOther:p2]; //调用对象方法解决问题

}

@end


------------------------------

//

//  Circle.h

//  12-精简的计算圆是否相交

//

//  Created by 尚先 on 14-10-3.

//  Copyright (c) 2014 dsx. All rights reserved.

//


#import "Point2D.h"


@interface Circle :NSObject


// property算法直接生成radiuspointgetset算法的声明和实现

@property double radius;// 定义半径

@propertyPoint2D *point; //组合圆心那个类


//对象方法判断该对象和另一个圆是否相交

- (BOOL)isFixWithOther:(Circle *)other;

//类方法判断两个圆是否相交

+ (BOOL)isFixCircle1:(Circle *)c1 andCircle2:(Circle *)c2;

@end


------------------------------

//

//  Circle.m

//  12-精简的计算圆是否相交

//

//  Created by 尚先 on 14-10-3.

//  Copyright (c) 2014 dsx. All rights reserved.

//


#import "Circle.h"

#import <math.h>

@implementation Circle


// 对象方法判断该对象和另一个圆是否相交

- (BOOL)isFixWithOther:(Circle *)other

{

   double TotalDistanceRadius = self.radius + other.radius;// 算出半径之和

   double DeltaDistancePoint = [self.pointDeltaDistanceWithOther:other.point];// 圆心距

   return TotalDistanceRadius > DeltaDistancePoint;// 半径和大于圆心距就是反回相交

}

//类方法判断两个圆是否相交

+ (BOOL)isFixCircle1:(Circle *)c1 andCircle2:(Circle *)c2;

{

   return [c1 isFixWithOther:c2];// 直接调用类方法解决

}

@end


---------------------------------

//

//  main.m

//  12-精简的计算圆是否相交

//

//  Created by 尚先 on 14-10-3.

//  Copyright (c) 2014 dsx. All rights reserved.

//


#import <Foundation/Foundation.h>

#import "Point2D.h"

#import "Circle.h"

int main()

{

    // 建立两个圆对象

   Circle *Cir1 = [Circlenew];

   Circle *Cir2 = [Circlenew];

    

    //用点语法替代set算法把两个圆的半径设置成2

    Cir1.radius =2;

    Cir2.radius =2;

    

    //建立两个圆心对象

   Point2D *p1 = [Point2Dnew];

   Point2D *p2 = [Point2Dnew];

    

    // 把两个圆的圆心设置成p1p2

    [Cir1setPoint:p1];

    [Cir2setPoint:p2];

    

    //通过一起赋值的算法把两个圆心数据都赋值进去

    [p1YQsetX:17 andY:20];

    [p2YQsetX:16 andY:19];

    

    // 判断是否相交

   BOOL bb = [CircleisFixCircle1:Cir1 andCircle2:Cir2];

    NSLog(@"到底是否相交 %d",bb);

   return 0;

}

------------------------------------
更改后的代码相当精简 一共只有180行左右并且成语的可读性也更好了 性能也更高了
这到底彻底弄懂后很有成就感,而且这种成就感是油然而生的和以往游戏通关的成就感不同。那种成就感只是短暂之后还会附带一点空虚。而且想起以前某位学大神霸说的,游戏里很多地方都有限制到了满级就不能升了,还有的比如 制皮,炼丹,采药,锻造等技能都是只能学一个学了这个就不可以学那个了,而人类现实中的学习不同 没人管你 没有限制 你想学多少都可以技多不压身。 期待后面的课程,期待伴随MJ老师特色的演讲和吐槽让我们更升入的了解Xcode的其他强大功能。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值