代码:
Point getpoint(Circle b,LD x)
{
return { b.o.x+b.r * cos(x),b.o.y+b.r * sin(x) };
}
void Circle_insection(Circle a,Circle b)//两圆交点
{
LD h = getlen(a.o,b.o);
if (sign(h - a.r - b.r) > 0) return;
if (sign(a.r - b.r - h) >0|| sign(b.r - a.r - h) > 0) return ;
LD t = (h * h + b.r *b.r - a.r * a.r) / 2 / b.r / h;
LD ox = acos(t);
LD oy = atan2(a.o.y-b.o.y, a.o.x-b.o.x);
Point o1= getpoint(b,ox + oy), o2 = getpoint(b,oy - ox);
p[++cn] =o1;
if (sign(o1.x-o2.x)==0&&sign(o1.y-o2.y)==0) return;
p[++cn] =o2;
}