Страница 1 из 2

Расчет упреждения для тела летящего по параболе [Решено]

СообщениеДобавлено: 31 янв 2015, 20:13
sledo
Ситуация такая - есть ракета (снаряд, пуля и т.д.), у которой есть баллистика и которая летит по параболе в цель и соответственно бьет в нее сверху. И вот что то ни как не соображу как мне высчитать упреждение для моей ракеты, которая делает горку перед целью. По идее все просто - берем вектор направления, скорость и время за которое ракета достигнет точки перехвата, однако проблема в том, что пока я не вычислю точку перехвата я не смогу вычислить время подлета ракеты, соответственно пока я не вычислю время подлета ракеты, я не смогу вычислить расстояние на которое сместится тело за время подлета ракеты.

Пришла мысль вычислять точку упреждения по треугольнику, однако тогда получится то же самое что с Ахиллесом который никогда не догонит черепаху, так и я ни когда не смогу вычислить точную точку упреждения.

Есть еще мысль что бы брать фиксированное количество времени и для цели и для ракеты, например одну секунду(или меньше) и считать до тех пор, пока траектории не пересекутся и считать это пересечение точкой упреждения, но как то это выглядит долго и громоздко.

Может у кого был положительный опыт с точкой упреждения?

Re: Расчет упреждения для тела летящего по параболе

СообщениеДобавлено: 01 фев 2015, 00:20
bojlahg
Там по математике страшное кубическое уравнение для 3d и квадратное для 2d. Обычно рекомендуют использовать приблизительный алгоритм.

Re: Расчет упреждения для тела летящего по параболе

СообщениеДобавлено: 01 фев 2015, 03:06
DbIMok
Ищите на форуме по упреждение упреждения

Re: Расчет упреждения для тела летящего по параболе

СообщениеДобавлено: 02 фев 2015, 05:26
sledo
В общем решил задачу, по точному вычислению упреждения выстрела или движения ракеты. Что самое интересное, я так и не нашел описание этого метода ни в одном источнике. Даже в военных методичках приводятся лишь приблизительные вычисления, при том что решение задачи весьма простое (правда я 2 дня до него доходил).

Итак у нас есть два вектора направления движения - цели и снаряда - и есть угол по отношению направления снаряда к цели. Совершенно логично предположить, что время полета снаряда и время полета цели к точке пересечения, должно быть одинаковым, поэтому, поскольку оно нам не известно, а так же мы не можем его вычислить поскольку не знаем где точка пересечения, берем произвольное время полета - допустим 1 секунду для простоты расчета. Считаем сколько пролетит цель за это время и сколько пролетит снаряд за это время, и берем конечную точку цели за точку пересечения двух тел. Мысленно проводим прямую через начальную точку полета цели и начальной точки полета снаряда - это будет прямая с которой и должен был пущен снаряд для того что бы он пролетел нужное расстояние за 1 сек, что бы смог попасть в цель. Мысленно совмещаем расстояние пройденное снарядом за 1 сек, и линию откуда он должен был полететь и получаем треугольник. Собственно задача уже решена.

Значит, у нас есть известные - один угол АСВ, и две стороны этого треугольника - СВ АВ - по которым мы и можем вычислить все остальные углы и сторону. Для того что бы посчитать угол упреждения на который нужно запустить снаряд, нам нужен угол СВА - считаем его по теореме синусов - sinA = BC * sinB / AC. Угол упреждения равен sinA.

Изображение

Безусловно все это верно только для тел летящих с постоянной скоростью и по прямой по отношению к стреляющему. Для остального нужны дополнительные расчеты.

Надеюсь кому то поможет и поставит точку в поиске решений вычисления угла упреждения, поскольку более точного метода быть не может.

DbIMok писал(а):Ищите на форуме по упреждение упреждения

Да, это можно использовать, но по этому методу мы никогда не попадем по точке в которую стреляем

P.S. Для тех кто любит понегодовать - изображение схематичное для общей наглядности и не более.

Re: Расчет упреждения для тела летящего по параболе [Решено]

СообщениеДобавлено: 02 фев 2015, 09:55
Tolking
Оооо! Ловко ты перешел от движений по параболе к прямолинейному и от упреждения в точке Д к упреждению в точке А... Респект!!!

Re: Расчет упреждения для тела летящего по параболе [Решено]

СообщениеДобавлено: 02 фев 2015, 15:52
sledo
Tolking писал(а):Оооо! Ловко ты перешел от движений по параболе к прямолинейному и от упреждения в точке Д к упреждению в точке А... Респект!!!

Честно говоря я и сам не ожидал такого простого решения задачи, при том что даже зенитчики используют формулы по принципу упреждение упреждения (правда в книгах по расчетам наведения зенитных ракет, я так и не увидел расчетов по упреждению - может плохо смотрел).
Снаряд движется по параболе? Считаем сколько ему нужно времени по своей траектории и исходя из этого строим треугольник. Теперь абсолютно не важно как движется тело и с какой скоростью - хоть круговыми движениями и с нелинейной скоростью - важно верно просчитать какое тело пройдет расстояние до точки пресечения за одну единицу времени.

И да, конечно же угол упреждения будет САВ, что то засиделся вчера)

Re: Расчет упреждения для тела летящего по параболе [Решено]

СообщениеДобавлено: 02 фев 2015, 16:17
Tolking
Ты для параболы проверял вычисления? Взял 1 секунду промежуток и 2 секунды и получил одинаковый угол?

Re: Расчет упреждения для тела летящего по параболе [Решено]

СообщениеДобавлено: 02 фев 2015, 16:40
sledo
Tolking писал(а):Ты для параболы проверял вычисления? Взял 1 секунду промежуток и 2 секунды и получил одинаковый угол?

Нет, не проверял, но я думаю нет разницы как будет двигаться тело к точке упреждения. Хоть выделывать петли, бочки и выходить в космос. Главное что бы она оказалась через, допустим 1 сек, в какой то точке и эту точку мы смогли бы высчитать. Соответственно снаряд (или что там летит) должен лететь так же 1 секунду, что бы они оказались в одной точке, в одно и то же время с целью. И тут так же нет разницы как летит снаряд, главное что бы в нужной точке он оказался через 1 секунду.
Соответственно когда эти условия верны, то и угол упреждения будет всегда один и тот же и не важно на какой дистанции от цели будет находиться стреляющий, важно что бы он находился, в данном случае на отрезке АС.

Впрочем, это не долго просчитать и посмотреть на практике.

Re: Расчет упреждения для тела летящего по параболе [Решено]

СообщениеДобавлено: 02 фев 2015, 22:58
sledo
Вот код на расчет угла упреждения. Единственное что, как то не даются мне Quaternionы, и написать нормальный код на поворот по углу упреждения, что не получается. Поэтому в качестве альтернативы, я высчитываю точку упреждения и просто поворачиваю на нее с помощью transform.LookAt.

Синтаксис:
Используется csharp
public class TestScript : MonoBehaviour
{
    public int speed = 1;

    public bool boolTest;
    public bool boolTest2;

    public GameObject snaryd;
    public GameObject cloneSnaryd;

    public GameObject advanceGO;

    public Vector3 target2;

    public Rigidbody targetRigidBody;
    public GameObject target;

    public Vector3 veloSityTarget;

    public float xSpeedTarget = 0;
    public float ySpeedTarget = 0;
    public float zSpeedTarget = 0;

    public float xTargetPoz2 = 0;
    public float yTargetPoz2 = 0;
    public float zTargetPoz2 = 0;

    public Vector3 veloSityRocket;

    public float xRocketPoz2 = 0;
    public float yRocketPoz2 = 0;
    public float zRocketPoz2 = 0;

    public float AC_1;
    public float ВС_1;

    public Vector3 vector3DirectionRocket;
    public float vector3Scal;
    public float lengthVector1;
    public float lengthVector2;

    public float angleRad;

    public float sinA;
    public float sinB;
    public float sinC;

    public float cosB;

    public float rad;
    public float advanceAngleRad;

    public float AB_2;
    public float BC_2;

    public float timeAdvanceX;
    public float timeAdvanceY;
    public float timeAdvanceZ;

    public float wayX;
    public float wayY;
    public float wayZ;


    //углы треугольника
    public float angleA;
    public float angleB;
    public float angleC;

    //время подлета цели к точке упреждения и контрольное время
    public float time;
    public float timeControl;
    public bool time2Bool = true;

    //точка упреждения
    public Vector3 advanceTarget;

    public float test;
    public Vector3 testVector3;


