用c语言写一个求直线和圆的公切圆
时间: 2024-03-10 08:49:48 浏览: 72
好的,以下是用 C 语言编写求直线和圆的公切圆的示例代码:
```
#include<stdio.h>
#include<math.h>
// 定义结构体表示点
struct Point {
double x;
double y;
};
// 定义结构体表示直线
struct Line {
double a;
double b;
double c;
};
// 定义结构体表示圆
struct Circle {
struct Point center;
double radius;
};
// 计算两点之间的距离
double distance(struct Point p1, struct Point p2) {
return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
}
// 计算直线的一般式方程
struct Line lineEquation(struct Point p1, struct Point p2) {
struct Line line;
line.a = p2.y - p1.y;
line.b = p1.x - p2.x;
line.c = p2.x * p1.y - p1.x * p2.y;
return line;
}
// 计算直线和圆的交点
int lineCircleIntersection(struct Line line, struct Circle circle, struct Point* p1, struct Point* p2) {
double dis = fabs(line.a * circle.center.x + line.b * circle.center.y + line.c) / sqrt(pow(line.a, 2) + pow(line.b, 2));
if (dis > circle.radius) {
return 0;
}
else if (dis == circle.radius) {
p1->x = p2->x = circle.center.x - line.b * dis / sqrt(pow(line.a, 2) + pow(line.b, 2));
p1->y = p2->y = circle.center.y + line.a * dis / sqrt(pow(line.a, 2) + pow(line.b, 2));
return 1;
}
else {
double x0 = -line.a * line.c / (pow(line.a, 2) + pow(line.b, 2));
double y0 = -line.b * line.c / (pow(line.a, 2) + pow(line.b, 2));
double d = sqrt(pow(circle.radius, 2) - pow(dis, 2));
p1->x = x0 + line.b * d / sqrt(pow(line.a, 2) + pow(line.b, 2));
p1->y = y0 - line.a * d / sqrt(pow(line.a, 2) + pow(line.b, 2));
p2->x = x0 - line.b * d / sqrt(pow(line.a, 2) + pow(line.b, 2));
p2->y = y0 + line.a * d / sqrt(pow(line.a, 2) + pow(line.b, 2));
return 2;
}
}
// 计算直线和圆的公切圆
int lineCircleTangent(struct Line line, struct Circle circle, struct Circle* tangent1, struct Circle* tangent2) {
int intersectionNum;
struct Point p1, p2;
intersectionNum = lineCircleIntersection(line, circle, &p1, &p2);
if (intersectionNum == 0) {
return 0;
}
else if (intersectionNum == 1) {
tangent1->center = tangent2->center = p1;
tangent1->radius = tangent2->radius = 0;
return 1;
}
else {
double d = distance(p1, p2) / 2;
tangent1->center.x = p1.x + d * (p2.y - p1.y) / distance(p1, p2);
tangent1->center.y = p1.y + d * (p2.x - p1.x) / distance(p1, p2);
tangent2->center.x = p1.x - d * (p2.y - p1.y) / distance(p1, p2);
tangent2->center.y = p1.y - d * (p2.x - p1.x) / distance(p1, p2);
tangent1->radius = tangent2->radius = d;
return 2;
}
}
int main() {
// 初始化直线和圆
struct Point p1 = {0, 0};
struct Point p2 = {1, 1};
struct Line line = lineEquation(p1, p2);
struct Point center = {3, 3};
double radius = 2;
struct Circle circle = {center, radius};
// 计算公切圆
struct Circle tangent1, tangent2;
int tangentNum = lineCircleTangent(line, circle, &tangent1, &tangent2);
// 输出结果
printf("公切圆个数:%d\n", tangentNum);
printf("公切圆1:中心点(%f, %f),半径%lf\n", tangent1.center.x, tangent1.center.y, tangent1.radius);
printf("公切圆2:中心点(%f, %f),半径%lf\n", tangent2.center.x, tangent2.center.y, tangent2.radius);
return 0;
}
```
该程序首先定义了 `Point`、`Line` 和 `Circle` 三个结构体分别表示点、直线和圆。然后定义了 `distance` 函数用于计算两点之间的距离,`lineEquation` 函数用于计算直线的一般式方程,`lineCircleIntersection` 函数用于计算直线和圆的交点,`lineCircleTangent` 函数用于计算直线和圆的公切圆。
在 `main` 函数中,首先初始化了一个直线和一个圆,然后调用 `lineCircleTangent` 函数计算公切圆,并输出结果。
注意:该程序中并没有进行输入检查和异常处理,仅供参考。
阅读全文