// File: /workspace/github_cpp_makefile_star2_O1/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
movsd (%rdi), %xmm0
movsd 0x8(%rdi), %xmm1
subsd (%rsi), %xmm0
subsd 0x8(%rsi), %xmm1
mulsd %xmm1, %xmm1
mulsd %xmm0, %xmm0
addsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x2a6f4
sqrtsd %xmm0, %xmm0
jmp 0x2a6f9
callq 0x93c0
movsd (%r14), %xmm1
ucomisd %xmm0, %xmm1
jb 0x2a723
movsd 0x10(%r15), %xmm0
subsd 0x10(%r13), %xmm0
andpd 0x408f8(%rip), %xmm0    # 0x6b010
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
ucomisd %xmm0, %xmm1
jae 0x2a78d
movsd (%r15), %xmm0
movsd 0x8(%r15), %xmm1
subsd (%r13), %xmm0
subsd 0x8(%r13), %xmm1
mulsd %xmm1, %xmm1
mulsd %xmm0, %xmm0
addsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x2a756
sqrtsd %xmm0, %xmm0
jmp 0x2a75b
callq 0x93c0
movsd 0x10(%r15), %xmm4
movsd 0x10(%r13), %xmm3
movapd %xmm4, %xmm1
addsd %xmm3, %xmm1
xorl %eax, %eax
ucomisd %xmm1, %xmm0
ja 0x2a78d
movapd %xmm4, %xmm1
subsd %xmm3, %xmm1
andpd 0x40889(%rip), %xmm1    # 0x6b010
ucomisd %xmm0, %xmm1
jbe 0x2a79c
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
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 0x40875(%rip), %xmm9    # 0x6b080
movapd %xmm0, %xmm6
subsd %xmm4, %xmm6
subsd %xmm3, %xmm6
andpd 0x407f1(%rip), %xmm6    # 0x6b010
mulsd %xmm5, %xmm9
movsd (%r14), %xmm3
ucomisd %xmm6, %xmm3
jae 0x2a93c
subsd %xmm1, %xmm0
ucomisd %xmm0, %xmm3
jae 0x2a93c
mulsd %xmm5, %xmm5
subsd %xmm2, %xmm5
movsd 0x41f37(%rip), %xmm0    # 0x6c788
mulsd %xmm7, %xmm0
mulsd %xmm5, %xmm0
movapd %xmm9, %xmm1
mulsd %xmm9, %xmm1
addsd %xmm0, %xmm1
xorps %xmm5, %xmm5
sqrtsd %xmm1, %xmm5
xorpd %xmm2, %xmm2
ucomisd %xmm2, %xmm1
movapd %xmm5, %xmm0
movapd %xmm9, -0x40(%rbp)
movsd %xmm7, -0x48(%rbp)
jae 0x2a8b3
movapd %xmm1, %xmm0
movapd %xmm5, -0x60(%rbp)
movsd %xmm1, -0x30(%rbp)
callq 0x93c0
xorpd %xmm2, %xmm2
movsd -0x30(%rbp), %xmm1
movsd -0x48(%rbp), %xmm7
movapd -0x40(%rbp), %xmm9
movapd -0x60(%rbp), %xmm5
subsd %xmm9, %xmm0
divsd %xmm7, %xmm0
mulsd 0x40fb4(%rip), %xmm0    # 0x6b878
ucomisd %xmm2, %xmm1
movsd %xmm0, -0x30(%rbp)
jae 0x2a8ec
movapd %xmm1, %xmm0
callq 0x93c0
movsd -0x48(%rbp), %xmm7
movapd -0x40(%rbp), %xmm9
movapd %xmm0, %xmm5
movsd -0x30(%rbp), %xmm0
xorpd 0x4072c(%rip), %xmm5    # 0x6b020
subsd %xmm9, %xmm5
divsd %xmm7, %xmm5
mulsd 0x40f73(%rip), %xmm5    # 0x6b878
movapd %xmm0, %xmm1
mulsd %xmm0, %xmm1
movsd 0x40743(%rip), %xmm2    # 0x6b058
movapd %xmm2, %xmm0
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
movapd %xmm5, -0x60(%rbp)
jb 0x2a9ff
xorps %xmm6, %xmm6
sqrtsd %xmm0, %xmm6
jmp 0x2aa19
divsd %xmm7, %xmm9
mulsd 0x4073e(%rip), %xmm9    # 0x6b088
movapd %xmm9, %xmm1
mulsd %xmm9, %xmm1
movsd 0x406fc(%rip), %xmm0    # 0x6b058
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x2a970
sqrtsd %xmm0, %xmm0
jmp 0x2a981
movapd %xmm9, -0x40(%rbp)
callq 0x93c0
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 0x40635(%rip), %xmm9    # 0x6b010
movl $0x1, %eax
ucomisd (%r14), %xmm9
jb 0x2a78d
movsd 0x8(%r15), %xmm1
subsd %xmm0, %xmm1
movsd %xmm1, 0x8(%rbx)
jmp 0x2a78d
callq 0x93c0
xorpd %xmm1, %xmm1
movsd 0x40648(%rip), %xmm2    # 0x6b058
movapd -0x60(%rbp), %xmm5
movapd %xmm0, %xmm6
movapd %xmm5, %xmm0
mulsd %xmm5, %xmm0
subsd %xmm0, %xmm2
ucomisd %xmm1, %xmm2
jb 0x2aa34
xorps %xmm0, %xmm0
sqrtsd %xmm2, %xmm0
jmp 0x2aa4c
movapd %xmm2, %xmm0
movsd %xmm6, -0x40(%rbp)
callq 0x93c0
movsd -0x40(%rbp), %xmm6
movapd -0x60(%rbp), %xmm5
movsd 0x10(%r15), %xmm1
movsd -0x30(%rbp), %xmm2
mulsd %xmm1, %xmm2
addsd (%r15), %xmm2
movsd %xmm2, (%rbx)
mulsd %xmm1, %xmm5
addsd (%r15), %xmm5
movsd %xmm5, (%r12)
mulsd %xmm1, %xmm6
movsd 0x8(%r15), %xmm2
addsd %xmm6, %xmm2
movsd %xmm2, 0x8(%rbx)
mulsd %xmm1, %xmm0
addsd 0x8(%r15), %xmm0
movsd %xmm0, 0x8(%r12)
movsd (%rbx), %xmm0
movsd 0x8(%rbx), %xmm2
movsd (%r13), %xmm1
movsd 0x10(%r13), %xmm3
movapd %xmm0, %xmm4
subsd 0x8(%r13), %xmm2
subsd %xmm1, %xmm4
mulsd %xmm2, %xmm2
mulsd %xmm4, %xmm4
addsd %xmm2, %xmm4
mulsd %xmm3, %xmm3
subsd %xmm3, %xmm4
andpd 0x4053a(%rip), %xmm4    # 0x6b010
ucomisd (%r14), %xmm4
jb 0x2aaec
movsd 0x8(%r15), %xmm2
subsd %xmm6, %xmm2
movsd %xmm2, 0x8(%rbx)
movapd %xmm5, %xmm2
subsd %xmm1, %xmm2
movsd 0x8(%r12), %xmm1
subsd 0x8(%r13), %xmm1
mulsd %xmm1, %xmm1
mulsd %xmm2, %xmm2
addsd %xmm1, %xmm2
movsd 0x10(%r13), %xmm1
mulsd %xmm1, %xmm1
subsd %xmm1, %xmm2
andpd 0x404ed(%rip), %xmm2    # 0x6b010
ucomisd (%r14), %xmm2
jb 0x2ab3b
movsd 0x8(%r15), %xmm1
subsd %xmm6, %xmm1
movsd %xmm1, 0x8(%r12)
subsd %xmm5, %xmm0
movsd 0x8(%rbx), %xmm1
subsd 0x8(%r12), %xmm1
mulsd %xmm1, %xmm1
mulsd %xmm0, %xmm0
addsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x2ab67
sqrtsd %xmm0, %xmm0
jmp 0x2ab6c
callq 0x93c0
movsd (%r14), %xmm1
movl $0x2, %eax
ucomisd %xmm0, %xmm1
jb 0x2a78d
movsd 0x8(%rbx), %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x2abaa
movsd 0x8(%r12), %xmm0
xorpd 0x40482(%rip), %xmm0    # 0x6b020
movlpd %xmm0, 0x8(%r12)
jmp 0x2a78d
xorpd 0x4046e(%rip), %xmm0    # 0x6b020
movlpd %xmm0, 0x8(%rbx)
jmp 0x2a78d