这篇文章,我们将通过做一个案例,来增强我们对C++中的类、对象、类中的封装有更深刻地认识。

题目

判断圆与点的关系

题目分析

首先,我们先分析题目。圆与点有几种关系?

3种:

  • 点在圆上
  • 点在圆内
  • 点在圆外

C++实现:判断圆与点的关系_两点间距离

其次,我们来想想怎么用代码来解决它。

我们很容易地可以想到:利用 两点间距离公式 求出点与圆心的距离,然后用这个距离与半径做比较。

此时会出现3种情况,同时也对于着圆与点的3种关系:

  • 距离 > 半径 ---- 点在圆外
  • 距离 < 半径 ---- 点在圆内
  • 距离 = 半径 ---- 点在圆上

好了,题目分析到这就结束了,现在我们来设计代码。

代码实现思路

如果我们用面向过程的C语言,会很容易实现这个功能,因为我们的C语言已经很熟练了。

但我们现在在学习C++,同时也在学习它面对对象的思想。

所以我们看到这个题目的时候或许应该这样思考:

  • 题目中需要一个圆 -------------- 我最好设计一个圆类
  • 圆的构造需要圆心和半径 ------- 我可以把这2个放在圆类的成员属性中
  • 题目中不仅圆有需要坐标(圆心的坐标),点也需要坐标。既然有2次使用, 我不如也设计一个点类
  • 圆类有了,点类也有了。我最后再设计一个函数,用来比较它们的关系,这个题目就解完了

代码实现

#include <iostream>;
using namespace std;

//基本思路:
//	1.设计一个点类(记录坐标)
//	2.设计一个圆类
//	3.设计一个函数,判断某点与圆的关系(圆内、圆外、圆上)

//1.设计一个点类
class Point
{
public:

	//设置坐标
	void SetX(float& newX)
	{
		x = newX;
	}
	void SetY(float& newY)
	{
		y = newY;
	}

	//返回坐标
	float GetX(void)
	{
		return x;
	}
	float GetY(void)
	{
		return y;
	}

private:
	float x;
	float y;
};

//2.设计一个圆类
class Circle
{
public:
	void SetRadius(float &myRadius)
	{
		radius = myRadius;
	}

	void SetCenter(Point &newCenter)
	{
		center = newCenter;
	}


	Point GetCenter(void)
	{
		return center;
	}
	float GetRadius(void)
	{
		return radius;
	}

private:
	float radius;
	Point center;
};

//3.判断某点与圆的关系(圆内、圆外、圆上)
void PointAndCircle(Circle &circle, Point &point)
{
	float distance = 0.0f;
    
	//利用 两点间距离公式 , 来计算出2个点的直线距离
	distance = 
    (float)sqrt(pow(circle.GetCenter().GetX() - point.GetX(), 2) + 
                pow(circle.GetCenter().GetY() - point.GetY(), 2));

	//用 点与圆心的直线距离 和 圆的半径 进行对比,求出点与圆的关系
	if (distance > circle.GetRadius())
	{
		cout << "该点在此圆外" << endl;
	}
	else if (distance < circle.GetRadius())
	{
		cout << "该点在此圆内" << endl;
	}
	else
	{
		cout << "该点在此圆上" << endl;
	}
}

int main()
{
	Circle cir;
	Point pointCenter;
	Point pointTem;
	float x = 0.0f;
	float y = 0.0f;
	float r = 0.0f;

	//录入圆的信息:
    //	1.圆心坐标 
    //	2.圆的半径
	cout << "准备输入圆心的坐标" << endl;
	cout << "请输入 x 坐标:";
	cin >> x;
	cout << "请输入 y 坐标:";
	cin >> y;
	cout << "准备输入圆的半径:";
	cin >> r;
	
    //将用户输入的圆数据,存放入我们的圆中
	pointCenter.SetX(x);
	pointCenter.SetY(y);
	cir.SetCenter(pointCenter);
	cir.SetRadius(r);

	//录入点的坐标
	cout << endl;
	cout << "准备需要测试的点的坐标" << endl;
	cout << "请输入 x 坐标:";
	cin >> x;
	cout << "请输入 y 坐标:";
	cin >> y;
    
    //将用户输入的点的数据,放入我们的点中
	pointTem.SetX(x);
	pointTem.SetY(y);

	//进行判断并输出结果
	PointAndCircle(cir, pointTem);

	return 0;
}

运行结果

C++实现:判断圆与点的关系_代码实现_02

总结

我们在使用面对对象的语言时,应该使用面对对象的思想去思考问题。因为只有这样,我们才能更好地发挥面对对象语言的优势,写出具有该语言优势的代码,从而提高我们的效率、减少我们的bug。