(c1, c2)
| 272 | self.r = r |
| 273 | |
| 274 | def circle_intersection(c1, c2): |
| 275 | d = math.sqrt((c1.x - c2.x)**2 + (c1.y - c2.y)**2) |
| 276 | if d > c1.r + c2.r or d < abs(c1.r - c2.r): |
| 277 | # 两圆不相交或者相切 |
| 278 | return [] |
| 279 | elif d == 0 and c1.r == c2.r: |
| 280 | # 两圆重合 |
| 281 | return [] |
| 282 | else: |
| 283 | a = (c1.r**2 - c2.r**2 + d**2) / (2 * d) |
| 284 | h = math.sqrt(c1.r**2 - a**2) |
| 285 | x2 = c1.x + a * (c2.x - c1.x) / d |
| 286 | y2 = c1.y + a * (c2.y - c1.y) / d |
| 287 | x3_1 = x2 + h * (c2.y - c1.y) / d |
| 288 | y3_1 = y2 - h * (c2.x - c1.x) / d |
| 289 | x3_2 = x2 - h * (c2.y - c1.y) / d |
| 290 | y3_2 = y2 + h * (c2.x - c1.x) / d |
| 291 | return [(x3_1, y3_1), (x3_2, y3_2)] |
| 292 | |
| 293 | def multi_circle_intersection(circles): |
| 294 | n = len(circles) |
no outgoing calls
no test coverage detected