【C/C++】使用类和对象 设计点和圆的关系案例

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


设计点类圆类,判断 点和圆的关系

在这里插入图片描述

一、创建点类

根据题目,先创建一个点类,属性有点的x、y坐标

并且为了实现“可控制的访问”,将属性的访问权限设置为private

如果直接设置成公有的,别人随意就能修改

class CPoint		//点类
{
private:
	//点的坐标
	double m_x;
	double m_y;
};

然后创建一个圆类,属性有圆的半径圆心坐标

由于圆心坐标是一个点类型的数据,可以直接使用点类CPoint创建一个点对象作为圆类中的属性

class CCricle			//圆形类
{
private:
	double m_r;			//圆的半径
	CPoint m_Center;	//圆心坐标

二、创建设置、获取属性的函数

根据点类的属性x、y坐标,创建对应的设置x、y坐标和获取x、y坐标的函数

访问权限为public

为了让类的使用者只能通过设计者提供的接口去修改类的属性

public:

	//设置x的坐标
	void setX(double x)
	{
		m_x = x;
	}
	//设置y的坐标
	void setY(double y)
	{
		m_y = y;
	}
	//获取x的坐标
	double getX()
	{
		return m_x;
	}
	//获取y的坐标
	double getY()
	{
		return m_y;
	}

根据圆类的属性半径、圆心点,创建对应的设置半径、圆心点和获取半径、圆心点的函数

public:
	//设置半径
	void setm_r(double r)
	{
		m_r = r;
	}
	//获取半径
	double getm_r()
	{
		return m_r;
	}
	//设置圆心点
	void setCenter(CPoint center)
	{
		m_Center = center;
	}
	//获取圆心点
	CPoint getCenter()
	{
		return m_Center;
	}
};

三、创建全局函数

题目分析

点和圆的关系可以有以下几种情况

点和圆的关系

  • 点到圆心的距离 == 半径 点在圆上
  • 点到圆心的距离 > 半径 点在圆外
  • 点到圆心的距离 < 半径 点在圆内

点到圆心的距离 == (x1-x2)2 +(y1-y2)2m_r2相比

根据题目要求创建行为函数:

  • 获取点到圆心距离

通过点到圆的坐标平方相减计算 方便后续计算进行平方

//获取点到圆心距离
double juli(CPoint point, CPoint center)
{
	return (point.getX() - center.getX()) * (point.getX() - center.getX())
		+ (point.getY() - center.getY()) * (point.getY() - center.getY());				//(x1 - x2)^2 + (y1 - y2)^2
}
  • 判断点和圆的关系

通过(x1-x2)^2^ +(y1-y2)^2^ m_r^2^进行比较,判断点和圆的关系

//判断点和圆的关系
void isRelation(CPoint& point, CCricle& cricle)
{
	double distance = (point.getX() - cricle.getCenter().getX()) * (point.getX() - cricle.getCenter().getX())
		+ (point.getY() - cricle.getCenter().getY()) * (point.getY() - cricle.getCenter().getY());
	double rr = (cricle.getm_r()) * (cricle.getm_r());

	if (distance > rr)
	{
		cout << "点在圆外" << endl;
	}
	else if (distance < rr)
	{
		cout << "点在圆内" << endl;
	}
	else
	{
		cout << "点在圆上" << endl;
	}
}

四、测试执行

在主函数中使用CCricle圆类创建一个圆对象,再通过调用类成员函数setm_r()设置圆的半径

设置圆心时,由于圆心被定义为点类,使用点类CPoint创建圆心对象,并setCenter()设置圆心及坐标

调用全局函数isRelation()判断点和圆的关系

在这里插入图片描述
在这里插入图片描述

全部完整代码

#include <iostream>
#include <string>
using namespace std;
/*
点和圆的关系
点到圆心的距离 == 半径  点在圆上
点到圆心的距离  > 半径  点在圆外
点到圆心的距离  < 半径  点在圆内
点到圆心的距离 == (x1-x2)~2+(y1-y2)~2  与 m_r~2相比
*/
class CPoint		//点类
{
private:
	//点的坐标
	double m_x;
	double m_y;

public:

	//设置x的坐标
	void setX(double x)
	{
		m_x = x;
	}
	//设置y的坐标
	void setY(double y)
	{
		m_y = y;
	}
	//获取x的坐标
	double getX()
	{
		return m_x;
	}
	//获取y的坐标
	double getY()
	{
		return m_y;
	}
};

class CCricle			//圆形类
{


private:
	double m_r;			//圆的半径
	CPoint m_Center;	//圆心坐标

public:
	//设置半径
	void setm_r(double r)
	{
		m_r = r;
	}
	//获取半径
	double getm_r()
	{
		return m_r;
	}
	//设置圆心点
	void setCenter(CPoint center)
	{
		m_Center = center;
	}
	//获取圆心点
	CPoint getCenter()
	{
		return m_Center;
	}
};

//获取点到圆心距离
double juli(CPoint point, CPoint center)
{
	return (point.getX() - center.getX()) * (point.getX() - center.getX())
		+ (point.getY() - center.getY()) * (point.getY() - center.getY());				//(x1 - x2)~2 + (y1 - y2)~2
}
//判断点和圆的关系
void isRelation(CPoint& point, CCricle& cricle)
{
	double distance = (point.getX() - cricle.getCenter().getX()) * (point.getX() - cricle.getCenter().getX())
		+ (point.getY() - cricle.getCenter().getY()) * (point.getY() - cricle.getCenter().getY());
	double rr = (cricle.getm_r()) * (cricle.getm_r());

	if (distance > rr)
	{
		cout << "点在圆外" << endl;
	}
	else if (distance < rr)
	{
		cout << "点在圆内" << endl;
	}
	else
	{
		cout << "点在圆上" << endl;
	}
}



int main()
{
	//创建圆
	CCricle cricle1;

	//设置半径
	cricle1.setm_r(5.0);

	//设置圆心
	CPoint center1;
	center1.setX(2.0);
	center1.setY(4.0);
	cricle1.setCenter(center1);

	//创建点
	CPoint point1;
	point1.setX(1.0);
	point1.setY(10.0);


	isRelation(point1, cricle1);

	return 0;
}

注意类声明顺序

如果一个类使用了另一个类定义对象,被包含的类的声明顺序应该在包含他的类之前

定义class CPoint 点类 需要在CCricle使用CPoint定义对象之前 CPoint m_Center; //圆心坐标

否则会出现m_Center未知重写说明符的编译错误


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值