C++ 判断点和圆之间的距离(类嵌套类),类拆分成文件

点到圆心的距离如何获取?

即先建立坐标系,然后(x1-x2)^2+(y1-y2)^2 == 圆半径^2 作比较,这里的平方是为了避免根号出现。

我的代码,全局和成员函数判断,类嵌套都有,但比较冗杂。

class point   //点类,因为圆类里用了点类的数据,所以点类要在圆类的上面
{
public:
	void setx(int x)
	{
		m_x = x;
	}

	int getx()
	{
		return m_x;
	}

	void sety(int y)
	{
		m_y = y;
	}

	int gety()
	{
		return m_y;
	}

private:
	int m_x;
	int m_y;
};

class circle
{
public:
	void setr(int r)   //设置半径
	{
		m_r = r;
	}

	int getr()
	{
		return m_r;
	}

	void setcenter(point center)  //这里传输的是一个点,所以变量要用class point center,省略class
	{
		m_center = center;
	}

	point getcenter()       //注意这里返回的是一个点,用point
	{
		return m_center;
	}

	//成员函数判断关系
	void isincircle(point &p)   //这里用引用是节省空间,也可以值传递
	{
		int distance = (getcenter().getx() - p.getx())*(getcenter().getx() - p.getx()) + (getcenter().gety() - p.gety())*(getcenter().gety() - p.gety()) - getr()*getr();
		//这里圆心数据就在类中,直接用就行,不用加c.指引了
		if (distance > 0)
		{
			cout << "全局函数 员外" << endl;
		}
		else if (distance == 0)
		{
			cout << "全局函数 圆上" << endl;
		}
		else if (distance < 0)
		{
			cout << "全局函数 院内" << endl;
		}
	}	
private:
	int m_r;
	point m_center;    //圆心,点这个类创建的一个变量,类似于结构体嵌套,这里是类嵌套
};    


//全局函数判断点和圆的关系
void iscircle(circle &c,point &p)   
{
	int distance = (c.getcenter().getx() - p.getx())*(c.getcenter().getx() - p.getx()) + (c.getcenter().gety() - p.gety())*(c.getcenter().gety() - p.gety()) - c.getr()*c.getr();
	if (distance > 0)
	{
		cout << "成员函数 员外" << endl;
	}
	else if (distance == 0)
	{
		cout << "成员函数 圆上" << endl;
	}
	else if (distance < 0)
	{
		cout << "成员函数 院内" << endl;
	}
}

int main()    //类外
{
	int x1; int y1;   //输入点的坐标
	point p1;
	cout << "输入x1" << endl;
	cin >> x1;
	cout << "输入y1" << endl;
	cin >> y1;
	p1.setx(x1); p1.sety(y1);
	cout << "点的坐标" << p1.getx() << "    " << p1.gety() << endl; //表示点的坐标
	int x2; int y2; int r;
	point p2; circle c;   //p2是圆心坐标
	cout << "输入x2" << endl;
	cin >> x2;
	cout << "输入y2" << endl;
	cin >> y2;
	cout << "输入半径" << endl;
	cin >> r;
	p2.setx(x2); p2.sety(y2); c.setcenter(p2); c.setr(r);//因为这里用的嵌套类的结构,所以把圆心的坐标数据
			//传给点类后,还要把点类的数据传到圆类的函数中。圆的圆心为p2,所以c.setcenter(p2)。
	cout << "圆心x坐标" << c.getcenter().getx() << endl;  //因为c.getcenter返回的是一个点,且是point型,
											//所以可以继续访问,得到x的坐标 
	//全局函数判断
	iscircle(c, p1);//全局函数要将点和圆心的坐标都传输过去
	//成员函数判断
	c.isincircle(p1); //圆心的数据已在c这个圆类中,则只需调用成员判断函数,再将p1点的坐标传到函数中作比较就行
	system("pause");              
	return 0;   
}

老师代码(运用分文件编写)

分别建立"point.h"和"circle.h"

"point.h"

#pragma once  //防止头文件重复包含
#include <iostream>
using namespace std;


class point  
{
public:
	void setx(int x);   //留住函数声明和变量声明即可,"实现"全部删掉

	int getx();

	void sety(int y);

