CGL_7_E: Cross Points of Circles
こんどは円と円の交点
似たようなものかな
えーと
あれ
意外と難しい?
角が決まらなくて進まない
辺は全部わかってる
こんなときはなんだっけ
余弦定理だっけ?
さすがに覚えてないな
調べる
ふむ
使えそうだ
こんな図で
r2^2 = r1^2 + d^2 - 2*r1*d*cosθ1
から
cosθ1 = (r1^2 + d^2 - r2^2)/(2*r1*d)
で
sinθ = sqrt(1 - cosθ^2)
だから・・・
あー関数名かぶった
非互換な変更を加える
def cross_point_line(self, line: Line) -> List[Point]:
:
def cross_point_circle(self, other: 'Circle') -> List[Point]:
vec = other.c - self.c
d = vec.abs()
r1 = self.r
r2 = other.r
cos1 = (r1 * r1 + d * d - r2 * r2) / (2 * r1 * d)
sin1 = sqrt(1 - cos1 * cos1)
u = vec / d
proj = self.c + r1 * cos1 * u
perp = r1 * sin1 * Vector(-u.y, u.x)
return sorted([proj - perp, proj + perp])
メインはいつもよりさらに単純
def main() -> None:
c1x, c1y, c1r = [int(x) for x in input().split()]
c1 = Circle(Point(c1x, c1y), c1r)
c2x, c2y, c2r = [int(x) for x in input().split()]
c2 = Circle(Point(c2x, c2y), c2r)
left, right = c1.cross_point_circle(c2)
print("{:.8f} {:.8f} {:.8f} {:.8f}".format(
left.x, left.y, right.x, right.y))