|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
问题:point类 里要用line类 但是line类 也要用point类 ,有先后问题会报错怎么解决
定义一个 point 类,表示二维平面的一个点。
从中派生一个 line 类,由两个点确定一条直线。以成员函数形式实现以下功能:
1. 点到直线距离
2. 直线间距离(相交距离为 0)
3. 点在平面上的投影点
4. 直线与直线的交点。哈达马积
- #include <iostream>
- #include <cmath>
-
- class Point {
- public:
- double x, y;
-
- Point(double x = 0, double y = 0) : x(x), y(y) {}
-
- double distanceToLine(const Line& line) const {
- // 计算点到直线的距离
- double px = x;
- double py = y;
- double ax = line.p1.x;
- double ay = line.p1.y;
- double bx = line.p2.x;
- double by = line.p2.y;
- double numerator = fabs((by - ay) * px - (bx - ax) * py + bx * ay - by * ax);
- double denominator = sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay));
- return numerator / denominator;
- }
- };
-
- class Line {
- public:
- Point p1, p2;
-
- Line(const Point& p1, const Point& p2) : p1(p1), p2(p2) {}
-
- double distanceToLine(const Line& otherLine) const {
- // 计算两条直线之间的距离(相交距离为0)
- double ax = p1.x;
- double ay = p1.y;
- double bx = p2.x;
- double by = p2.y;
- double px = otherLine.p1.x;
- double py = otherLine.p1.y;
- double qx = otherLine.p2.x;
- double qy = otherLine.p2.y;
- double denominator = (qy - py) * (bx - ax) - (qx - px) * (by - ay);
- if (denominator == 0) {
- // 两条直线平行或重合,相交距离为0
- return 0;
- } else {
- // 两条直线相交,计算交点坐标并返回距离
- double t = ((qx - px) * (ay - py) - (qy - py) * (ax - px)) / denominator;
- Point intersectionPoint(ax + t * (bx - ax), ay + t * (by - ay));
- return intersectionPoint.distanceToLine(otherLine);
- }
- }
-
- Point projection(const Point& point) const {
- // 计算点在平面上的投影点
- double ax = p1.x;
- double ay = p1.y;
- double bx = p2.x;
- double by = p2.y;
- double px = point.x;
- double py = point.y;
- double t = ((px - ax) * (bx - ax) + (py - ay) * (by - ay)) / ((bx - ax) * (bx - ax) + (by - ay) * (by - ay));
- Point projectionPoint(ax + t * (bx - ax), ay + t * (by - ay));
- return projectionPoint;
- }
- };
复制代码
问题的原因是在point类中使用了line类,而在line类中又使用了point类,导致了循环依赖问题。解决这个问题的方法是使用前向声明(forward declaration)来解决类之间的依赖关系。
在point类的定义之前,添加line类的前向声明:
class Line;
这样就可以在point类中使用line类了。而在line类中使用point类时,由于point类的定义已经在line类的定义之后,所以不会出现依赖问题。
修改后的代码如下:
#include <iostream>
#include <cmath>
class Line; // 前向声明
class Point {
public:
double x, y;
Point(double x = 0, double y = 0) : x(x), y(y) {}
double distanceToLine(const Line& line) const {
// 计算点到直线的距离
double px = x;
double py = y;
double ax = line.p1.x;
double ay = line.p1.y;
double bx = line.p2.x;
double by = line.p2.y;
double numerator = fabs((by - ay) * px - (bx - ax) * py + bx * ay - by * ax);
double denominator = sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay));
return numerator / denominator;
}
};
class Line {
public:
Point p1, p2;
Line(const Point& p1, const Point& p2) : p1(p1), p2(p2) {}
double distanceToLine(const Line& otherLine) const {
// 计算两条直线之间的距离(相交距离为0)
double ax = p1.x;
double ay = p1.y;
double bx = p2.x;
double by = p2.y;
double px = otherLine.p1.x;
double py = otherLine.p1.y;
double qx = otherLine.p2.x;
double qy = otherLine.p2.y;
double denominator = (qy - py) * (bx - ax) - (qx - px) * (by - ay);
if (denominator == 0) {
// 两条直线平行或重合,相交距离为0
return 0;
} else {
// 两条直线相交,计算交点坐标并返回距离
double t = ((qx - px) * (ay - py) - (qy - py) * (ax - px)) / denominator;
Point intersectionPoint(ax + t * (bx - ax), ay + t * (by - ay));
return intersectionPoint.distanceToLine(otherLine);
}
}
Point projection(const Point& point) const {
// 计算点在平面上的投影点
double ax = p1.x;
double ay = p1.y;
double bx = p2.x;
double by = p2.y;
double px = point.x;
double py = point.y;
double t = ((px - ax) * (bx - ax) + (py - ay) * (by - ay)) / ((bx - ax) * (bx - ax) + (by - ay) * (by - ay));
Point projectionPoint(ax + t * (bx - ax), ay + t * (by - ay));
return projectionPoint;
}
};
|
|