    /*
     * Скорость в Юнити задается в м/с, или юнит/с, т.е. за 1 секунду, ГО пролетает 1 юнит * скорость.
     *
     * Считаем точку упреждения по формулам:
     * Находим вектор направления на цель - из координат цели вычитаем координаты пушки (или что там у вас)):
     * Находим угол между векторами: cos α = a·b / |a|·|b|; где а - вектор направления на цель, b - вектор скорости цели (velocity)
     * Находим синус угла А в радианах: SinA = BC_1 * SinB / AC_1; где ВС_1 путь цели за 1 сек, АС_1 путь снаряда (или что там у вас летит в цель) за 1 сек
     *
     * Угол А, это и есть угол упреждения на цель.
     *
     * Находим угол С: C = 180 - (A + B);
     * Находим расстояние которое пройдет цель за то время, какое потребуется снаряду (или что там у вас) долететь до точки перехвата:
     * Или проще говоря высчитываем точку перехвата на отрезке ВС_1 : BC_2 = AB_2 * SinA / SinC; где АВ расстояние до цели от пушки
     * Находим координаты точки перехвата:
     * t.x = BC_2 * v.x; t.y = BC_2 * v.y; t.z = BC_2 * v.z;
     * x = t.x * v.x; y = t.y * v.y; z = t.z * v.z;
     *
     * точка перехвата = текущая позиция цели(x,y,z) + (x,y,z);
     */



    void Start()
    {
        target = GameObject.Find("Cube Test2");
    }


    void Update()
    {
        time += Time.deltaTime;

        //смотрим в точку упреждения
        if (advanceGO != null)
        advanceGO.transform.LookAt(advanceTarget);


        Advance();

        if (Input.GetKeyDown(KeyCode.B))
        {
            Advance();

            boolTest = !boolTest;

            boolTest2 = true;
        }

        if (boolTest2)
        {
            boolTest2 = false;
        }

        if (boolTest)
        {
            if (snaryd != null)
            {
                cloneSnaryd = Instantiate(snaryd, advanceGO.transform.position, advanceGO.transform.rotation) as GameObject;

                cloneSnaryd.rigidbody.velocity = advanceGO.transform.TransformDirection((Vector3.forward) * speed);
            }

        }
    }

