计算点到直线的距离。类定义的基本要求:
- 定义一个点类Point,包含有2 个私有数据成员x和y,表示点的坐标;一个构造函数。
- 定义一个直线类Line,包含有3 个私有数据成员a,b和c,表示直线方程ax+by+c= 0;一个构造函数。
说明:
计算点(x,y)到直线ax+by+c=0的距离d的计算公式如下:
\
实现要求:
应用友元函数/类完成。要求分别用如下三种方式完成:
方法一:定义全局函数(非成员函数)dist,并将其声明为Point和Line的友元函数,通过调用dist函数完成题目计算点到线距离的要求。
方法二:为Line定义成员函数dist,并将其声明为类Point的友元函数,通过Line的dist成员函数完成题目计算点到线距离的要求。
方法三:为Line定义成员函数dist,并声明Line类为Point类的友元类,通过Line的dist成员函数完成题目计算点到线距离的要求。
输入格式:
输入两行
第一行输入两个实数,表示点坐标x,y的值;
在第二行中三个实数,表示直线方程的三个系数a,b,c,题目保证a和b不为0.
输出格式:
输出点到直线的距离(保留两位小数)。
输入样例:
在这里给出一组输入。例如:
1.1 2.3
2 3.4 5.6
输出样例:
在这里给出相应的输出。例如:
The distance is: 3.96
#include<iostream>
#include<cmath>
#include<string>
#include <iomanip> // 用于设置输出精度
using namespace std;// 前向声明
class Line;// 点类
class Point {
private:double x, y;public:// 构造函数Point(double _x, double _y) : x(_x), y(_y) {}// 友元函数声明friend double dist(const Point& c1, const Line& c2);
};// 直线类
class Line {
private:double a, b, c;public:// 构造函数Line(double _a, double _b, double _c) : a(_a), b(_b), c(_c) {}// 友元函数声明friend double dist(const Point& c1, const Line& c2);
};// 计算点到直线的距离
double dist(const Point& c1, const Line& c2) {// 计算分子和分母double numerator = fabs(c2.a * c1.x + c2.b * c1.y + c2.c);double denominator = sqrt(c2.a * c2.a + c2.b * c2.b);// 计算距离double d = numerator / denominator;return d;
}int main() {double x, y, a, b, c;cin >> x >> y;cin >> a >> b >> c;// 创建点对象和直线对象Point c1(x, y);Line c2(a, b, c);// 输出距离,保留两位小数cout << "The distance is: " << fixed << setprecision(2) << dist(c1, c2);return 0;
}