Example #1
0
 public MissileTarget(Vector3D initPos, IPosition3D vel) : base(initPos, "Trg")
 {
     Vel      = vel;
     Vel.Name = "Vel";
     AddChild(Vel);
     AddDiffVect(Vel);
 }
Example #2
0
        public static Vector3D MethNavCleanChase(double t, MissileTarget trg, IPosition3D missPos, double missVel, object otherStuff)
        {
            //линия визирования
            var visLine = trg.Vec3D - missPos.Vec3D;

            visLine.Normalize();
            return(visLine * missVel);
        }
Example #3
0
        public static Vector3D MethNav3p(double t, MissileTarget trg, IPosition3D missPos, double missVel, object otherStuff)
        {
            //А вот тут хитро: PROP - делит отрезок, который лежит на линии визирования НАБЛ.ПУНКТ-ЦЕЛЬ.
            //Одна точка лежит на цели, вторая точка является точкой пересчечения  линии визирования НАБЛ.ПУНКТ-ЦЕЛЬ с нормалью к ней же(perfectPoint)
            //(нормаль проходит через фактическое местоположение ракеты, которое может быть расположено не на линии визирования НАБЛ.ПУНКТ -> ЦЕЛЬ)
            //Отрезок этот делится в соотношении PROP - (1-PROP) точкой(vel2TrgPoint), в которую целится ракета
            //(не полностью, просто по вектору РАКЕТА -> vel2TrgPoint направлена одна из составляущей скорости ракеты )
            const double PROP = 0.3d;
            //координаты набл пункта (одна из тех самых трех точек "цель" "ракета" >>"НАБЛ. ПУНКТ"<<)
            var nablPunkt = ((otherStuff == null)?Vector3D.Zero:(Vector3D)otherStuff);
            //Линия визирования НАБЛ.ПУНКТ -> ЦЕЛЬ
            var visLine = trg.Vec3D - nablPunkt;
            //Пропорция в которой делит линию визирования НАБЛ.ПУНКТ -> ЦЕЛЬ точка пересчечения линии визирования НАБЛ.ПУНКТ-ЦЕЛЬ с нормалью к ней же(perfectPoint)
            //(нормаль проходит через фактическое местоположение ракеты, которое может быть расположено не на линии визирования НАБЛ.ПУНКТ -> ЦЕЛЬ)
            var perfectProportion = (visLine.Norm * (missPos.Vec3D - nablPunkt)) / visLine.GetLength();
            //точка пересчечения линии визирования НАБЛ.ПУНКТ-ЦЕЛЬ с нормалью к ней же(perfectPoint)
            //(нормаль проходит через фактическое местоположение ракеты, которое может быть расположено не на линии визирования НАБЛ.ПУНКТ -> ЦЕЛЬ)
            var perfectPoint = perfectProportion * visLine;
            //единичный вектор, лежащий в плоскости линии визирования НАБЛ.ПУНКТ -> ЦЕЛЬ и вектором скорости цели, перпендикулярный линии визирования
            //и направленный по ходу вектора скорости цели, если линия виз. и скорость цели параллельны, то n1=(0,0,0);
            var n1 = ((visLine & trg.Vel.Vec3D) & visLine).Norm;
            //тангенциальная состаавляющая скорости цели, относитально НАБЛ.ПУНКТ
            var vTrgPerpend = n1 * (n1 * trg.Vel.Vec3D);
            //модуль тангенциальной составляющей скорости ракеты, относитально НАБЛ.ПУНКТ
            var vMisPerpend = vTrgPerpend * perfectProportion;
            //точка в которую целится ракета
            //(не полностью, просто по вектору РАКЕТА -> vel2TrgPoint направлена одна из составляущей скорости ракеты )
            //делит отрезок perfectPoint -> ЦЕЛЬ в соотношении PROP - (1-PROP)
            var vel2TrgPoint = Vector3D.Lerp(PROP, 0d, perfectPoint, 1d, visLine);
            //направление одной из составляущей скорости ракеты
            var vel2Dir = (vel2TrgPoint - missPos.Vec3D).Norm;


            //далее решается задача нахождения вектора скорости ракеты, при условии,
            //что известна ее тангенциальная составляющая, известен модуль скорости, и известно направление его второй составляющей...... (РАКЕТА -> vel2TrgPoint)
            var vMisPerp2 = vMisPerpend.GetLengthSquared();
            var vMis2     = missVel * missVel;

            if (vMisPerp2 > vMis2)
            {
                return(MethNavCleanChase(t, trg, missPos, missVel, otherStuff));
            }
            var b    = vel2Dir * vMisPerpend;
            var b2   = b * b;
            var dscr = 4 * b + 4 * (vMis2 - vMisPerp2);
            var s1   = 0.5 * (-b + Sqrt(dscr));

            //ОТВЕТ
            var res = vMisPerpend + s1 * vel2Dir;

            if (Abs(res.GetLength() - missVel) < 1E-15)
            {
                throw new Exception("Чет не работает алгоритм по корректировке по 3 точкам(");
            }
            return(res);
        }
