C++ 实现求两圆外公切线
时间: 2023-07-11 13:37:04 浏览: 42
下面是一个简单的 C++ 实现,可以求解两个圆的外公切线。其中,Circle 类表示圆,包含圆心坐标和半径信息,Line 类表示直线,包含直线上的两个点的坐标信息。
```
#include <iostream>
#include <cmath>
using namespace std;
const double eps = 1e-8;
struct Point {
double x, y;
Point() {}
Point(double x, double y) : x(x), y(y) {}
};
struct Circle {
Point c;
double r;
Circle() {}
Circle(Point c, double r) : c(c), r(r) {}
};
struct Line {
Point p1, p2;
Line() {}
Line(Point p1, Point p2) : p1(p1), p2(p2) {}
};
double dis(Point A, Point B) {
return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
}
int dcmp(double x) {
if (fabs(x) < eps) return 0;
return x < 0 ? -1 : 1;
}
Point getIntersection(Line a, Line b) {
double x1 = a.p1.x, y1 = a.p1.y;
double x2 = a.p2.x, y2 = a.p2.y;
double x3 = b.p1.x, y3 = b.p1.y;
double x4 = b.p2.x, y4 = b.p2.y;
double k1 = (y2 - y1) / (x2 - x1);
double k2 = (y4 - y3) / (x4 - x3);
double b1 = y1 - k1 * x1;
double b2 = y3 - k2 * x3;
double x = (b2 - b1) / (k1 - k2);
double y = k1 * x + b1;
return Point(x, y);
}
void getOuterTangents(Circle A, Circle B, Line &l1, Line &l2) {
double d = dis(A.c, B.c);
double cosA = (A.r - B.r) / d;
double sinA = sqrt(1 - cosA * cosA);
Point v = (B.c - A.c) / d;
Point p1 = A.c + v * (A.r / cosA);
Point p2 = B.c - v * (B.r / cosA);
Point p3 = A.c + v * (A.r / cosA * cosA * sinA);
Point p4 = B.c - v * (B.r / cosA * cosA * sinA);
l1 = Line(p1, p2);
l2 = Line(p3, p4);
}
int main() {
Circle A(Point(0, 0), 2);
Circle B(Point(3, 0), 1);
Line l1, l2;
getOuterTangents(A, B, l1, l2);
cout << "Outer tangents: " << endl;
cout << "(" << l1.p1.x << ", " << l1.p1.y << ") -> (" << l1.p2.x << ", " << l1.p2.y << ")" << endl;
cout << "(" << l2.p1.x << ", " << l2.p1.y << ") -> (" << l2.p2.x << ", " << l2.p2.y << ")" << endl;
return 0;
}
```
这个例子中,我们假设两个圆的圆心分别为 (0, 0) 和 (3, 0),半径分别为 2 和 1。程序输出了两个圆的外公切线的坐标。在实际使用中,可以根据需要进行修改。