//--------------------------------------------------------------------------- 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); } } }
//=========================================================================== 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; } }
//=========================================================================== 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); }
//=========================================================================== 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; }
// ============================================================================= // ======================== Расчет углов по направляющемым косинусам ======= //============================================================================== 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]))); }
//=========================================================================== //=========================================================================== //=========================================================================== 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)); }