#include <bits/stdc++.h>
using namespace std;
struct point {
double x, y;
point(double A, double B) {
x = A, y = B;
}
point() = default;
};
struct line {
point point_A, point_B;
line(point A, point B) {
point_A = A, point_B = B;
}
line() = default;
};
struct Circle {
point O;
int r;
Circle(point A, int B) {
O = A, r = B;
}
Circle() = default;
};
double Distance_point_line(const point& O, const line& L) {
double a1 = L.point_A.x - L.point_B.x;
double a2 = L.point_A.y - L.point_B.y;
double b1 = O.y - L.point_A.y;
double b2 = O.x - L.point_A.x;
return abs(a1 * b1 - a2 * b2) / (sqrt(a1 * a1 + a2 * a2));
}
double getDistance(const Circle& circle, const line& l) {
if (circle.r <= Distance_point_line(circle.O, l)) {
return 0.0;
} else {
return 2.0 * sqrt(circle.r * circle.r - Distance_point_line(circle.O,
l) * Distance_point_line(circle.O, l));
}
}
int main() {
double ox, oy, r;
double x1, y1, x2, y2;
cin >> ox >> oy >> r;
cin >> x1 >> y1 >> x2 >> y2;
point center(ox, oy);
Circle circle(center, (int)r);
point p1(x1, y1);
point p2(x2, y2);
line l(p1, p2);
double result = getDistance(circle, l);
cout << fixed << setprecision(6) << result << endl;
return 0;
}
求距离可以用点到直线的坐标公式求解,也可以使用叉乘理解。
S=∣x1y2−x2y1∣
后面就直观理解即可。

京公网安备 11010502036488号