    void Advance()
    {
        //targetRigidBody = target.GetComponent<Rigidbody>();

        if (targetRigidBody != null)
        {
            //узнаем скорость го
            veloSityTarget = targetRigidBody.velocity;

            xSpeedTarget = targetRigidBody.velocity.x;
            ySpeedTarget = targetRigidBody.velocity.y;
            zSpeedTarget = targetRigidBody.velocity.z;

            //если скорость цели будет больше нуля
            if (xSpeedTarget != 0 || ySpeedTarget != 0 || zSpeedTarget != 0)
            {
                //рассчитываем где будет цель через 1 сек
                xTargetPoz2 = targetRigidBody.transform.position.x + veloSityTarget.x;
                yTargetPoz2 = targetRigidBody.transform.position.y + veloSityTarget.y;
                zTargetPoz2 = targetRigidBody.transform.position.z + veloSityTarget.z;

                //считаем расстояние пройденное целью BC
                ВС_1 = Vector3.Distance(targetRigidBody.transform.position, new Vector3(xTargetPoz2, yTargetPoz2, zTargetPoz2));

                //считаем скорость ракеты
                veloSityRocket = transform.TransformDirection(Vector3.forward) * speed;

                //рассчитываем где будет ракета через 1 сек
                xRocketPoz2 = this.transform.position.x + veloSityRocket.x;
                yRocketPoz2 = this.transform.position.y + veloSityRocket.y;
                zRocketPoz2 = this.transform.position.z + veloSityRocket.z;

                //считаем пройденное расстояние ракеты AC
                AC_1 = speed; //Vector3.Distance(this.transform.position, new Vector3(xRocketPoz2, yRocketPoz2, zRocketPoz2));

                //находим вектор направления на цель
                vector3DirectionRocket = targetRigidBody.transform.position - this.transform.position;

                //Debug.Log(targetRigidBody.velocity);

                //находим скалярное произведение векторов
                vector3Scal = vector3DirectionRocket.x * targetRigidBody.velocity.x + vector3DirectionRocket.y * targetRigidBody.velocity.y
                   + vector3DirectionRocket.z * targetRigidBody.velocity.z;

                //находим модуль векторов (результат в квадратном корне)
                lengthVector1 = vector3DirectionRocket.x * vector3DirectionRocket.x + vector3DirectionRocket.y * vector3DirectionRocket.y
                    + vector3DirectionRocket.z * vector3DirectionRocket.z;

                lengthVector2 = targetRigidBody.velocity.x * targetRigidBody.velocity.x
                    + targetRigidBody.velocity.y * targetRigidBody.velocity.y
                    + targetRigidBody.velocity.z * targetRigidBody.velocity.z;

                //находим угол между векторами (результат в косинусе!)
                cosB = vector3Scal / Mathf.Sqrt(lengthVector1 * lengthVector2);

                if (cosB < 0)
                {
                    cosB *= -1;
                }

                //находим радианы из косинуса
                rad = Mathf.Acos(cosB);

                //переводим угол B из радиан в градусы
                angleB = rad * 180 / Mathf.PI;

                //выводим синус угла В
                sinB = Mathf.Sin(rad);

                //высчитываем синус угла А в радианах
                sinA = ВС_1 * sinB / AC_1;

                //выводим из синуса угол А в радианы
                rad = Mathf.Asin(sinA);
                //переводим угол А из радиан в градусы
                angleA = rad * 180 / Mathf.PI;

                if (angleA < 0)
                    angleA *= -1;
                if (angleB < 0)
                    angleB *= -1;

                //Считаем угол С
                angleC = 180 - (angleA + angleB);

                //переводим градусы в радианы
                angleRad = angleC * Mathf.PI / 180;

                //выводим синус угла С
                sinC = Mathf.Sin(angleRad);

                //переводим угол C в радианы
                advanceAngleRad = angleC * Mathf.PI / 180;

                //считаем расстояние до цели (АВ)
                AB_2 = Vector3.Distance(targetRigidBody.transform.position, this.transform.position);

                //distTargretRocet = (targetRigidBody.transform.position - this.transform.position).magnitude;

                //вычисляем длину пути ВС до точки упреждения BC = AB * sinA / sinC
                BC_2 = AB_2 * sinA / Mathf.Sin(advanceAngleRad);

                //считаем время подлета цели к точке
                if (time2Bool)
                {
                    //Вместо 100, надо вписать скорость цели!!!
                    timeControl = BC_2 / 100;
                    time2Bool = false;
                }

                //вычисляем время полета цели
                if (targetRigidBody.velocity.x != 0)
                    timeAdvanceX = BC_2 / targetRigidBody.velocity.x;
                else timeAdvanceX = 0;

                if (targetRigidBody.velocity.y != 0)
                    timeAdvanceY = BC_2 / targetRigidBody.velocity.y;
                else timeAdvanceY = 0;

                if (targetRigidBody.velocity.z != 0)
                    timeAdvanceZ = BC_2 / targetRigidBody.velocity.z;
                else timeAdvanceZ = 0;

                //время не может быть отрицательным
                if (timeAdvanceX < 0)
                    timeAdvanceX *= -1;
                if (timeAdvanceY < 0)
                    timeAdvanceY *= -1;
                if (timeAdvanceZ < 0)
                    timeAdvanceZ *= -1;

                //вычисляем vector3 точки упреждения в локальных координатах
                wayX = timeAdvanceX * targetRigidBody.velocity.x;
                wayY = timeAdvanceY * targetRigidBody.velocity.y;
                wayZ = timeAdvanceZ * targetRigidBody.velocity.z;

                if (targetRigidBody != null)
                    advanceTarget = targetRigidBody.transform.position + new Vector3(wayX, wayY, wayZ);
            }
        }
    }
}
 

Re: Расчет упреждения для тела летящего по параболе [Решено]

СообщениеДобавлено: 03 фев 2015, 00:08
Syberex
Вот чел недавно тоже делал стрельбу с упреждением http://stopgame.ru/blogs/topic/60763 для сравнения ;)

Re: Расчет упреждения для тела летящего по параболе [Решено]

СообщениеДобавлено: 03 фев 2015, 00:43
DbIMok
ТС просто нас дезинформировал. не нужно ему упреждения. достаточно подруливать каждый кадр в сторону цели, что он и делает. два дня доходил и никто ранее не додумался, ага.

Re: Расчет упреждения для тела летящего по параболе [Решено]

