Example #1
0
void TDiagram::Init()
{
   fOffsetX = -999;
   fOffsetY = -999;

   if (fDiagramPosition == dpCenter ) { fOffsetX =  fOffsetY =  0;}
   if (fDiagramPosition == dpTop    ) { fOffsetX =  fpFarParam->Diagram.Shir / 2.0; fOffsetY =  fpFarParam->Diagram.Shir / 2.0; }
   if (fDiagramPosition == dpBottom ) { fOffsetX = -fpFarParam->Diagram.Shir / 2.0; fOffsetY = -fpFarParam->Diagram.Shir / 2.0; }

   if (fDiagramPosition == dpTopLeft    ) { fOffsetX = -fpFarParam->Diagram.Shir * *fpFarParam->Diagram.KoefPlacingDiagram / 2.0; fOffsetY =  fpFarParam->Diagram.Shir * *fpFarParam->Diagram.KoefPlacingDiagram / 2.0; }
   if (fDiagramPosition == dpTopRight   ) { fOffsetX =  fpFarParam->Diagram.Shir * *fpFarParam->Diagram.KoefPlacingDiagram / 2.0; fOffsetY =  fpFarParam->Diagram.Shir * *fpFarParam->Diagram.KoefPlacingDiagram / 2.0; }
   if (fDiagramPosition == dpBottomLeft ) { fOffsetX = -fpFarParam->Diagram.Shir * *fpFarParam->Diagram.KoefPlacingDiagram / 2.0; fOffsetY = -fpFarParam->Diagram.Shir * *fpFarParam->Diagram.KoefPlacingDiagram / 2.0; }
   if (fDiagramPosition == dpBottomRight) { fOffsetX =  fpFarParam->Diagram.Shir * *fpFarParam->Diagram.KoefPlacingDiagram / 2.0; fOffsetY = -fpFarParam->Diagram.Shir * *fpFarParam->Diagram.KoefPlacingDiagram / 2.0; }

  // ------------
   EllipseArray[0].x = -999;
   EllipseArray[0].y = -999;
  // ------------

   DirectionalCosines.cell[1][0] = Ravnosignal_DirectionalCosines.cell[1][0] + sin(fOffsetX);
   DirectionalCosines.cell[2][0] = Ravnosignal_DirectionalCosines.cell[2][0] + sin(fOffsetY);
   DirectionalCosines.cell[0][0] = sqrt(fabs(1 - sqr(DirectionalCosines.cell[1][0]) - sqr(DirectionalCosines.cell[2][0])));

 // --------- Положение цели в системе координат ФАР ---------
   TFloat aQ, aE;
   Calc_Angle(DirectionalCosines, aQ, aE);

   Calc_DeltaQ_DeltaAlfa_Teta_Fi(aQ, aE, Teta, Fi);
}
Example #2
0
//===========================================================================
void TDiagram::Calc_CutEllipse(TFloat aDeltaQ, TFloat aDeltaAlfa)
{
  // --------------------------------------------------------
  // ----------- Система Координат XYZ ----------------------
  // ----------- Ось X напрвлена по нормали -----------------
  // ----------- Плоскость YZ лежит в апертуре антенны ------
  // ----------- Ось Z направлена по вертикали апертуры -----
  // ----------- Ось Х направлена по гГоризонтали апертуры --
  // --------------------------------------------------------
  // ----------- По оси "Y" идет сторона "А" еллипса --------
  // ----------- По оси "Z" идет сторона "B" еллипса --------
  // --------------------------------------------------------

     TMatrix3x3 New_Vector;
     TFloat     a_sin, b_sin;

  // ---------- Реальный углом места луча -----------
      //EllipseArray[0].x = aDeltaQ + fOffsetX;
      //EllipseArray[0].y = aDeltaAlfa + fOffsetY;


      a_sin = sin(atan(fpFarParam->Diagram.Shir / 2.0));
      b_sin = sin(atan(fpFarParam->Diagram.Shir / 2.0));

      eMinAzimOffset = eMinEpsOffset =  999999999;
      eMaxAzimOffset = eMaxEpsOffset = - 999999999;

      for (int i = 0; i <= CountEllipsePoint; i ++ ){
           New_Vector.cell[1][0] = DirectionalCosines.cell[1][0] + a_sin * cos(i/(TFloat) CountEllipsePoint * Two_Pi);
           New_Vector.cell[2][0] = DirectionalCosines.cell[2][0] + b_sin * sin(i/(TFloat) CountEllipsePoint * Two_Pi);
           if (i == 0) New_Vector.cell[1][0] = DirectionalCosines.cell[1][0];


           New_Vector.cell[0][0] = sqrt(fabs(1 - sqr(New_Vector.cell[1][0]) - sqr(New_Vector.cell[2][0])));

           Calc_Angle(New_Vector, EllipseArray[i].x, EllipseArray[i].y);

           if (eMinAzimOffset > EllipseArray[i].x) eMinAzimOffset = EllipseArray[i].x;
           if (eMaxAzimOffset < EllipseArray[i].x) eMaxAzimOffset = EllipseArray[i].x;
           if (eMinEpsOffset  > EllipseArray[i].y) eMinEpsOffset  = EllipseArray[i].y;
           if (eMaxEpsOffset  < EllipseArray[i].y) eMaxEpsOffset  = EllipseArray[i].y;
      }
}
Example #3
0
//===========================================================================
void TTarget::CalcPosition()
{
   TTargetAccess *ta = &TargetAccess[TargetAccess_Count - 1];


   TImpuls aImpuls;
   TFloat  aRo, aFi, aRo1, aRo2;
   TFloat  aTempQ = 0, aTempE = 0;
   TFloat  aSumQ = 0, aSumE = 0;
   // -----------------------------
       aImpuls.E1   = 0;
       aImpuls.E2   = 0;
       aImpuls.Time = 0;


   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   // -------------- Расчет координат по методу №1 ---------------
   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
          for (int i = 0; i < ta->Impuls_Count; i ++) {
                Get_Ro1_Ro2(ta->Impuls[i], aRo1, aRo2);
                //Get_Ro_Fi(ta->Impuls[i], aRo, aFi);

             // ----------------------------------------------------------
                fDirectionalCosines.cell[1][0] = -sin(aRo1) + ___Fixed_Far_Ravnosignal_DirectionalCosines.cell[1][0];
                fDirectionalCosines.cell[2][0] =  sin(aRo2) + ___Fixed_Far_Ravnosignal_DirectionalCosines.cell[2][0];
                fDirectionalCosines.cell[0][0] = sqrt(1 - sqr(fDirectionalCosines.cell[1][0]) - sqr(fDirectionalCosines.cell[2][0]));
                /*fDirectionalCosines.cell[1][0] = sin(aRo*cos(aFi)) + ___Fixed_Far_Ravnosignal_DirectionalCosines.cell[1][0];
                fDirectionalCosines.cell[2][0] = sin(aRo*sin(aFi)) + ___Fixed_Far_Ravnosignal_DirectionalCosines.cell[2][0];
                fDirectionalCosines.cell[0][0] = sqrt(1 - sqr(fDirectionalCosines.cell[1][0]) - sqr(fDirectionalCosines.cell[2][0]));*/

             // --------- Положение цели в системе координат ФАР ---------
                Calc_Angle(fDirectionalCosines, aTempQ, aTempE);
                aSumQ = aSumQ + aTempQ;
                aSumE = aSumE + aTempE;
          }
       // --------- Положение цели в системе координат ФАР ---------
          aSumQ = aSumQ / (TFloat) ta->Impuls_Count;
          aSumE = aSumE / (TFloat) ta->Impuls_Count;
          ta->Coord_M1.Far.Q = aSumQ;
          ta->Coord_M1.Far.E = aSumE;
       // --------- Положение цели в системе координат GEO ---------
          TransformCoordinates(tm_Fixed_Geo_Far, ta->Coord_M1.Far.Q, ta->Coord_M1.Far.E
                                               , ta->Coord_M1.Geo.Q, ta->Coord_M1.Geo.E);

   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   // -------------- Расчет координат по методу №2 "Опредиление координат цели по методу накопления амплитуд"---------------
   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
          for (int i = 0; i < ta->Impuls_Count; i ++) {
             aImpuls.E1 += ta->Impuls[i].E1;
             aImpuls.E2 += ta->Impuls[i].E2;
          }
          aImpuls.E1 = aImpuls.E1 / (TFloat) ta->Impuls_Count;
          aImpuls.E2 = aImpuls.E2 / (TFloat) ta->Impuls_Count;

       // -----------------------------
          Get_Ro1_Ro2(aImpuls, aRo1, aRo2);
          //Get_Ro_Fi(aImpuls, aRo, aFi);

       // -----------------------------
          fDirectionalCosines.cell[1][0] = -sin(aRo1) + ___Fixed_Far_Ravnosignal_DirectionalCosines.cell[1][0];
          fDirectionalCosines.cell[2][0] =  sin(aRo2) + ___Fixed_Far_Ravnosignal_DirectionalCosines.cell[2][0];
          fDirectionalCosines.cell[0][0] = sqrt(1 - sqr(fDirectionalCosines.cell[1][0]) - sqr(fDirectionalCosines.cell[2][0]));
          /*fDirectionalCosines.cell[1][0] = sin(aRo*cos(aFi)) + ___Fixed_Far_Ravnosignal_DirectionalCosines.cell[1][0];
          fDirectionalCosines.cell[2][0] = sin(aRo*sin(aFi)) + ___Fixed_Far_Ravnosignal_DirectionalCosines.cell[2][0];
          fDirectionalCosines.cell[0][0] = sqrt(1 - sqr(fDirectionalCosines.cell[1][0]) - sqr(fDirectionalCosines.cell[2][0]));*/

       // --------- Положение цели в системе координат ФАР ---------
          Calc_Angle(fDirectionalCosines, ta->Coord_M2.Far.Q, ta->Coord_M2.Far.E);

       // --------- Положение цели в системе координат GEO ---------
          TransformCoordinates(tm_Fixed_Geo_Far, ta->Coord_M2.Far.Q, ta->Coord_M2.Far.E
                                               , ta->Coord_M2.Geo.Q, ta->Coord_M2.Geo.E);
       // --------- Расчет Таненых Тета Фи  ---------
       // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       // Внимание тут наколка -
          TFloat aa, bb;
          aFar->Calc_DeltaQ_DeltaAlfa_Teta_Fi(ta->Ideal_Coord_Far.Q, ta->Ideal_Coord_Far.E, aa, bb);
              ta->Ideal_Coord_Far.Q = aa; ta->Ideal_Coord_Far.E = bb;
          aFar->Calc_DeltaQ_DeltaAlfa_Teta_Fi(ta->Coord_M1.Far.Q,    ta->Coord_M1.Far.E,    aa, bb);
              ta->Coord_M1.Far.Q = aa;    ta->Coord_M1.Far.E = bb;
          aFar->Calc_DeltaQ_DeltaAlfa_Teta_Fi(ta->Coord_M2.Far.Q,    ta->Coord_M2.Far.E,    aa, bb);
              ta->Coord_M2.Far.Q = aa;    ta->Coord_M2.Far.E = bb;
       // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

       // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

          ta->Coord_M1.Far.Q -= ta->Ideal_Coord_Far.Q;
          ta->Coord_M1.Far.E -= ta->Ideal_Coord_Far.E;
          ta->Coord_M1.Geo.Q -= ta->Ideal_Coord_Geo.Q;
          ta->Coord_M1.Geo.E -= ta->Ideal_Coord_Geo.E;

          ta->Coord_M2.Far.Q -= ta->Ideal_Coord_Far.Q;
          ta->Coord_M2.Far.E -= ta->Ideal_Coord_Far.E;
          ta->Coord_M2.Geo.Q -= ta->Ideal_Coord_Geo.Q;
          ta->Coord_M2.Geo.E -= ta->Ideal_Coord_Geo.E;

   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   // --------  Расчет текущих ошибок ------------
      if (TargetAccess_Count > 0) {
         // ------ Расчет средних значений ----
           for (int i = 0; i < TargetAccess_Count; i++){
             ta->Coord_M1.Far.fCurSumQ += TargetAccess[i].Coord_M1.Far.Q;
             ta->Coord_M1.Far.fCurSumE += TargetAccess[i].Coord_M1.Far.E;
             ta->Coord_M1.Geo.fCurSumQ += TargetAccess[i].Coord_M1.Geo.Q;
             ta->Coord_M1.Geo.fCurSumE += TargetAccess[i].Coord_M1.Geo.E;

             ta->Coord_M2.Far.fCurSumQ += TargetAccess[i].Coord_M2.Far.Q;
             ta->Coord_M2.Far.fCurSumE += TargetAccess[i].Coord_M2.Far.E;
             ta->Coord_M2.Geo.fCurSumQ += TargetAccess[i].Coord_M2.Geo.Q;
             ta->Coord_M2.Geo.fCurSumE += TargetAccess[i].Coord_M2.Geo.E;
           }
             ta->Coord_M1.Far.SredErrorQ = ta->Coord_M1.Far.fCurSumQ / (TFloat) TargetAccess_Count;
             ta->Coord_M1.Far.SredErrorE = ta->Coord_M1.Far.fCurSumE / (TFloat) TargetAccess_Count;
             ta->Coord_M1.Geo.SredErrorQ = ta->Coord_M1.Geo.fCurSumQ / (TFloat) TargetAccess_Count;
             ta->Coord_M1.Geo.SredErrorE = ta->Coord_M1.Geo.fCurSumE / (TFloat) TargetAccess_Count;

             ta->Coord_M2.Far.SredErrorQ = ta->Coord_M2.Far.fCurSumQ / (TFloat) TargetAccess_Count;
             ta->Coord_M2.Far.SredErrorE = ta->Coord_M2.Far.fCurSumE / (TFloat) TargetAccess_Count;
             ta->Coord_M2.Geo.SredErrorQ = ta->Coord_M2.Geo.fCurSumQ / (TFloat) TargetAccess_Count;
             ta->Coord_M2.Geo.SredErrorE = ta->Coord_M2.Geo.fCurSumE / (TFloat) TargetAccess_Count;
        // ---
           TFloat odds;
           for (int i = 0; i < TargetAccess_Count; i++){
             odds  = TargetAccess[i].Coord_M1.Far.Q - ta->Coord_M1.Far.SredErrorQ;  ta->Coord_M1.Far.SKOErrorQ += odds*odds;
             odds  = TargetAccess[i].Coord_M1.Far.E - ta->Coord_M1.Far.SredErrorE;  ta->Coord_M1.Far.SKOErrorE += odds*odds;
             odds  = TargetAccess[i].Coord_M1.Geo.Q - ta->Coord_M1.Geo.SredErrorQ;  ta->Coord_M1.Geo.SKOErrorQ += odds*odds;
             odds  = TargetAccess[i].Coord_M1.Geo.E - ta->Coord_M1.Geo.SredErrorE;  ta->Coord_M1.Geo.SKOErrorE += odds*odds;

             odds  = TargetAccess[i].Coord_M2.Far.Q - ta->Coord_M2.Far.SredErrorQ;  ta->Coord_M2.Far.SKOErrorQ += odds*odds;
             odds  = TargetAccess[i].Coord_M2.Far.E - ta->Coord_M2.Far.SredErrorE;  ta->Coord_M2.Far.SKOErrorE += odds*odds;
             odds  = TargetAccess[i].Coord_M2.Geo.Q - ta->Coord_M2.Geo.SredErrorQ;  ta->Coord_M2.Geo.SKOErrorQ += odds*odds;
             odds  = TargetAccess[i].Coord_M2.Geo.E - ta->Coord_M2.Geo.SredErrorE;  ta->Coord_M2.Geo.SKOErrorE += odds*odds;
           }
      }
      ta->Coord_M1.Far.SKOErrorQ = sqrt(ta->Coord_M1.Far.SKOErrorQ / (TFloat) TargetAccess_Count);
      ta->Coord_M1.Far.SKOErrorE = sqrt(ta->Coord_M1.Far.SKOErrorE / (TFloat) TargetAccess_Count);
      ta->Coord_M1.Geo.SKOErrorQ = sqrt(ta->Coord_M1.Geo.SKOErrorQ / (TFloat) TargetAccess_Count);
      ta->Coord_M1.Geo.SKOErrorE = sqrt(ta->Coord_M1.Geo.SKOErrorE / (TFloat) TargetAccess_Count);

      ta->Coord_M2.Far.SKOErrorQ = sqrt(ta->Coord_M2.Far.SKOErrorQ / (TFloat) TargetAccess_Count);
      ta->Coord_M2.Far.SKOErrorE = sqrt(ta->Coord_M2.Far.SKOErrorE / (TFloat) TargetAccess_Count);
      ta->Coord_M2.Geo.SKOErrorQ = sqrt(ta->Coord_M2.Geo.SKOErrorQ / (TFloat) TargetAccess_Count);
      ta->Coord_M2.Geo.SKOErrorE = sqrt(ta->Coord_M2.Geo.SKOErrorE / (TFloat) TargetAccess_Count);
    // ----------

      for (int i = 0; i < TargetAccess_Count; i++){
          if (ta->Coord_M1.Far.MaxErrorQ < fabs(TargetAccess[i].Coord_M1.Far.Q)) ta->Coord_M1.Far.MaxErrorQ = fabs(TargetAccess[i].Coord_M1.Far.Q);
          if (ta->Coord_M1.Far.MaxErrorE < fabs(TargetAccess[i].Coord_M1.Far.E)) ta->Coord_M1.Far.MaxErrorE = fabs(TargetAccess[i].Coord_M1.Far.E);
          if (ta->Coord_M1.Geo.MaxErrorQ < fabs(TargetAccess[i].Coord_M1.Geo.Q)) ta->Coord_M1.Geo.MaxErrorQ = fabs(TargetAccess[i].Coord_M1.Geo.Q);
          if (ta->Coord_M1.Geo.MaxErrorE < fabs(TargetAccess[i].Coord_M1.Geo.E)) ta->Coord_M1.Geo.MaxErrorE = fabs(TargetAccess[i].Coord_M1.Geo.E);
          if (ta->Coord_M2.Far.MaxErrorQ < fabs(TargetAccess[i].Coord_M2.Far.Q)) ta->Coord_M2.Far.MaxErrorQ = fabs(TargetAccess[i].Coord_M2.Far.Q);
          if (ta->Coord_M2.Far.MaxErrorE < fabs(TargetAccess[i].Coord_M2.Far.E)) ta->Coord_M2.Far.MaxErrorE = fabs(TargetAccess[i].Coord_M2.Far.E);
          if (ta->Coord_M2.Geo.MaxErrorQ < fabs(TargetAccess[i].Coord_M2.Geo.Q)) ta->Coord_M2.Geo.MaxErrorQ = fabs(TargetAccess[i].Coord_M2.Geo.Q);
          if (ta->Coord_M2.Geo.MaxErrorE < fabs(TargetAccess[i].Coord_M2.Geo.E)) ta->Coord_M2.Geo.MaxErrorE = fabs(TargetAccess[i].Coord_M2.Geo.E);
      }
}