// File: /workspace/github_cpp_makefile_star2_O2/tomfunkhouser[P]gaps/pkgs/R2Shapes/R2Polygon.cpp
// Function: gaps::R2Polygon::Normal(int, double) const
R2Vector R2Polygon::
Normal(int k, RNLength radius) const
{
  // Just checking
  if (npoints < 3) return R2zero_vector;

  // Find first point
  R2Point *pointA = &points[(k - 1 + npoints) % npoints];
  if (radius > 0) {
    R2Point *prev = pointA;
    RNLength distance = R2Distance(*pointA, points[k]);
    if (distance < radius) {
      for (int i = 2;  i < npoints/3; i++) {
        pointA = &points[(k - i + npoints) % npoints];
        distance += R2Distance(*pointA, *prev);
        if (distance >= radius) break;
        prev = pointA;
      }
    }
  }

  // Find second point
  R2Point *pointB = &points[(k + 1) % npoints];
  if (radius > 0) {
    R2Point *prev = pointB;
    RNLength distance = R2Distance(*pointB, points[k]);
    if (distance < radius) {
      for (int i = 2;  i < npoints/3; i++) {
        pointB = &points[(k + i) % npoints];
        distance += R2Distance(*pointB, *prev);
        if (distance >= radius) break;
        prev = pointB;
      }
    }
  }

  // Return normal
  R2Vector vector = *pointB - *pointA;
  R2Vector n(vector[1], -vector[0]);
  n.Normalize();

  // Flip if polygon is clockwise
  if (clockwise) n = -n;

  // Return normal
  return n;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movq %rdi, %rbx
movl 0x10(%rsi), %ecx
cmpl $0x2, %ecx
jg 0x5b6e3
leaq 0x3f2e2(%rip), %rsi     # 0x9a9b8
movq %rbx, %rdi
callq 0x5f8be
jmp 0x5b88a
movl %edx, %r15d
movq %rsi, %r14
movq 0x8(%rsi), %rsi
leal (%r15,%rcx), %eax
decl %eax
cltd
idivl %ecx
movslq %edx, %r13
shlq $0x4, %r13
addq %rsi, %r13
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
movslq %r15d, %rax
movsd %xmm0, 0x8(%rsp)
movq %rbx, 0x20(%rsp)
movq %rax, 0x18(%rsp)
jbe 0x5b794
shlq $0x4, %rax
addq %rax, %rsi
movq %r13, %rdi
callq 0x63469
movapd %xmm0, %xmm1
movsd 0x8(%rsp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x5b794
leal -0x2(%r15), %ebp
pushq $0x2
popq %rbx
movl 0x10(%r14), %ecx
movl %ecx, %eax
cltd
pushq $0x3
popq %rsi
idivl %esi
cmpl %eax, %ebx
jge 0x5b794
leal (%rcx,%rbp), %eax
cltd
idivl %ecx
movslq %edx, %r12
shlq $0x4, %r12
addq 0x8(%r14), %r12
movq %r12, %rdi
movq %r13, %rsi
movsd %xmm1, 0x10(%rsp)
callq 0x63469
movsd 0x10(%rsp), %xmm1
addsd %xmm0, %xmm1
movsd 0x8(%rsp), %xmm0
incl %ebx
decl %ebp
ucomisd %xmm0, %xmm1
movq %r12, %r13
jb 0x5b743
jmp 0x5b797
movq %r13, %r12
movq 0x8(%r14), %rsi
leal 0x1(%r15), %eax
cltd
idivl 0x10(%r14)
movslq %edx, %r13
shlq $0x4, %r13
addq %rsi, %r13
ucomisd 0x37a32(%rip), %xmm0    # 0x931e8
jbe 0x5b82b
movq 0x18(%rsp), %rax
shlq $0x4, %rax
addq %rax, %rsi
movq %r13, %rdi
callq 0x63469
movapd %xmm0, %xmm1
movsd 0x8(%rsp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x5b82b
pushq $0x2
popq %rbx
movl 0x10(%r14), %ecx
movl %ecx, %eax
cltd
pushq $0x3
popq %rsi
idivl %esi
cmpl %eax, %ebx
jge 0x5b82b
leal (%r15,%rbx), %eax
cltd
idivl %ecx
movslq %edx, %rbp
shlq $0x4, %rbp
addq 0x8(%r14), %rbp
movq %rbp, %rdi
movq %r13, %rsi
movsd %xmm1, 0x10(%rsp)
callq 0x63469
movsd 0x10(%rsp), %xmm1
addsd %xmm0, %xmm1
incl %ebx
ucomisd 0x8(%rsp), %xmm1
movq %rbp, %r13
jb 0x5b7df
jmp 0x5b82e
movq %r13, %rbp
leaq 0x38(%rsp), %r15
movq %r15, %rdi
movq %rbp, %rsi
movq %r12, %rdx
callq 0x5f7c9
movsd 0x8(%r15), %xmm0
movsd (%r15), %xmm1
xorps 0x377dd(%rip), %xmm1    # 0x93030
movq 0x20(%rsp), %rbx
movq %rbx, %rdi
callq 0x5f8b4
movq %rbx, %rdi
callq 0x5faa0
cmpl $0x0, 0x40(%r14)
je 0x5b88a
leaq 0x28(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x5fd59
movq %rbx, %rdi
movq %r14, %rsi
callq 0x5fbfa
movq %rbx, %rax
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq