// File: /workspace/github_cpp_makefile_star2_O3/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 %rsi, %r13
movq %rdi, %r15
movsd (%rdi), %xmm9
movsd 0x8(%rdi), %xmm0
subsd (%rsi), %xmm9
subsd 0x8(%rsi), %xmm0
movq %rdx, %rbx
movapd %xmm0, %xmm1
mulsd %xmm0, %xmm1
movapd %xmm9, %xmm4
mulsd %xmm9, %xmm4
addsd %xmm1, %xmm4
sqrtsd %xmm4, %xmm2
movsd (%r8), %xmm3
ucomisd %xmm2, %xmm3
movsd 0x10(%rdi), %xmm6
movsd 0x10(%rsi), %xmm1
jb 0x29e3a
movapd %xmm6, %xmm5
subsd %xmm1, %xmm5
andpd 0x3f1e1(%rip), %xmm5    # 0x69010
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
ucomisd %xmm5, %xmm3
jae 0x29e60
movapd %xmm6, %xmm5
addsd %xmm1, %xmm5
xorl %eax, %eax
ucomisd %xmm5, %xmm2
ja 0x29e60
movapd %xmm6, %xmm5
subsd %xmm1, %xmm5
andpd 0x3f1b6(%rip), %xmm5    # 0x69010
ucomisd %xmm2, %xmm5
jbe 0x29e6f
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movapd %xmm6, %xmm7
addsd %xmm6, %xmm7
mulsd %xmm7, %xmm9
mulsd %xmm7, %xmm0
movapd %xmm2, %xmm7
subsd %xmm6, %xmm7
mulsd %xmm6, %xmm6
subsd %xmm1, %xmm7
mulsd %xmm1, %xmm1
subsd %xmm6, %xmm1
subsd %xmm4, %xmm1
mulsd %xmm0, %xmm0
movapd %xmm9, %xmm4
mulsd %xmm9, %xmm4
addsd %xmm0, %xmm4
mulsd 0x3f1c9(%rip), %xmm9    # 0x69080
mulsd %xmm1, %xmm9
andpd 0x3f14c(%rip), %xmm7    # 0x69010
ucomisd %xmm7, %xmm3
jae 0x29fdf
subsd %xmm5, %xmm2
ucomisd %xmm2, %xmm3
jae 0x29fdf
mulsd %xmm1, %xmm1
subsd %xmm0, %xmm1
movsd 0x4088c(%rip), %xmm0    # 0x6a778
mulsd %xmm4, %xmm0
mulsd %xmm1, %xmm0
movapd %xmm9, %xmm1
mulsd %xmm9, %xmm1
addsd %xmm0, %xmm1
sqrtsd %xmm1, %xmm8
xorpd %xmm2, %xmm2
ucomisd %xmm2, %xmm1
movapd %xmm8, %xmm0
movapd %xmm9, -0x40(%rbp)
movsd %xmm4, -0x48(%rbp)
jae 0x29f4f
movapd %xmm1, %xmm0
movapd %xmm8, -0x60(%rbp)
movsd %xmm1, -0x30(%rbp)
callq 0x93c0
xorpd %xmm2, %xmm2
movsd -0x30(%rbp), %xmm1
movsd -0x48(%rbp), %xmm4
movapd -0x40(%rbp), %xmm9
movapd -0x60(%rbp), %xmm8
subsd %xmm9, %xmm0
divsd %xmm4, %xmm0
mulsd 0x3f918(%rip), %xmm0    # 0x69878
ucomisd %xmm2, %xmm1
movsd %xmm0, -0x30(%rbp)
jae 0x29f89
movapd %xmm1, %xmm0
callq 0x93c0
movsd -0x48(%rbp), %xmm4
movapd -0x40(%rbp), %xmm9
movapd %xmm0, %xmm8
movsd -0x30(%rbp), %xmm0
xorpd 0x3f08e(%rip), %xmm8    # 0x69020
subsd %xmm9, %xmm8
divsd %xmm4, %xmm8
mulsd 0x3f8d3(%rip), %xmm8    # 0x69878
movapd %xmm0, %xmm1
mulsd %xmm0, %xmm1
movsd 0x3f0a3(%rip), %xmm2    # 0x69058
movapd %xmm2, %xmm0
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
movapd %xmm8, -0x60(%rbp)
jb 0x2a0a2
xorps %xmm9, %xmm9
sqrtsd %xmm0, %xmm9
jmp 0x2a0be
divsd %xmm4, %xmm9
mulsd 0x3f09b(%rip), %xmm9    # 0x69088
movapd %xmm9, %xmm1
mulsd %xmm9, %xmm1
movsd 0x3f059(%rip), %xmm0    # 0x69058
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x2a013
sqrtsd %xmm0, %xmm0
jmp 0x2a024
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 0x3ef92(%rip), %xmm9    # 0x69010
movl $0x1, %eax
ucomisd (%r14), %xmm9
jb 0x29e60
movsd 0x8(%r15), %xmm1
subsd %xmm0, %xmm1
movsd %xmm1, 0x8(%rbx)
jmp 0x29e60
callq 0x93c0
xorpd %xmm1, %xmm1
movsd 0x3efa5(%rip), %xmm2    # 0x69058
movapd -0x60(%rbp), %xmm8
movapd %xmm0, %xmm9
movapd %xmm8, %xmm0
mulsd %xmm8, %xmm0
subsd %xmm0, %xmm2
ucomisd %xmm1, %xmm2
jb 0x2a0db
xorps %xmm0, %xmm0
sqrtsd %xmm2, %xmm0
jmp 0x2a0f6
movapd %xmm2, %xmm0
movsd %xmm9, -0x40(%rbp)
callq 0x93c0
movsd -0x40(%rbp), %xmm9
movapd -0x60(%rbp), %xmm8
movsd 0x10(%r15), %xmm1
movsd -0x30(%rbp), %xmm2
mulsd %xmm1, %xmm2
addsd (%r15), %xmm2
movsd %xmm2, (%rbx)
mulsd %xmm1, %xmm8
addsd (%r15), %xmm8
movsd %xmm8, (%r12)
mulsd %xmm1, %xmm9
movsd 0x8(%r15), %xmm2
addsd %xmm9, %xmm2
movsd %xmm2, 0x8(%rbx)
mulsd %xmm1, %xmm0
addsd 0x8(%r15), %xmm0
movsd %xmm0, 0x8(%r12)
movsd (%rbx), %xmm2
movsd 0x8(%rbx), %xmm1
movsd (%r13), %xmm4
movsd 0x8(%r13), %xmm5
movapd %xmm2, %xmm7
subsd %xmm4, %xmm7
movapd %xmm1, %xmm3
subsd %xmm5, %xmm3
mulsd %xmm3, %xmm3
mulsd %xmm7, %xmm7
addsd %xmm3, %xmm7
movsd 0x10(%r13), %xmm6
movapd %xmm6, %xmm3
mulsd %xmm6, %xmm3
subsd %xmm3, %xmm7
andpd 0x3ee81(%rip), %xmm7    # 0x69010
movsd (%r14), %xmm3
ucomisd %xmm3, %xmm7
jb 0x2a1c2
movsd 0x8(%r15), %xmm1
subsd %xmm9, %xmm1
movsd %xmm1, 0x8(%rbx)
movsd 0x8(%r12), %xmm0
movsd 0x8(%r13), %xmm5
movsd 0x10(%r13), %xmm6
movsd (%r14), %xmm3
movapd 0x3ee56(%rip), %xmm7    # 0x69020
xorpd %xmm6, %xmm7
mulsd %xmm6, %xmm7
movapd %xmm8, %xmm6
subsd %xmm4, %xmm6
movapd %xmm0, %xmm4
subsd %xmm5, %xmm4
mulsd %xmm4, %xmm4
mulsd %xmm6, %xmm6
addsd %xmm4, %xmm6
addsd %xmm7, %xmm6
andpd 0x3ee15(%rip), %xmm6    # 0x69010
ucomisd %xmm3, %xmm6
jb 0x2a21d
movsd 0x8(%r15), %xmm0
subsd %xmm9, %xmm0
movsd %xmm0, 0x8(%r12)
movsd 0x8(%rbx), %xmm1
movsd (%r14), %xmm3
subsd %xmm8, %xmm2
movapd %xmm1, %xmm4
subsd %xmm0, %xmm4
mulsd %xmm4, %xmm4
mulsd %xmm2, %xmm2
addsd %xmm4, %xmm2
sqrtsd %xmm2, %xmm2
movl $0x2, %eax
ucomisd %xmm2, %xmm3
jb 0x29e60
xorpd %xmm2, %xmm2
ucomisd %xmm2, %xmm1
jbe 0x2a267
xorpd 0x3edc5(%rip), %xmm0    # 0x69020
movlpd %xmm0, 0x8(%r12)
jmp 0x29e60
xorpd 0x3edb1(%rip), %xmm1    # 0x69020
movlpd %xmm1, 0x8(%rbx)
jmp 0x29e60
nop