kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

CGL_7_E: Cross Points of Circles

こんどは円と円の交点
似たようなものかな
えーと
あれ
意外と難しい?

角が決まらなくて進まない
辺は全部わかってる
こんなときはなんだっけ
余弦定理だっけ?
さすがに覚えてないな
調べる
ふむ
使えそうだ

こんな図で

f:id:kb84tkhr:20190310213525p:plain

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))