// File: /workspace/github_cpp_makefile_star2_O2/wrighteagle2d[P]wrighteaglebase/Debug/../src/Geometry.cpp
// Function: Circle::Intersection(Circle const&, Vector&, Vector&, double const&) const
int Circle::Intersection(const Circle &C, Vector &v1, Vector &v2,
                         const double &buffer = FLOAT_EPS) const {
  double d, a, b, c, p, q, r;
  double cos_value[2], sin_value[2];
  if (mCenter.Dist(C.Center()) <= buffer &&
      fabs(mRadius - C.Radius()) <= buffer) {
    return -1;
  }

  d = mCenter.Dist(C.Center());
  if (d > mRadius + C.Radius() || d < fabs(mRadius - C.Radius())) {
    return 0;
  }

  a = 2.0 * mRadius * (mCenter.X() - C.Center().X());
  b = 2.0 * mRadius * (mCenter.Y() - C.Center().Y());
  c = C.Radius() * C.Radius() - mRadius * mRadius - mCenter.Dist2(C.Center());
  p = a * a + b * b;
  q = -2.0 * a * c;
  if (fabs(d - mRadius - C.Radius()) <= buffer ||
      fabs(d - fabs(mRadius - C.Radius()) <= buffer)) {
    cos_value[0] = -q / p / 2.0;
    sin_value[0] = sqrt(1 - cos_value[0] * cos_value[0]);

    v1.SetX(mRadius * cos_value[0] + mCenter.X());
    v1.SetY(mRadius * sin_value[0] + mCenter.Y());

    if (fabs(v1.Dist2(C.Center()) - C.Radius() * C.Radius()) >= buffer) {
      v1.SetY(mCenter.Y() - mRadius * sin_value[0]);
    }
    return 1;
  }

  r = c * c - b * b;
  cos_value[0] = (sqrt(q * q - 4.0 * p * r) - q) / p / 2.0;
  cos_value[1] = (-sqrt(q * q - 4.0 * p * r) - q) / p / 2.0;
  sin_value[0] = sqrt(1 - cos_value[0] * cos_value[0]);
  sin_value[1] = sqrt(1 - cos_value[1] * cos_value[1]);

  v1.SetX(mRadius * cos_value[0] + mCenter.X());
  v2.SetX(mRadius * cos_value[1] + mCenter.X());
  v1.SetY(mRadius * sin_value[0] + mCenter.Y());
  v2.SetY(mRadius * sin_value[1] + mCenter.Y());

  if (fabs(v1.Dist2(C.Center()) - C.Radius() * C.Radius()) >= buffer) {
    v1.SetY(mCenter.Y() - mRadius * sin_value[0]);
  }

  if (fabs(v2.Dist2(C.Center()) - C.Radius() * C.Radius()) >= buffer) {
    v2.SetY(mCenter.Y() - mRadius * sin_value[0]);
  }

  if (v1.Dist(v2) <= buffer) {
    if (v1.Y() > 0) {
      v2.SetY(-v2.Y());
    } else {
      v1.SetY(-v1.Y());
    }
  }
  return 2;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x38, %rsp
movq %r8, %r14
movq %rcx, %r12
movq %rdx, %rbx
movq %rsi, %r13
movq %rdi, %r15
callq 0x2198a
movsd (%r14), %xmm1
ucomisd %xmm0, %xmm1
jb 0x23df6
movsd 0x10(%r15), %xmm0
subsd 0x10(%r13), %xmm0
andpd 0x33224(%rip), %xmm0    # 0x57010
ucomisd %xmm0, %xmm1
jae 0x23fd5
movq %r15, %rdi
movq %r13, %rsi
callq 0x2198a
movsd 0x10(%r15), %xmm4
movsd 0x10(%r13), %xmm3
movapd %xmm4, %xmm1
addsd %xmm3, %xmm1
xorl %eax, %eax
ucomisd %xmm1, %xmm0
ja 0x23fd8
movapd %xmm4, %xmm1
subsd %xmm3, %xmm1
andpd 0x331df(%rip), %xmm1    # 0x57010
ucomisd %xmm0, %xmm1
ja 0x23fd8
movapd %xmm4, %xmm2
addsd %xmm4, %xmm2
movsd (%r15), %xmm6
movsd 0x8(%r15), %xmm7
subsd (%r13), %xmm6
movapd %xmm2, %xmm9
mulsd %xmm6, %xmm9
subsd 0x8(%r13), %xmm7
mulsd %xmm7, %xmm2
movapd %xmm4, %xmm8
mulsd %xmm4, %xmm8
movapd %xmm3, %xmm5
mulsd %xmm3, %xmm5
subsd %xmm8, %xmm5
mulsd %xmm7, %xmm7
mulsd %xmm6, %xmm6
addsd %xmm7, %xmm6
subsd %xmm6, %xmm5
mulsd %xmm2, %xmm2
movapd %xmm9, %xmm7
mulsd %xmm9, %xmm7
addsd %xmm2, %xmm7
mulsd 0x331ae(%rip), %xmm9    # 0x57058
movapd %xmm0, %xmm6
subsd %xmm4, %xmm6
subsd %xmm3, %xmm6
andpd 0x33152(%rip), %xmm6    # 0x57010
mulsd %xmm5, %xmm9
movsd (%r14), %xmm3
ucomisd %xmm6, %xmm3
jae 0x23fe7
subsd %xmm1, %xmm0
ucomisd %xmm0, %xmm3
jae 0x23fe7
mulsd %xmm5, %xmm5
subsd %xmm2, %xmm5
movsd 0x34858(%rip), %xmm0    # 0x58748
mulsd %xmm7, %xmm0
mulsd %xmm5, %xmm0
movapd %xmm9, %xmm1
mulsd %xmm9, %xmm1
addsd %xmm0, %xmm1
sqrtsd %xmm1, %xmm6
xorpd %xmm2, %xmm2
ucomisd %xmm2, %xmm1
movapd %xmm6, %xmm0
movapd %xmm9, -0x40(%rbp)
movsd %xmm7, -0x48(%rbp)
jae 0x23f4f
movapd %xmm1, %xmm0
movapd %xmm6, -0x60(%rbp)
movsd %xmm1, -0x30(%rbp)
callq 0x93e0
xorpd %xmm2, %xmm2
movsd -0x30(%rbp), %xmm1
movsd -0x48(%rbp), %xmm7
movapd -0x40(%rbp), %xmm9
movapd -0x60(%rbp), %xmm6
subsd %xmm9, %xmm0
divsd %xmm7, %xmm0
mulsd 0x338e8(%rip), %xmm0    # 0x57848
ucomisd %xmm2, %xmm1
movsd %xmm0, -0x30(%rbp)
jae 0x23f88
movapd %xmm1, %xmm0
callq 0x93e0
movsd -0x48(%rbp), %xmm7
movapd -0x40(%rbp), %xmm9
movapd %xmm0, %xmm6
movsd -0x30(%rbp), %xmm0
xorpd 0x33090(%rip), %xmm6    # 0x57020
subsd %xmm9, %xmm6
divsd %xmm7, %xmm6
mulsd 0x338a7(%rip), %xmm6    # 0x57848
movapd %xmm0, %xmm1
mulsd %xmm0, %xmm1
movsd 0x33097(%rip), %xmm2    # 0x57048
movapd %xmm2, %xmm0
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
movapd %xmm6, -0x60(%rbp)
jb 0x240a8
sqrtsd %xmm0, %xmm7
jmp 0x240c2
pushq $-0x1
popq %rax
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
divsd %xmm7, %xmm9
mulsd 0x3306b(%rip), %xmm9    # 0x57060
movapd %xmm9, %xmm1
mulsd %xmm9, %xmm1
movsd 0x33041(%rip), %xmm0    # 0x57048
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x2401b
sqrtsd %xmm0, %xmm0
jmp 0x2402c
movapd %xmm9, -0x40(%rbp)
callq 0x93e0
movapd -0x40(%rbp), %xmm9
movsd 0x10(%r15), %xmm1
mulsd %xmm1, %xmm9
addsd (%r15), %xmm9
movsd %xmm9, (%rbx)
mulsd %xmm1, %xmm0
movsd 0x8(%r15), %xmm1
addsd %xmm0, %xmm1
movsd %xmm1, 0x8(%rbx)
subsd (%r13), %xmm9
subsd 0x8(%r13), %xmm1
mulsd %xmm1, %xmm1
mulsd %xmm9, %xmm9
addsd %xmm1, %xmm9
movsd 0x10(%r13), %xmm1
mulsd %xmm1, %xmm1
subsd %xmm1, %xmm9
andpd 0x32f8a(%rip), %xmm9    # 0x57010
pushq $0x1
popq %rax
ucomisd (%r14), %xmm9
jb 0x23fd8
movsd 0x8(%r15), %xmm1
subsd %xmm0, %xmm1
movsd %xmm1, 0x8(%rbx)
jmp 0x23fd8
callq 0x93e0
xorpd %xmm1, %xmm1
movsd 0x32f8f(%rip), %xmm2    # 0x57048
movapd -0x60(%rbp), %xmm6
movapd %xmm0, %xmm7
movapd %xmm6, %xmm0
mulsd %xmm6, %xmm0
subsd %xmm0, %xmm2
ucomisd %xmm1, %xmm2
jb 0x240da
sqrtsd %xmm2, %xmm0
jmp 0x240f2
movapd %xmm2, %xmm0
movsd %xmm7, -0x40(%rbp)
callq 0x93e0
movsd -0x40(%rbp), %xmm7
movapd -0x60(%rbp), %xmm6
movsd 0x10(%r15), %xmm1
movsd -0x30(%rbp), %xmm2
mulsd %xmm1, %xmm2
addsd (%r15), %xmm2
movsd %xmm2, (%rbx)
mulsd %xmm1, %xmm6
addsd (%r15), %xmm6
movsd %xmm6, (%r12)
mulsd %xmm1, %xmm7
movsd 0x8(%r15), %xmm2
addsd %xmm7, %xmm2
movsd %xmm2, 0x8(%rbx)
mulsd %xmm1, %xmm0
addsd 0x8(%r15), %xmm0
movsd %xmm0, 0x8(%r12)
movsd (%r13), %xmm1
movsd 0x8(%r13), %xmm2
movsd (%rbx), %xmm5
movsd 0x8(%rbx), %xmm3
subsd %xmm1, %xmm5
subsd %xmm2, %xmm3
mulsd %xmm3, %xmm3
mulsd %xmm5, %xmm5
addsd %xmm3, %xmm5
movsd 0x10(%r13), %xmm4
movapd %xmm4, %xmm3
mulsd %xmm4, %xmm3
subsd %xmm3, %xmm5
andpd 0x32e90(%rip), %xmm5    # 0x57010
movsd (%r14), %xmm3
ucomisd %xmm3, %xmm5
jb 0x241b2
movsd 0x8(%r15), %xmm0
subsd %xmm7, %xmm0
movsd %xmm0, 0x8(%rbx)
movsd 0x8(%r12), %xmm0
movsd 0x8(%r13), %xmm2
movsd 0x10(%r13), %xmm4
movsd (%r14), %xmm3
movapd 0x32e66(%rip), %xmm5    # 0x57020
xorpd %xmm4, %xmm5
mulsd %xmm4, %xmm5
subsd %xmm2, %xmm0
subsd %xmm1, %xmm6
mulsd %xmm0, %xmm0
mulsd %xmm6, %xmm6
addsd %xmm0, %xmm6
addsd %xmm5, %xmm6
andpd 0x32e2e(%rip), %xmm6    # 0x57010
ucomisd %xmm3, %xmm6
jb 0x241f9
movsd 0x8(%r15), %xmm0
subsd %xmm7, %xmm0
movsd %xmm0, 0x8(%r12)
movq %rbx, %rdi
movq %r12, %rsi
callq 0x2198a
movsd (%r14), %xmm1
pushq $0x2
popq %rax
ucomisd %xmm0, %xmm1
jb 0x23fd8
movsd 0x8(%rbx), %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x24240
movsd 0x8(%r12), %xmm0
xorpd 0x32dec(%rip), %xmm0    # 0x57020
movlpd %xmm0, 0x8(%r12)
jmp 0x23fd8
xorpd 0x32dd8(%rip), %xmm0    # 0x57020
movlpd %xmm0, 0x8(%rbx)
jmp 0x23fd8