示例#1
0
文件: nav.c 项目: bartremes/paparazzi
/** Navigates around (x, y). Clockwise iff radius > 0 */
void nav_circle_XY(float x, float y, float radius)
{
  struct EnuCoor_f *pos = stateGetPositionEnu_f();
  float last_trigo_qdr = nav_circle_trigo_qdr;
  nav_circle_trigo_qdr = atan2f(pos->y - y, pos->x - x);
  float sign_radius = radius > 0 ? 1 : -1;

  if (nav_in_circle) {
    float trigo_diff = nav_circle_trigo_qdr - last_trigo_qdr;
    NormRadAngle(trigo_diff);
    nav_circle_radians += trigo_diff;
    trigo_diff *= - sign_radius;
    if (trigo_diff > 0) { // do not rewind if the change in angle is in the opposite sense than nav_radius
      nav_circle_radians_no_rewind += trigo_diff;
    }
  }

  float dist2_center = DistanceSquare(pos->x, pos->y, x, y);
  float dist_carrot = CARROT * NOMINAL_AIRSPEED;

  radius += -nav_shift;

  float abs_radius = fabs(radius);

  /** Computes a prebank. Go straight if inside or outside the circle */
  circle_bank =
    (dist2_center > Square(abs_radius + dist_carrot)
     || dist2_center < Square(abs_radius - dist_carrot)) ?
    0 :
    atanf(stateGetHorizontalSpeedNorm_f() * stateGetHorizontalSpeedNorm_f() / (NAV_GRAVITY * radius));

  float carrot_angle = dist_carrot / abs_radius;
  carrot_angle = Min(carrot_angle, M_PI / 4);
  carrot_angle = Max(carrot_angle, M_PI / 16);
  float alpha_carrot = nav_circle_trigo_qdr - sign_radius * carrot_angle;
  horizontal_mode = HORIZONTAL_MODE_CIRCLE;
  float radius_carrot = abs_radius;
  if (nav_mode == NAV_MODE_COURSE) {
    radius_carrot += (abs_radius / cosf(carrot_angle) - abs_radius);
  }
  fly_to_xy(x + cosf(alpha_carrot)*radius_carrot,
            y + sinf(alpha_carrot)*radius_carrot);
  nav_in_circle = true;
  nav_circle_x = x;
  nav_circle_y = y;
  nav_circle_radius = radius;
}
示例#2
0
bool CConvoy::IsAtCurrentWaypoint()
{
   bool Result = false;

   CVector3f Waypt = *(m_Waypoints[m_CurrentWaypointIndex].m_Frame.GetPosition());
   CVector3f UnitPos = GetSphere()->Center;

   Waypt.y = 0.0f;
   UnitPos.y = 0.0f;

   float Dist = DistanceSquare(&Waypt, &UnitPos);

   if (Dist < 30.0f * 30.0f)
      Result = true;

   return Result;
}
示例#3
0
/** Navigates around (x, y). Clockwise iff radius > 0 */
void nav_circle_XY(float x, float y, float radius) {
    float last_trigo_qdr = nav_circle_trigo_qdr;
    nav_circle_trigo_qdr = atan2(estimator_y - y, estimator_x - x);

    if (nav_in_circle) {
        float trigo_diff = nav_circle_trigo_qdr - last_trigo_qdr;
        NormRadAngle(trigo_diff);
        nav_circle_radians += trigo_diff;
    }

    float dist2_center = DistanceSquare(estimator_x, estimator_y, x, y);
    float dist_carrot = CARROT*NOMINAL_AIRSPEED;
    float sign_radius = radius > 0 ? 1 : -1;

    radius += -nav_shift;

    float abs_radius = fabs(radius);

    /** Computes a prebank. Go straight if inside or outside the circle */
    circle_bank =
        (dist2_center > Square(abs_radius + dist_carrot)
         || dist2_center < Square(abs_radius - dist_carrot)) ?
        0 :
        atan(estimator_hspeed_mod*estimator_hspeed_mod / (G*radius));

    float carrot_angle = dist_carrot / abs_radius;
    carrot_angle = Min(carrot_angle, M_PI/4);
    carrot_angle = Max(carrot_angle, M_PI/16);
    float alpha_carrot = nav_circle_trigo_qdr - sign_radius * carrot_angle;
    horizontal_mode = HORIZONTAL_MODE_CIRCLE;
    float radius_carrot = abs_radius;
    if (nav_mode == NAV_MODE_COURSE)
        radius_carrot += (abs_radius / cos(carrot_angle) - abs_radius);
    fly_to_xy(x+cos(alpha_carrot)*radius_carrot,
              y+sin(alpha_carrot)*radius_carrot);
    nav_in_circle = TRUE;
    nav_circle_x = x;
    nav_circle_y = y;
    nav_circle_radius = radius;
}
示例#4
0
int CConvoy::TargetRelativePosition()
{
   int TargetPosition = 0;
     
   const Sphere* pMySphere = GetSphere();

   CVector3f TargetOrigin;
   CVector3f MyOrigin;
   CVector3f PToP;
   CVector3f MyLookAt;
   CVector3f Result;

   TargetOrigin   = *(m_Waypoints[m_CurrentWaypointIndex].m_Frame.GetPosition());

   MyOrigin    = pMySphere->Center;

   const CObjFrame* Frame = GetFrame(0);

   Ray         ShotTrajectory;
   Sphere TargetSphere;

   TargetSphere.Center = TargetOrigin;

   float       Scale = 1.0f;

   float       Dist = DistanceSquare(&MyOrigin, &TargetOrigin);
/*
   if (Dist > 100.0f * 100.0f)
   {
      Scale = Dist / 100.0f * 100.0f ;

      if (Scale > 5.0f)
         Scale = 5.0f;
   }
   */

   TargetSphere.Radius = 40.0f * Scale;

   Frame->GetPosition(&(ShotTrajectory.Origin));
   Frame->GetForward(&(ShotTrajectory.Direction));

   Vec3fNormalize(&(ShotTrajectory.Direction), &(ShotTrajectory.Direction));   

   if (RayToSphere(&ShotTrajectory, &TargetSphere))
      return TargetPosition;

   Vec3fSubtract(&PToP, &TargetOrigin, &MyOrigin);
   Frame->GetForward(&MyLookAt);

   MyLookAt.y = 0.0f;
   PToP.y = 0.0f;

   Vec3fCrossProduct(&Result, &MyLookAt, &PToP);

   if (Result.y > 0.0f)
      TargetPosition = 1;
   else if (Result.y < 0.0f)
      TargetPosition = -1;

   return TargetPosition;
}
示例#5
0
void CEnemy::TargetEnemy()
{
   CGameObject* pCurrentObj = GetWhoIsAroundMe2(400.0f);
   CGameObject* pFirstGuy = pCurrentObj;

   m_CurrentTarget = &g_Player;

   float Dist = DistanceSquare(&(GetSphere()->Center), &(g_Player.GetSphere()->Center));
   float TempDist;

   if (pCurrentObj != NULL)
   {
      do 
      {  
         switch(pCurrentObj->GetType())
         {
            case OBJ_BUILDING:
            case OBJ_BUILDING2:
            case OBJ_BUILDING3:
            {
               TempDist = DistanceSquare(&(GetSphere()->Center), &(pCurrentObj->GetSphere()->Center));
               if (TempDist < Dist)
               {
                  m_CurrentTarget = pCurrentObj;
                  Dist = TempDist;
               }

               break;
            };

            case OBJ_FTURRET:
            {
               TempDist = DistanceSquare(&(GetSphere()->Center), &(pCurrentObj->GetSphere()->Center));
               if (TempDist < Dist)
               {
                  m_CurrentTarget = pCurrentObj;
                  Dist = TempDist;
               }
               break;
            };

            case OBJ_CONVOY:
            {
               TempDist = DistanceSquare(&(GetSphere()->Center), &(pCurrentObj->GetSphere()->Center));
               if (TempDist < Dist)
               {
                  m_CurrentTarget = pCurrentObj;
                  Dist = TempDist;
               }
               break;
            };

            default:
               break;
         };

         pCurrentObj = pCurrentObj->m_GuyNextToMe;

      } while (pCurrentObj != NULL);
   }

   ClearWhoIsAroundMe(pFirstGuy);
}
示例#6
0
文件: vector.hpp 项目: kurpicz/thrill
 Type Distance(const Vector& b) const {
     return std::sqrt(DistanceSquare(b));
 }
示例#7
0
double Distance(const Vector2D& vecA, const Vector2D& vecB) {
    return sqrt( DistanceSquare(vecA, vecB) );
}