СообщениеДобавлено: 03 фев 2015, 03:51
sledo
Syberex писал(а):Вот чел недавно тоже делал стрельбу с упреждением http://stopgame.ru/blogs/topic/60763 для сравнения ;)

Взрыв эпичен, но я не нашел с чем сравнить.

DbIMok писал(а):ТС просто нас дезинформировал. не нужно ему упреждения. достаточно подруливать каждый кадр в сторону цели, что он и делает. два дня доходил и никто ранее не додумался, ага.

Чего то я не понял, это стеб или вы серьезно?

На всякий случай продублирую разъяснения.

Для того что бы вычислить точку упреждения, нам надо:
а) Знать где окажется цель за тот промежуток времени, который будет лететь снаряд (ракета, жираф, слоники, злая птичка или Звезда смерти - что угодно) до той точки.
б) Знать где окажется снаряд за тот промежуток времени, за который цель будет лететь к точке пересечения со снарядом
Налицо два взаимо исключающих себя условия. Если забивать все это в уравнение, то получится уравнение с двумя неизвестными, которое имеет множество решений.
Поэтому, что бы найти ответ, надо каким то образом узнать одно из неизвестных значений - на чем и основываются все методы вычисления упреждения и как ни странно, основная масса по принципу упреждение упреждения, даже в военных методичках для стрелков, наводчиков. Наверняка есть и другая масса, но я такой не увидел.

В чем мой принцип? Совершенно очевидно, что время подлета к точке пересечения, у снаряда и цели должно быть одно и тоже, что бы они таки встретились в пространстве. Следовательно, мы берем и подставляем одно и то же время полета и для снаряда и для цели, для того что бы выяснить, какой нужен угол упреждения для тех скоростей цели и снаряда которые мы имеем. Тем самым можем высчитать дистанцию, которую пролетят эти два тела, за одну единицу времени. Для простоты расчетов я взял за временной промежуток - одну секунду. Соответственно теперь нам известно, две стороны и один угол. Из этого всего, мы можем построить треугольник, для того, что бы узнать оставшуюся сторону и два угла (но забегая вперед, нам нужен только один угол). Что я и делаю с помощью теоремы синусов - выясняю неизвестный угол и с помощью двух углов, выясняю третий угол, который и будет являться углом упреждения.
Теперь, подставляя полученный угол для реальной ситуации, наш снаряд и наша цель, встретятся именно в той точке, которой они оба достигнут за тот промежуток времени, который необходим им для полета к точке пересечения, при условии что скорость их движения и направление цели, останется неизменной.
В случае с прямолинейным движением, выяснить сколько потребуется времени до точки пересечения можно по формуле прямолинейного движения. В случае с параболой, по формуле параболы. Вполне вероятно в последнем случае надо будет строить сферический треугольник.
Да, я пока не просчитывал случай с параболой, поскольку для меня это пока лишнее, и не проверял на практике движение ракеты. Но верно одно, в моем случае, мне не важно чем стрелять и по чему стрелять - я могу взять точку и направить ее в точку, и эти две точке встретятся, в отличии от других способов, при этом, произведя в разы меньше расчетов.

Re: Расчет упреждения для тела летящего по параболе [Решено]

СообщениеДобавлено: 03 фев 2015, 09:26
Tolking
Неважно чем стрелять если и цель и снаряд летят прямо и с одинаковой скоростью...

При движении под действием силы тяжести у объекта меняется направление движения и скорость. Т.е. если берем один интервал времени у нас направление и скорость будет одна, а на другом интервале и скорость и направления будут отличаться от первого случая...

Re: Расчет упреждения для тела летящего по параболе [Решено]

СообщениеДобавлено: 03 фев 2015, 10:50
Syberex
Не все понятно в расчетах - угол CAB ведь не равен углу CDB. И угол ты находишь для разного расстояния, хоть и для одинакового времени. Из точки D ракета может улететь в 2 раза дальше или в 2 раза ближе :-? вообщем рассчитанный угол будет сильно зависеть от расстояния до цели!
Если например турель поставить в 2 раза ближе к цели на той же линии (точка D1), ракета пролетит за 1 сек. такое же расстояние (так как движение прямолинейное и равномерное). Таким образом если турель в обоих случаях лежит на 1 линии к цели, ты получишь одинаковый угол! А ракета улетит дальше чем надо и не встретится с целью. Почему? Потому что ты считаешь от обратного, то есть находишь точку "откуда надо стрелять", а не как надо стрелять (силу выстрела или скорость, и направление).

