点到圆心的距离如何获取?
即先建立坐标系,然后(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;
}