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); }
//=========================================================================== 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; } }
//=========================================================================== 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); } }