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)])
少し短くなった
関数増えた分は気にしない