// File: wrighteagle2d[P]wrighteaglebase/Debug/../src/WorldState.cpp
// Function: WorldStateUpdater::ComputeSelfDir(double&)
bool WorldStateUpdater::ComputeSelfDir(double &angle) {
  //计算可以看到的线，如果有两个则表示在球场外
  int sample_line = SL_NONE; // mark
  int num = 0;
  double min = 10000; //初始值
  for (int i = 0; i < SL_MAX; i++) {
    if (mpObserver->SideLine((SideLineType)i).GetDir().time() ==
        mpObserver->LatestSightTime()) {
      //必须使用最近的一条线
      if (mpObserver->SideLine((SideLineType)i).Dist() < min) {
        sample_line = i;
        min = mpObserver->SideLine((SideLineType)i).Dist();
      }
      num++;
    }
  }

  //看不到
  if (num == 0) {
    return false;
  }

  //计算公式见USTC_Material 第七章

  // lineRelativeAngle = (line_dir < 0 ) ? (90 + line_dir ) : (line_dir – 90)
  angle = mpObserver->SideLine((SideLineType)sample_line).Dir();

  angle = angle < 0 ? 90 + angle : angle - 90;

  // neckGlobalAngle = lineGlobalAngle – lineRelativeAngle
  angle =
      (mpObserver->SideLine((SideLineType)sample_line)).GlobalPosition().Dir() -
      angle;

  //如果同时看到两条线就表示在场外 加上180
  //具体可参加源码MemPosition.c的Update_self_seen函数处理
  if (num >= 2) {
    angle = 180 + angle;
  }

  //保证角度在180 到 -180 之间
  if (angle > 180) {
    angle -= 360;
  } else if (angle < -180) {
    angle += 360;
  }

  return true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x38(%rbp)
movl $0x5, -0x1c(%rbp)
movl $0x0, -0x20(%rbp)
movsd 0xd732(%rip), %xmm0     # 0xc2ee0
movsd %xmm0, -0x28(%rbp)
movl $0x0, -0x2c(%rbp)
cmpl $0x4, -0x2c(%rbp)
jge 0xb586d
movq -0x38(%rbp), %rax
movq (%rax), %rdi
movl -0x2c(%rbp), %esi
callq 0xbdae0
movq %rax, %rdi
callq 0xbd1d0
movq %rax, %rdi
callq 0x28aa0
movq %rax, %rcx
movq -0x38(%rbp), %rax
movq %rcx, -0x40(%rbp)
movq (%rax), %rdi
callq 0xbc870
movq -0x40(%rbp), %rdi
movq %rax, %rsi
callq 0x120a0
testb $0x1, %al
jne 0xb5808
jmp 0xb585d
movq -0x38(%rbp), %rax
movq (%rax), %rdi
movl -0x2c(%rbp), %esi
callq 0xbdae0
movq %rax, %rdi
callq 0xbd3a0
movsd (%rax), %xmm1
movsd -0x28(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0xb5854
movq -0x38(%rbp), %rax
movl -0x2c(%rbp), %ecx
movl %ecx, -0x1c(%rbp)
movq (%rax), %rdi
movl -0x2c(%rbp), %esi
callq 0xbdae0
movq %rax, %rdi
callq 0xbd3a0
movsd (%rax), %xmm0
movsd %xmm0, -0x28(%rbp)
movl -0x20(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x20(%rbp)
jmp 0xb585f
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2c(%rbp)
jmp 0xb57ba
cmpl $0x0, -0x20(%rbp)
jne 0xb587c
movb $0x0, -0x1(%rbp)
jmp 0xb5992
movq -0x38(%rbp), %rax
movq (%rax), %rdi
movl -0x1c(%rbp), %esi
callq 0xbdae0
movq %rax, %rdi
callq 0xbd470
movsd (%rax), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, (%rax)
movq -0x18(%rbp), %rax
xorps %xmm0, %xmm0
ucomisd (%rax), %xmm0
jbe 0xb58c3
movq -0x18(%rbp), %rax
movsd 0xb788(%rip), %xmm0     # 0xc1040
addsd (%rax), %xmm0
movsd %xmm0, -0x48(%rbp)
jmp 0xb58dc
movq -0x18(%rbp), %rax
movsd (%rax), %xmm0
movsd 0xb76d(%rip), %xmm1     # 0xc1040
subsd %xmm1, %xmm0
movsd %xmm0, -0x48(%rbp)
movq -0x38(%rbp), %rax
movsd -0x48(%rbp), %xmm0
movq -0x18(%rbp), %rcx
movsd %xmm0, (%rcx)
movq (%rax), %rdi
movl -0x1c(%rbp), %esi
callq 0xbdae0
movq %rax, %rdi
callq 0xbdb10
movq %rax, %rdi
callq 0x10520
movq -0x18(%rbp), %rax
subsd (%rax), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, (%rax)
cmpl $0x2, -0x20(%rbp)
jl 0xb5936
movq -0x18(%rbp), %rax
movsd 0xb6fe(%rip), %xmm0     # 0xc1028
addsd (%rax), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, (%rax)
movq -0x18(%rbp), %rax
movsd (%rax), %xmm0
movsd 0xb6e2(%rip), %xmm1     # 0xc1028
ucomisd %xmm1, %xmm0
jbe 0xb5966
movq -0x18(%rbp), %rax
movsd (%rax), %xmm0
movsd 0xb6ec(%rip), %xmm1     # 0xc1048
subsd %xmm1, %xmm0
movsd %xmm0, (%rax)
jmp 0xb598e
movq -0x18(%rbp), %rax
movsd 0xb6be(%rip), %xmm0     # 0xc1030
ucomisd (%rax), %xmm0
jbe 0xb598c
movq -0x18(%rbp), %rax
movsd 0xb6c4(%rip), %xmm0     # 0xc1048
addsd (%rax), %xmm0
movsd %xmm0, (%rax)
jmp 0xb598e
movb $0x1, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x50, %rsp
popq %rbp
retq
nopl (%rax)