Example #4
0
 public Force(double value, IPosition3D dir, IPosition3D fpoint, IOrient3D sk, string name = "ForcePoint") : base(value, dir, sk, name)
 {
     FPoint = fpoint == null ?
              new Position3D(0, 0, 0, "FPoint") :
              fpoint;
     if (fpoint == null)
     {
         AddChild(FPoint);
     }
 }
Example #5
0
 public ForceCenter(double value, IPosition3D dir, IOrient3D sk, string name = "ForceCntr")
 {
     Name      = name;
     Value     = value;
     SK        = sk;
     Direction = dir == null ?
                 new Position3D(1, 0, 0, "Direction") :
                 dir;
     if (dir == null)
     {
         AddChild(Direction);
     }
     else if (dir.Owner == null)
     {
         AddChild(Direction);
     }
 }
Example #6
0
        public static Vector3D MethNavParalelSblizj(double t, MissileTarget trg, IPosition3D missPos, double missVel, object otherStuff)
        {
            //линия визирования
            var visLine = trg.Vec3D - missPos.Vec3D;

            visLine.Normalize();
            //нормаль к плоскости линии визирования и вектором скорости цели
            var    norm = visLine & trg.Vel.Vec3D;
            double l    = norm.GetLength();

            if (l < 1E-17)
            {
                // если вектора параллельны, то чистая погоня
                visLine.Normalize();
                return(visLine * missVel);
            }

            norm /= l;
            //единичный вектор, лежащий в плоскости линии визирования и вектором скорости цели, направленный
            // перпендикулярно к линии визирования, и направленный по ходу вектора скорости цели
            var norm2 = (norm & visLine).Norm;
            //тангенциальная составляющая скорости цели, относитально линии визирования
            var vPoNapravl = trg.Vel.Vec3D * norm2;
            //квадрат скорости ракеты
            var v2 = missVel * missVel;
            //квадрат тангенциальной составляющей скорости цели, относитально линии визирования
            var a2 = vPoNapravl * vPoNapravl;

            if (v2 - a2 < 0)
            {
                //если мы не успеваем за поворотао цели, тьо чистая погоня
                visLine.Normalize();
                return(visLine * missVel);
            }
            //проекция скорости ракеты на линию визирования
            var vPoVisLine = Sqrt(v2 - a2);


            return(norm2 * vPoNapravl + visLine.Norm * vPoVisLine);
        }
Example #7
0
 public void AddDiffVect(IPosition3D dVdt, bool getNewName = false)
 {
     AddDiffPropToParam(pX, dVdt.pX, true, getNewName);
     AddDiffPropToParam(pY, dVdt.pY, true, getNewName);
     AddDiffPropToParam(pZ, dVdt.pZ, true, getNewName);
 }