Re: Расчет упреждения для тела летящего по параболе [Решено]

СообщениеДобавлено: 03 фев 2015, 17:32
sledo
Ребят, я конечно понимаю, что все мы тут умные, все сами с усами, но если уж вы пытаетесь понять не свои выкладки, будьте добры, вникайте в них или хотя бы внимательно читайте разъяснения. Там нет ни чего сложного, все расчеты можно провести в уме (если человек часто общается с подобными расчетами), а на бумаге это займет не более минуты.
Tolking писал(а):Неважно чем стрелять если и цель и снаряд летят прямо и с одинаковой скоростью...

При движении под действием силы тяжести у объекта меняется направление движения и скорость. Т.е. если берем один интервал времени у нас направление и скорость будет одна, а на другом интервале и скорость и направления будут отличаться от первого случая...

"если и цель и снаряд летят прямо и с одинаковой скоростью" - я для кого это написал?? Что бы мне говорили о том, что в реальности надо учитывать и силу тяжести и сопротивления?? Я же специально задал условия, при которых расчет будет абсолютно точен. Более того, вот одна из самых распространенных формул для стрельбы из стрелкового оружия lу = ( Vу·cosα ·to ) / [ (V/Vу· sinα ) - ctgα ] + Vу ·sinα ·to , взято с сайта ОХОТА, РЫБАЛКА, ПРИРОДА. Это формула рассчитывается по принципу - измерения расстояния до цели, измерения расстояния пути которое цель пролетит пока до нее будет лететь пуля/дробь в первом случае, расчет поправки на упреждение. Из нее выходит просто отвратительная точность поправки, и для того, что бы достигнуть хотя бы приблизительных результатов точности моих расчетов, нужно просчитывать ту формулу не одну тысячу раз. Проще говоря, как написали выше - упреждение упреждения.
В том случае, так же строится обыкновенный треугольник, однако это не мешается людям более менее точно прицеливаться в реальной жизни учитывая и сопротивление воздуха и силу тяжести и бог знает что еще.
Syberex писал(а):Не все понятно в расчетах - угол CAB ведь не равен углу CDB. И угол ты находишь для разного расстояния, хоть и для одинакового времени. Из точки D ракета может улететь в 2 раза дальше или в 2 раза ближе :-? вообщем рассчитанный угол будет сильно зависеть от расстояния до цели!
Если например турель поставить в 2 раза ближе к цели на той же линии (точка D1), ракета пролетит за 1 сек. такое же расстояние (так как движение прямолинейное и равномерное). Таким образом если турель в обоих случаях лежит на 1 линии к цели, ты получишь одинаковый угол! А ракета улетит дальше чем надо и не встретится с целью. Почему? Потому что ты считаешь от обратного, то есть находишь точку "откуда надо стрелять", а не как надо стрелять (силу выстрела или скорость, и направление).

Ок, вот вам выкладка по другим расстояниям, но для расчетов используются углы первого треугольника. Для простоты расчета я взял прямоугольный треугольник со сторонами АВ 173, ВС 100, СА 200 и углами АВС 90, ВСА 60, САВ 30. Соответственно скорость точки1 (цель) равна 100м/с, скорость точки2 (снаряд) равна 200м/с.
Итак, что если расстояние до цели будет не 170м, а 100м? АС2 = АВ2 * sinB / sinC = 100 * 1 / 0.86 = 116.2 м. t2 = S / V = 0.581c Соответственно, для того что бы Точка1 и Точка2 встретились, Точка1 должна оказаться там же где и точка за 0.581с. Считаем какое расстояние пройдет Точка1 за 0.581с. S = t * V = 0.581 * 100 = 58.1м. Считаем, где окажется Точка2 на отрезке ВС первого треугольника. ВС2 = АВ2 * sinA / sin C = 100 * 0.5 / 0.86 = 58,1. Точка1 и Точка2 пересекутся на отрезке ВС в точке 58,139534883720930232558139534884 через 0.581с, ч.т.д. И так для любого расчета в пределах углов первого треугольника. Точность задается только количество цифр после запятой, т.е. она абсолютна, в отличии от формулы выше.