// File: BartMassey[P]ancient-raytracer/poly.cc
// Function: poly::contains(point&)
int poly::contains( point &v )
{
  int pn = np;
  float xx = X(v);
  float yy = Y(v);
  int nr = 0;
  int i, j;
  float x0,x1,y0,y1,xl,xr,yi,yj;
  point *r[4];

  for( i = 0; i < pn; i++ ) {
    j = i + 1;
    if( j >= pn )
      j -= pn;
    yi = Y(get(i));
    yj = Y(get(j));
    if( yi < yy && yj >= yy ) {
      r[ nr++ ] = &get(i);
      r[ nr++ ] = &get(j);
    } else if( yi >= yy && yj < yy ) {
      r[ nr++ ] = &get(j);
      r[ nr++ ] = &get(i);
    }
  }
  /* if we haven't found a trapezoid, continue */
  if( nr < 4 )
    return 0;
  /* intercept first line */
  x0 = X(*r[0]);
  y0 = Y(*r[0]);
  x1 = X(*r[1]);
  y1 = Y(*r[1]);
  if( y1 - y0 < TINY ) {
    if( xx < x0 && xx < x1 )
      xl = MIN( x0, x1 );
    else if( xx > x0 && xx > x1 )
      xl = MAX( x0, x1 );
    else
      return 0;
  } else {
      xl = x0 + (x1 - x0) * (yy - y0) / (y1 - y0);
  }
  /* intercept second line */
  x0 = X(*r[2]);
  y0 = Y(*r[2]);
  x1 = X(*r[3]);
  y1 = Y(*r[3]);
  if( y1 - y0 < TINY ) {
    if( xx < x0 && xx < x1 )
      xr = MIN( x0, x1 );
    else if( xx > x0 && xx > x1 )
      xr = MAX( x0, x1 );
    else
      return 0;
  } else {
      xr = x0 + (x1 - x0) * (yy - y0) / (y1 - y0);
  }
  /* containment test */
  if( xl < xr && xl < xx && xx < xr )
    return 1;
  if( xl > xr && xl > xx && xx > xr )
    return 1;
  return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x78(%rbp)
movl 0x18(%rax), %eax
movl %eax, -0x1c(%rbp)
movq -0x18(%rbp), %rdi
callq 0x5080
movss %xmm0, -0x20(%rbp)
movq -0x18(%rbp), %rdi
callq 0x50e0
movss %xmm0, -0x24(%rbp)
movl $0x0, -0x28(%rbp)
movl $0x0, -0x2c(%rbp)
movl -0x2c(%rbp), %eax
cmpl -0x1c(%rbp), %eax
jge 0x43e7
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x30(%rbp)
movl -0x30(%rbp), %eax
cmpl -0x1c(%rbp), %eax
jl 0x42e3
movl -0x1c(%rbp), %ecx
movl -0x30(%rbp), %eax
subl %ecx, %eax
movl %eax, -0x30(%rbp)
movq -0x78(%rbp), %rdi
movl -0x2c(%rbp), %esi
movq (%rdi), %rax
callq *0x50(%rax)
movq %rax, %rdi
callq 0x50e0
movq -0x78(%rbp), %rdi
movss %xmm0, -0x4c(%rbp)
movl -0x30(%rbp), %esi
movq (%rdi), %rax
callq *0x50(%rax)
movq %rax, %rdi
callq 0x50e0
movss %xmm0, -0x50(%rbp)
movss -0x4c(%rbp), %xmm1
movss -0x24(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x4377
movss -0x50(%rbp), %xmm0
ucomiss -0x24(%rbp), %xmm0
jb 0x4377
movq -0x78(%rbp), %rdi
movl -0x2c(%rbp), %esi
movq (%rdi), %rax
callq *0x50(%rax)
movq -0x78(%rbp), %rdi
movq %rax, %rcx
movl -0x28(%rbp), %eax
movl %eax, %edx
addl $0x1, %edx
movl %edx, -0x28(%rbp)
cltq
movq %rcx, -0x70(%rbp,%rax,8)
movl -0x30(%rbp), %esi
movq (%rdi), %rax
callq *0x50(%rax)
movq %rax, %rcx
movl -0x28(%rbp), %eax
movl %eax, %edx
addl $0x1, %edx
movl %edx, -0x28(%rbp)
cltq
movq %rcx, -0x70(%rbp,%rax,8)
jmp 0x43d7
movss -0x4c(%rbp), %xmm0
ucomiss -0x24(%rbp), %xmm0
jb 0x43d5
movss -0x50(%rbp), %xmm1
movss -0x24(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x43d5
movq -0x78(%rbp), %rdi
movl -0x30(%rbp), %esi
movq (%rdi), %rax
callq *0x50(%rax)
movq -0x78(%rbp), %rdi
movq %rax, %rcx
movl -0x28(%rbp), %eax
movl %eax, %edx
addl $0x1, %edx
movl %edx, -0x28(%rbp)
cltq
movq %rcx, -0x70(%rbp,%rax,8)
movl -0x2c(%rbp), %esi
movq (%rdi), %rax
callq *0x50(%rax)
movq %rax, %rcx
movl -0x28(%rbp), %eax
movl %eax, %edx
addl $0x1, %edx
movl %edx, -0x28(%rbp)
cltq
movq %rcx, -0x70(%rbp,%rax,8)
jmp 0x43d7
jmp 0x43d9
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2c(%rbp)
jmp 0x42bb
cmpl $0x4, -0x28(%rbp)
jge 0x43f9
movl $0x0, -0x4(%rbp)
jmp 0x46ce
movq -0x70(%rbp), %rdi
callq 0x5080
movss %xmm0, -0x34(%rbp)
movq -0x70(%rbp), %rdi
callq 0x50e0
movss %xmm0, -0x3c(%rbp)
movq -0x68(%rbp), %rdi
callq 0x5080
movss %xmm0, -0x38(%rbp)
movq -0x68(%rbp), %rdi
callq 0x50e0
movss %xmm0, -0x40(%rbp)
movss -0x40(%rbp), %xmm0
subss -0x3c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x6bf1(%rip), %xmm0     # 0xb038
ucomisd %xmm1, %xmm0
jbe 0x44f3
movss -0x20(%rbp), %xmm1
movss -0x34(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x44a0
movss -0x20(%rbp), %xmm1
movss -0x38(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x44a0
movss -0x34(%rbp), %xmm1
movss -0x38(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x448a
movss -0x34(%rbp), %xmm0
movss %xmm0, -0x7c(%rbp)
jmp 0x4494
movss -0x38(%rbp), %xmm0
movss %xmm0, -0x7c(%rbp)
movss -0x7c(%rbp), %xmm0
movss %xmm0, -0x44(%rbp)
jmp 0x44f1
movss -0x20(%rbp), %xmm0
ucomiss -0x34(%rbp), %xmm0
jbe 0x44e3
movss -0x20(%rbp), %xmm0
ucomiss -0x38(%rbp), %xmm0
jbe 0x44e3
movss -0x34(%rbp), %xmm0
ucomiss -0x38(%rbp), %xmm0
jbe 0x44cd
movss -0x34(%rbp), %xmm0
movss %xmm0, -0x80(%rbp)
jmp 0x44d7
movss -0x38(%rbp), %xmm0
movss %xmm0, -0x80(%rbp)
movss -0x80(%rbp), %xmm0
movss %xmm0, -0x44(%rbp)
jmp 0x44ef
movl $0x0, -0x4(%rbp)
jmp 0x46ce
jmp 0x44f1
jmp 0x4527
movss -0x34(%rbp), %xmm0
movss -0x38(%rbp), %xmm1
subss -0x34(%rbp), %xmm1
movss -0x24(%rbp), %xmm2
subss -0x3c(%rbp), %xmm2
mulss %xmm2, %xmm1
movss -0x40(%rbp), %xmm2
subss -0x3c(%rbp), %xmm2
divss %xmm2, %xmm1
addss %xmm1, %xmm0
movss %xmm0, -0x44(%rbp)
movq -0x60(%rbp), %rdi
callq 0x5080
movss %xmm0, -0x34(%rbp)
movq -0x60(%rbp), %rdi
callq 0x50e0
movss %xmm0, -0x3c(%rbp)
movq -0x58(%rbp), %rdi
callq 0x5080
movss %xmm0, -0x38(%rbp)
movq -0x58(%rbp), %rdi
callq 0x50e0
movss %xmm0, -0x40(%rbp)
movss -0x40(%rbp), %xmm0
subss -0x3c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x6ac3(%rip), %xmm0     # 0xb038
ucomisd %xmm1, %xmm0
jbe 0x4633
movss -0x20(%rbp), %xmm1
movss -0x34(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x45d7
movss -0x20(%rbp), %xmm1
movss -0x38(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x45d7
movss -0x34(%rbp), %xmm1
movss -0x38(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x45bb
movss -0x34(%rbp), %xmm0
movss %xmm0, -0x84(%rbp)
jmp 0x45c8
movss -0x38(%rbp), %xmm0
movss %xmm0, -0x84(%rbp)
movss -0x84(%rbp), %xmm0
movss %xmm0, -0x48(%rbp)
jmp 0x4631
movss -0x20(%rbp), %xmm0
ucomiss -0x34(%rbp), %xmm0
jbe 0x4623
movss -0x20(%rbp), %xmm0
ucomiss -0x38(%rbp), %xmm0
jbe 0x4623
movss -0x34(%rbp), %xmm0
ucomiss -0x38(%rbp), %xmm0
jbe 0x4607
movss -0x34(%rbp), %xmm0
movss %xmm0, -0x88(%rbp)
jmp 0x4614
movss -0x38(%rbp), %xmm0
movss %xmm0, -0x88(%rbp)
movss -0x88(%rbp), %xmm0
movss %xmm0, -0x48(%rbp)
jmp 0x462f
movl $0x0, -0x4(%rbp)
jmp 0x46ce
jmp 0x4631
jmp 0x4667
movss -0x34(%rbp), %xmm0
movss -0x38(%rbp), %xmm1
subss -0x34(%rbp), %xmm1
movss -0x24(%rbp), %xmm2
subss -0x3c(%rbp), %xmm2
mulss %xmm2, %xmm1
movss -0x40(%rbp), %xmm2
subss -0x3c(%rbp), %xmm2
divss %xmm2, %xmm1
addss %xmm1, %xmm0
movss %xmm0, -0x48(%rbp)
movss -0x44(%rbp), %xmm1
movss -0x48(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x469d
movss -0x44(%rbp), %xmm1
movss -0x20(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x469d
movss -0x20(%rbp), %xmm1
movss -0x48(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x469d
movl $0x1, -0x4(%rbp)
jmp 0x46ce
movss -0x44(%rbp), %xmm0
ucomiss -0x48(%rbp), %xmm0
jbe 0x46c7
movss -0x44(%rbp), %xmm0
ucomiss -0x20(%rbp), %xmm0
jbe 0x46c7
movss -0x20(%rbp), %xmm0
ucomiss -0x48(%rbp), %xmm0
jbe 0x46c7
movl $0x1, -0x4(%rbp)
jmp 0x46ce
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x90, %rsp
popq %rbp
retq
nopw (%rax,%rax)