| 222 | |
| 223 | |
| 224 | def arc_arc(a1: Arc, a2: Arc) -> Tuple[float, Segment]: |
| 225 | |
| 226 | r1 = a1.r |
| 227 | xc1, yc1 = a1.c.x, a1.c.y |
| 228 | |
| 229 | r2 = a2.r |
| 230 | xc2, yc2 = a2.c.x, a2.c.y |
| 231 | |
| 232 | # construct tangency points for a related point-circle problem |
| 233 | if r1 > r2: |
| 234 | arc_tmp = Arc(a1.c, r1 - r2, a1.a1, a1.a2) |
| 235 | xtmp1, ytmp1, xtmp2, ytmp2 = _pt_arc(a2.c, arc_tmp) |
| 236 | |
| 237 | delta_r = r1 - r2 |
| 238 | |
| 239 | dx1 = (xtmp1 - xc1) / delta_r |
| 240 | dy1 = (ytmp1 - yc1) / delta_r |
| 241 | |
| 242 | dx2 = (xtmp2 - xc1) / delta_r |
| 243 | dy2 = (ytmp2 - yc1) / delta_r |
| 244 | |
| 245 | elif r1 < r2: |
| 246 | arc_tmp = Arc(a2.c, r2 - r1, a2.a1, a2.a2) |
| 247 | xtmp1, ytmp1, xtmp2, ytmp2 = _pt_arc(a1.c, arc_tmp) |
| 248 | |
| 249 | delta_r = r2 - r1 |
| 250 | |
| 251 | dx1 = (xtmp1 - xc2) / delta_r |
| 252 | dy1 = (ytmp1 - yc2) / delta_r |
| 253 | |
| 254 | dx2 = (xtmp2 - xc2) / delta_r |
| 255 | dy2 = (ytmp2 - yc2) / delta_r |
| 256 | |
| 257 | else: |
| 258 | dx = xc2 - xc1 |
| 259 | dy = yc2 - yc1 |
| 260 | l = sqrt(dx ** 2 + dy ** 2) |
| 261 | |
| 262 | dx /= l |
| 263 | dy /= l |
| 264 | |
| 265 | dx1 = -dy |
| 266 | dy1 = dx |
| 267 | dx2 = dy |
| 268 | dy2 = -dx |
| 269 | |
| 270 | # construct the tangency points and angles |
| 271 | x11 = xc1 + dx1 * r1 |
| 272 | y11 = yc1 + dy1 * r1 |
| 273 | x12 = xc1 + dx2 * r1 |
| 274 | y12 = yc1 + dy2 * r1 |
| 275 | |
| 276 | x21 = xc2 + dx1 * r2 |
| 277 | y21 = yc2 + dy1 * r2 |
| 278 | x22 = xc2 + dx2 * r2 |
| 279 | y22 = yc2 + dy2 * r2 |
| 280 | |
| 281 | a1_out = atan2p(x21 - x11, y21 - y11) |