	int gety();

private:
	int m_x;
	int m_y;
};

 

"circle.h"

#pragma once  //防止头文件重复包含
#include <iostream>
using namespace std;
#include "point.h"  //因为类中使用了point类,所以加头文件


class circle
{
public:
	void setr(int r);   //设置半径
	

	int getr();
	

	void setcenter(point center);  
	

	point getcenter();       
	

	//成员函数判断关系;
	void isincircle(point &p);   
	
private:
	int m_r;
	point m_center;    
};

 再分别建立cpp文件

point.cpp

#include "point.h"  //包含类的头文件



	void point::setx(int x)   //只留下函数的实现,class,private等声明都删掉
	{					//又因为这些函数本来是成员函数,现在变成了全局函数,
						//所以必须告诉是在point作用域下,point::
						//则又变成成员函数
		m_x = x;
	}

	int point::getx()
	{
		return m_x;
	}

	void point::sety(int y)
	{
		m_y = y;
	}

	int point::gety()
	{
		return m_y;
	}

circle.cpp

#include "circle.h"



	void circle::setr(int r)   //设置半径
	{
		m_r = r;
	}

	int circle::getr()
	{
		return m_r;
	}

	void circle::setcenter(point center)  
	{
		m_center = center;
	}

	point circle::getcenter()       
	{
		return m_center;
	}

	//成员函数判断关系
	void circle::isincircle(point &p)   //因为这个函数也在类中,所以也要告诉在circle作用域下
										//加circle::
	{
		int distance = (getcenter().getx() - p.getx())*(getcenter().getx() - p.getx()) + (getcenter().gety() - p.gety())*(getcenter().gety() - p.gety()) - getr()*getr();
		
		if (distance > 0)
		{
			cout << "全局函数 员外" << endl;
		}
		else if (distance == 0)
		{
			cout << "全局函数 圆上" << endl;
		}
		else if (distance < 0)
		{
			cout << "全局函数 院内" << endl;
		}
	}

最后main函数加上两个头文件

#include <iostream>
#include <cmath>
#include <iomanip> // 控制符
#include <ctime>
#include <string>
#include "circle.h"   //加两个类的头文件
#include "point.h"
using namespace std;

//全局函数判断点和圆的关系
void iscircle(circle &c,point &p)   
{
	int distance = (c.getcenter().getx() - p.getx())*(c.getcenter().getx() - p.getx()) + (c.getcenter().gety() - p.gety())*(c.getcenter().gety() - p.gety()) - c.getr()*c.getr();
	if (distance > 0)
	{
		cout << "成员函数 员外" << endl;
	}
	else if (distance == 0)
	{
		cout << "成员函数 圆上" << endl;
	}
	else if (distance < 0)
	{
		cout << "成员函数 院内" << endl;
	}
}

int main()    //类外
{
	int x1; int y1;   //输入点的坐标
	point p1;
	cout << "输入x1" << endl;
	cin >> x1;
	cout << "输入y1" << endl;
	cin >> y1;
	p1.setx(x1); p1.sety(y1);
	cout << "点的坐标" << p1.getx() << "    " << p1.gety() << endl; //表示点的坐标
	int x2; int y2; int r;
	point p2; circle c;   //p2是圆心坐标
	cout << "输入x2" << endl;
	cin >> x2;
	cout << "输入y2" << endl;
	cin >> y2;
	cout << "输入半径" << endl;
	cin >> r;
	p2.setx(x2); p2.sety(y2); c.setcenter(p2); c.setr(r);//因为这里用的嵌套类的结构,所以把圆心的坐标数据
			//传给点类后,还要把点类的数据传到圆类的函数中。圆的圆心为p2,所以c.setcenter(p2)。
	cout << "圆心x坐标" << c.getcenter().getx() << endl;  //因为c.getcenter返回的是一个点,且是point型,
											//所以可以继续访问,得到x的坐标 
	//全局函数判断
	iscircle(c, p1);//全局函数要将点和圆心的坐标都传输过去
	//成员函数判断
	c.isincircle(p1); //圆心的数据已在c这个圆类中,则只需调用成员判断函数,再将p1点的坐标传到函数中作比较就行
	system("pause");              
	return 0;   
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值