Exemplo n.º 1
0
//---------------------------------------------------------------------------
void __fastcall TfrmPelengCharacteristic::BitBtn1Click(TObject *Sender)
{
    bool Result;
//!!!!!!!!!!!!!!!!!!!!!
/*       egBeginTeta->Get_Gradus_Value(&BeginTeta, &Result);  if (!Result) return;
       egEndTeta  ->Get_Gradus_Value(&EndTeta  , &Result);  if (!Result) return;
       egTetaStep ->Get_Gradus_Value(&TetaStep , &Result);  if (!Result) return;*/
       if (EndTeta  < BeginTeta) {MessageDlg("Начальное значение Тета по величине должно быть меньше за конечное значение Тета.", mtWarning, TMsgDlgButtons() << mbOK, 0); return; }
       if (TetaStep <= 0       ) {MessageDlg("Значение шага по углу Тета должно превышать величину НУЛЯ.", mtWarning, TMsgDlgButtons() << mbOK, 0); return; }
    // +++++++++++++++++++++++++++++++++++

       TFloat aEps_c = 0.07;
       TFloat aQ_c   = 0;
       TFloat CurFi  = 0;
       TFloat aDeltaQ, aDeltaAlfa = 0;
    // +++++++++++++++++++++++++++++++++++
       int i = 0; while ( i < Chart1->SeriesList->Count ) ((TFastLineSeries*)Chart1->SeriesList->Items[0])->Free(); // --------- Удаляю предыдущие отрисованые кривые ----
    // +++++++++++++++++++++++++++++++++++

       for (TFloat CurTeta = BeginTeta; CurTeta <= EndTeta; CurTeta = CurTeta + TetaStep){
               CreateSeriesAndAddToChart(Chart1, CurTeta);
             // --------------

               *aFar->pStrobing = true;
                aFar->Calc_Teta_Fi_DeltaQ_DeltaAlfa(CurTeta, CurFi, aDeltaQ, aDeltaAlfa);
                aFar->Set_DeltaQ_DeltaAlfa(aDeltaQ, aDeltaAlfa);

               for (aQ_c = -0.8 * aFar->FarParam->Diagram.Shir; aQ_c < 0.8 * aFar->FarParam->Diagram.Shir; aQ_c = aQ_c + 0.0007){
                   // ----------- Расчет значений вольтов для каждого из лучей ---------
                     for (int i = 0; i < Diagram_Count; i++) {
                            TFloat aOffsetX = sin(aQ_c  ) - sin(DiagramArray[i]->OffsetX);
                            TFloat aOffsetY = sin(aEps_c) - sin(DiagramArray[i]->OffsetY);

                         // -------- А теперь смещение относительно "нуля" центра луча в радианах-------
                            aOffsetX = _ArcSin_(aOffsetX);
                            aOffsetY = _ArcSin_(aOffsetY);

                         // ------------------- Ниже типа аРадВалуе нуно умножить косинус Тета
                            aRadValue[i] = DiagramArray[i]->Get_SignalStrength(aOffsetX, aOffsetY);
                            //if (aCalcRelay) aRadValue[i] = DiagramArray[i]->Get_RelayValue(aRadValue[i]);
                     }

                   // -------- Теперь расчитаным мощностям в каждом луче расчитываем координаты цели --------
                      TFloat SumRadValue = aRadValue[0] + aRadValue[2]  +  aRadValue[1] + aRadValue[3];
                      E1 = ((aRadValue[1] + aRadValue[3]) - (aRadValue[0] + aRadValue[2])) / SumRadValue;
                      //E2 = ((aRadValue[0] + aRadValue[1]) - (aRadValue[2] + aRadValue[3])) / SumRadValue;

                      Chart1->Series[Chart1->SeriesList->Count - 1]->AddXY(aQ_c * _180_del_Pi, E1, "", clBlack);
               }
       }
}
Exemplo n.º 2
0
//===========================================================================
void TTarget::Move()
{

  // --------- Эсли нулевой момент времени --------
    if (xi == -999) {  xi = x0;  yi = y0;  zi = z0; Coord.R = R0; }

/*    xi = xi + (_Vx + Vx)*1/150.0;
    yi = yi + (_Vy + Vy)*1/150.0;
    zi = H0 - sqr(Coord.R) / 2.0 / Rz - (fpFarParam->Hz * 0.001 + VerticalSpeedShip->Value);*/

    xi = xi + (Vx - Vxa * 0.001 - SpeedShip->Value * cos( K_k->Value ) * 0.001) / (TFloat) aFar->Fa;
    yi = yi + (Vy - Vya * 0.001 - SpeedShip->Value * sin( K_k->Value ) * 0.001) / (TFloat) aFar->Fa;
    zi = zi + (   - Vza * 0.001                                               ) / (TFloat) aFar->Fa - VerticalSpeedShip->Value * 0.001; // - sqr(Coord.R) / 2.0 / Rz

  // ----------------------------------------------
    Coord.R = sqrt(xi*xi + yi*yi + zi*zi);
    Coord.Q = Math::ArcTan2(yi , xi);
    Coord.E = _ArcSin_( zi / Coord.R);

  // -----------------------------------------------
    if (IndicatorCoord.Q == -999) {
        IndicatorCoord    = Coord;
        OldIndicatorCoord = Coord;
    }

  // -----------------------------------------------
    if (Coord.R >= 150) {
      Enabled            = false;
      Indicator_Redraw   = true;
      IndicatorCoord.Q   = -999;
      IndicatorCoord.E   = -999;
      IndicatorCoord.R   = -999;
    }
}
Exemplo n.º 3
0
//===========================================================================
void TTarget::Init()
{
    xi = yi = zi = Rz = Eps0 = -999;

  // ---------------------------------
    Coord.Init();

  // ---------------------------------
    IndicatorCoord = OldIndicatorCoord = Coord_Far_Clear = Coord_Far = Coord;
    Indicator_Redraw      = false;

  // ---------------------------------
    Radiation = Radiation1 = Radiation2 = false;
    CountZondImpulses = 20;
    Enabled           = true;
    SectorCoef        = 1.0;

  // ---------------------------------
    for (int i = 0; i < TargetAccess_Count; i ++) TargetAccess[i].Destroy_Impuls();
    if (TargetAccess_Count != 0) {
       free(TargetAccess);
    }
    TargetAccess = NULL;
    TargetAccess_Count = 0;
  // ---------------- Начальные значения ---------
    Rz = 999912345.0;

    z0 = H0 - fpFarParam->Hz * 0.001; /* - R0*R0/2.0/Rz*/ Eps0 = _ArcSin_(z0/R0);
    x0 = R0*sin(B0)*cos(Eps0);
    y0 = R0*cos(B0)*cos(Eps0);

    Vx = V0 * sin(K0);
    Vy = V0 * cos(K0);
}
Exemplo n.º 4
0
//===========================================================================
TImpuls TTarget::KoefPelengCharacteristic(bool aCalcDirectionalCosines, bool aCalcRelay, TFloat aQ_c, TFloat aEps_c)
{
   TFloat   *aRadValue = (TFloat*) malloc (sizeof(TFloat) * Diagram_Count);
   TImpuls   Res;

   // ----------- Расчет значений вольтов для каждого из лучей ---------
     for (int i = 0; i < Diagram_Count; i++) {
            TFloat     aOffsetX, aOffsetY;
            if (aCalcDirectionalCosines) {

                 // -------- Смещение относительно "нуля" центра луча В НАПРАВЛЯЮЩИХ КОСИНУСАХ-------
                    aOffsetX = fDirectionalCosines.cell[1][0] - DiagramArray[i]->DirectionalCosines.cell[1][0];
                    aOffsetY = fDirectionalCosines.cell[2][0] - DiagramArray[i]->DirectionalCosines.cell[2][0];
            } else {
                    aOffsetX = sin(aQ_c  ) - sin(DiagramArray[i]->OffsetX);
                    aOffsetY = sin(aEps_c) - sin(DiagramArray[i]->OffsetY);
            }

         // -------- А теперь смещение относительно "нуля" центра луча в радианах-------
            aOffsetX = _ArcSin_(aOffsetX);
            aOffsetY = _ArcSin_(aOffsetY);


            //aOffsetX = aOffsetX*cos(DiagramArray[i]->Fi) - aOffsetY*sin(DiagramArray[i]->Fi);
            //aOffsetY = aOffsetY*cos(DiagramArray[i]->Fi) + aOffsetX*sin(DiagramArray[i]->Fi);


         // ------------------- Ниже типа аРадВалуе нуно умножить косинус Тета
            aRadValue[i] = DiagramArray[i]->Get_SignalStrength(aOffsetX, aOffsetY);
            if (aCalcRelay) aRadValue[i] = DiagramArray[i]->Get_RelayValue(aRadValue[i]);
     }

   // -------- Теперь расчитаным мощностям в каждом луче расчитываем координаты цели --------
      TFloat SumRadValue =   aRadValue[0] + aRadValue[2]  +  aRadValue[1] + aRadValue[3];
      Res.E1 = ((aRadValue[1] + aRadValue[3]) - (aRadValue[0] + aRadValue[2])) / SumRadValue;
      Res.E2 = ((aRadValue[0] + aRadValue[1]) - (aRadValue[2] + aRadValue[3])) / SumRadValue;

      free (aRadValue);
      return Res;
}
Exemplo n.º 5
0
// =============================================================================
// ========================    Расчет углов по направляющемым косинусам  =======
//==============================================================================
void Calc_Angle(TMatrix3x3 &aVector, TFloat &OutX, TFloat &OutY)
{
   OutX = - Math::ArcTan2(aVector.cell[1][0], aVector.cell[0][0]);
   OutY =   _ArcSin_(aVector.cell[2][0]);
   //OutY =   Math::ArcTan2(aVector.cell[2][0], sqrt(fabs(1 - aVector.cell[2][0]*aVector.cell[2][0])));
}
Exemplo n.º 6
0
//===========================================================================
//===========================================================================
//===========================================================================
void foid(TFloat d, TFloat h, TFloat el, TFloat sdn, TFloat ppol, TFloat eps, TFloat &v, TFDN DN)
{
     TFloat drg, ah, EL, ll, dcp, hcp, dg, zzz, rum, u, dr, gam, ccc, yb, fo, e, k, c1, d1, h2, ffp, ffo, mm, mv4, sss, ggg, mv1, mv2, mv3, v2;
//     TFloat sq, l1, hap, rm1, rm2;

     drg  = sqrt(2*ZvData.Re) * (sqrt((ZvData.Ha + DeltaHa))+sqrt(h));
     ah   = q0[28];
     EL   = q0[27];
     dcp  = d / EL;
     hcp  = h / ah;

     if (fabs(h - (ZvData.Ha + DeltaHa)) >= 0.95*d) { v = 1; return;}
     if (h             >       d) { v = 1; return;}

     dg  = sqrt(sqr(ZvData.Re+h)-sqr((sqr(ZvData.Re+h)-sqr(d)) /2.0 / (ZvData.Re + (ZvData.Ha + DeltaHa))+(ZvData.Re + (ZvData.Ha + DeltaHa)) / 2.0));
     zzz = sqr(ZvData.Re+h)-sqr(dg);
     zzz = sqrt(zzz) - ZvData.Re - (ZvData.Ha + DeltaHa);

     if (zzz / d > 0.95) e = pi / 2.0; else e = _ArcSin_(zzz / d);

     //l1     = pwrr((pi*ZvData.Re/Lambda),1,3)*((ZvData.Ha + DeltaHa) + h)*(1/d-d/sqr(drg));
     rum    =  sqrt(2.0*ZvData.Re)*(sqrt((ZvData.Ha + DeltaHa) + 0.56*ah)+sqrt(h+0.56*ah))-1.5 * EL;
     //rm1    = sqrt((ZvData.Ha + DeltaHa))/sq*dg;
     //rm2    = sqrt(h)/sq*dg;
     u      = rum/drg;
     dr     = 2*(ZvData.Ha + DeltaHa)*h*sqr(1.0-u*u) / u / drg;
     gam    = q0[29] * dr;
     ccc    = gam;
     u      = dg / drg;
     u      = (1 - u*u)/u;
     u      = u * ((ZvData.Ha + DeltaHa) + h) / drg;
     if (u >= 1){ v = 1; return;}
     ksi = ArcTan2(u, sqrt(fabs(1.0-sqr(u))));

   // ----------------------------------------------------------------
     if (ppol == 1) {
        k =   sin(ksi) + sqrt(eps - sqr(cos(ksi)));
        k = (-sin(ksi) + sqrt(eps - sqr(cos(ksi)))) / k;
     }
     if (ppol == 2) {
        k =   eps*sin(ksi) + sqrt(eps - sqr(cos(ksi)));
        k = (-eps*sin(ksi) + sqrt(eps - sqr(cos(ksi)))) / k;
     }

   // ----------------------------------------------------------------

     if (u > ZvData.Lambda / (5 * WorkSeaSurfaceShum) ) { v = 1; return;}
     c1 = k*exp(-8.0*sqr(q0[26]*sin(ksi)));
     u  = ZvData.Re*cos(ksi)/(ZvData.Re + (ZvData.Ha + DeltaHa));
     yb = ArcTan2(u, sqrt(1.0-sqr(u)));
     fo = -(pi/2.0-yb);
     u  = rum/drg;
     dr = u/(1-u*u);

     if (h > (ZvData.Ha + DeltaHa)) h2 = (ZvData.Ha + DeltaHa) / h; else h2 = h / (ZvData.Ha + DeltaHa);
     d1 = 1.0/sqrt(1.0+dr*4*h2*sqr(1+sqrt(h2))/(sqr(1+h2)*(1+h2)));
     ffp = DN(el,e ,sdn);
     ffo = DN(el,fo,sdn);

     if (ffp < 0.0001) mm = 0; else mm = c1*d1*(ffo/ffp);
     if ((2.0*mm*cos(gam)-sqr(mm)) > 1) v = 1.0e-3; else v = sqrt(1.0-2.0*mm*cos(gam)+sqr(mm));

     mv4 = v;
     sss = drg;
     ggg = rum;
     ccc = mv4;

     if (d > rum) {
          ksi = dcp-sqrt(hcp);
          mv1 = 40*log10(ggg*1000/ccc);

       // --- !!! ---
          if (ZvData.Lambda < 0.1e-3 ) mv2 = 222-mv1;
          if (ZvData.Lambda < 0.03e-3) mv2 = 209-mv1;
          if (ZvData.Lambda < 0.01e-3) mv2 = 203-mv1;
       // --- !!! ---

          mv3 = sss-ggg;

          v2 = d*mv2/mv3+mv1-ggg*mv2/mv3;

           //(************  перевод в разы      ********)
          v2 = d*1000/(Power(10,v2 / 40.0));

           // (*******    диффракция     ********)
           v = v2;
           return;
     }
     //rm1 = sqrt((ZvData.Ha + DeltaHa)) / sq * dg;
     //rm2 = sqrt(h)     / sq * dg;
     u   = d / drg;
     dr  = 2*(ZvData.Ha + DeltaHa)*h*sqr(1.0-u*u) / u / drg;
     gam = q0[29] * dr;
     ccc = gam;
     u   = dg/drg;
     u   = (1-u*u)/u;
     u   = u*((ZvData.Ha + DeltaHa)+h)/drg;
     ksi = ArcTan2(u, sqrt(1.0-sqr(u)));

   // ----------------------------------------------------------------
     if (ppol == 1) {
        k = sin(ksi)+sqrt(eps-sqr(cos(ksi)));
        k = (-sin(ksi)+sqrt(eps-sqr(cos(ksi))))/k;
     }
     if (ppol == 2) {
        k = eps*sin(ksi)+sqrt(eps-sqr(cos(ksi)));
        k = (-eps*sin(ksi)+sqrt(eps-sqr(cos(ksi))))/k;
     }
   // ----------------------------------------------------------------
     if (u > ZvData.Lambda / (5 * WorkSeaSurfaceShum)) { v = 1; return; }

     c1 = k*exp(-8.0*sqr(q0[26]*sin(ksi)));
     u  = ZvData.Re*cos(ksi)/(ZvData.Re+(ZvData.Ha + DeltaHa));
     yb = ArcTan2(u, sqrt(1.0-sqr(u)));
     fo = -(pi/2.0 - yb);
     u  = d/drg;
     dr = u/(1-u*u);

     h2 = (h > (ZvData.Ha + DeltaHa))? (ZvData.Ha + DeltaHa)/h:h/(ZvData.Ha + DeltaHa);

     d1  = 1.0/sqrt(1.0+dr*4*h2*sqr(1+sqrt(h2))/(sqr(1+h2)*(1+h2)));
     ffp = DN(el,e,sdn);
     ffo = DN(el,fo,sdn);
     mm  = (ffp < 0.0001)? 0:c1*d1*(ffo/ffp);
     v   = ((2.0*mm*cos(gam)-sqr(mm)) > 1)? 1.0e-3 : sqrt(1.0-2.0*mm*cos(gam)+sqr(mm));
}