kb84tkhrのブログ

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

CGL_7_E: Cross Points of Circles (続き)

解説を読む

cosθをもとめてsinθを求めて、ってやるんじゃなくて
acosでいきなりθを求めるのかそうか
三角関数の知識は高校までで止まってるからacosとか思いつかなかった

polarはある意味コンストラクタなんだけどfloatをふたつ渡すだけだと
区別のしようがないのでstaticmethodにした
たぶんstaticmethod

class Point:

    @staticmethod
    def polar(a: float, r: float) -> 'Point':
        return Point(a * cos(r), a * sin(r))

    def arg(self) -> float:
        return atan2(self.y, self.x)

class Circle:
    def cross_point_circle(self, other: 'Circle') -> List[Point]:
        d = (other.c - self.c).abs()
        r1 = self.r
        r2 = other.r
        a = acos((r1 * r1 + d * d - r2 * r2) / (2 * r1 * d))
        t = (other.c - self.c).arg()
        return sorted([self.c + Vector.polar(self.r, t + a),
                       self.c + Vector.polar(self.r, t - a)])

少し短くなった
関数増えた分は気にしない