【计算几何】三点求圆心和半径
2021-07-07 15:18:00 # ACM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
struct node {
double x,y;
} p[MS];

node get_center(double x1,double y1,double x2,double y2,double x3,double y3) {
double A,B,C,D,x,y,r;
double x1x1 = x1*x1;
double y1y1 = y1*y1;
double x2x2 = x2*x2;
double y2y2 = y2*y2;
double x3x3 = x3*x3;
double y3y3 = y3*y3;

double x2y3 = x2*y3;
double x3y2 = x3*y2;

double x2_x3 = x2-x3;
double y2_y3 = y2-y3;

double x1x1py1y1 = x1x1 + y1y1;
double x2x2py2y2 = x2x2 + y2y2;
double x3x3py3y3 = x3x3 + y3y3;

A = x1 * y2_y3 - y1 * x2_x3 + x2y3 - x3y2;
B = x1x1py1y1 * (-y2_y3) + x2x2py2y2 * (y1-y3) + x3x3py3y3 * (y2-y1);
C = x1x1py1y1 * x2_x3 + x2x2py2y2 * (x3 - x1) + x3x3py3y3 * (x1-x2);
D = x1x1py1y1 * (x3y2 - x2y3) + x2x2py2y2 * (x1*y3 - x3*y1) + x3x3py3y3 * (x2*y1-x1*y2);

x=-B/(2*A);
y=-C/(2*A);
r=sqrt((B*B+C*C-4*A*D)/(4*A*A));

// 三点一线,不存在圆
if(!A) return {MAXN,MAXN};
else return {x,y};
}
Prev
2021-07-07 15:18:00 # ACM
Next