Задать вопрос
  • Cимуляция движения тела по орбите?

    lastuniverse
    @lastuniverse Автор вопроса
    RAX7,
    А дальше я просто не понял откуда взялось this.tdx = -this.x*this.gravity/dist

    ну тут просто:

    this.tdx = -this.x*this.gravity/dist
    где:
    -this.x - направление на центр тяжести
    this.gravity/dist - его (направления/вектора) нормализация и приведение к вектору силы притяжения

    то же самое и для this.tdy
  • Cимуляция движения тела по орбите?

    lastuniverse
    @lastuniverse Автор вопроса
    RAX7, ох, спасибо. И правда же, откуда я взял квадраьный корень)))))

    убрал в своем варианте корень и все заработало как надо ))))

  • Cимуляция движения тела по орбите?

    lastuniverse
    @lastuniverse Автор вопроса
    U235U235, рассчитываю по стандартным формулам для первой космической взя.... Судя по ответу от RAX7, накосячил я при неявной нормализации векторов. Вечерком сяду, более досконально буду разбираться.
  • Cимуляция движения тела по орбите?

    lastuniverse
    @lastuniverse Автор вопроса
    U235U235, нет же)))

    Пе́рвая косми́ческая ско́рость (кругова́я ско́рость) — минимальная (для заданной высоты над поверхностью планеты) горизонтальная скорость, которую необходимо придать объекту, чтобы он совершал движение по круговой орбите вокруг планеты и не начал падать [1]. Первая космическая скорость для орбиты, расположенной вблизи поверхности Земли, составляет 7,91 км/с[2]. Впервые была достигнута космическим аппаратом СССР 4 октября 1957 г. (первый искусственный спутник)[3].
  • Cимуляция движения тела по орбите?

    lastuniverse
    @lastuniverse Автор вопроса
    Антон Швец, Kovalsky, при идеальных условиях вроде как оба фокуса эллипса должны оказаться в одной точке, разве нет?
  • Cимуляция движения тела по орбите?

    lastuniverse
    @lastuniverse Автор вопроса
    RAX7, подскажите, где был косяк? Ведь по факту я в неявном виде производил нормализация векторов:

    тут:
    // вычисляем вектор движения
        const q = this.speed/this.dist;
    		this.dx = this.y*q;
    		this.dy = -this.x*q;


    и тут:
    // находим вектор силы притяжения
        this.tdx = -this.x*this.gravity/dist;
        this.tdy = -this.y*this.gravity/dist;
  • Cимуляция движения тела по орбите?

    lastuniverse
    @lastuniverse Автор вопроса
    Спасибо! Пошел разбираться с вашим волшебством))))
  • Cимуляция движения тела по орбите?

    lastuniverse
    @lastuniverse Автор вопроса
    Может при какой-то скорости эллипс станет неотличим от окружности.

    так и происходить, но нужен механизм, который позволит получить эту скорость для произвольных масс телл и произвольной высоты орбиты без участия человека и визуальной оценки. Такой механизм есть - это расчет первой космической скорости, но в симуляции это почемуто работает несколько неправильно. Ищу причину)
  • Cимуляция движения тела по орбите?

    lastuniverse
    @lastuniverse Автор вопроса
    Robur, RAX7, Griboks, Антон Швец, вы все несомненно правы, но:

    Robur.
    ожидаемый результат - движение тела по эллиптической орбите.
    Все тела в космосе так и летают.
    Более того, даже этот сдвиг эллипса на каждом круге - это то что происходит в реальности.


    Так то оно так, но у меня по факту расчет идет для идеально круглого тела, относительно точечного центра гравитации. Учитывая это, орбита все таки должна получится круглой. Далее, если шаг итерации делать меньше, то и орбита скругляется. По сути на лицо факт неточности вычислений, причиной которой являются следующие факторы:
    1. неточность вычислений заложенных в сам механизм хранения значений с плавающей запятой;
    2. неточность вычислений за счет достаточно большого шага на каждой итерации вычислений;
    А вопрос мой по сути заключается не в том, как избавится от данных неточностей или уменьшить их (без существенного увеличения вычислительной нагрузки этого сделать нельзя) а в том, как добиться уменьшения их влияния на получаемую орбиту. Самый просто вариант, просто перемещать объект по фиксированной окружности с рассчитанной для этой окружности скоростью, но он мне не подходит по ряду причин:
    1. мне нужно чтобы тела двигались по законам приближенным к физическим.
    2. при добавлении источников гравитации, движение тел должно их учитывать

    Griboks,
    в первом приближении да, это шар. Я думаю, речь идёт об идеальном случае, когда существует только сила притяжения и только для тела (масса и размеры тела пренебрежимо малы) + начальное ускорение.

    Именно так. Именно для таких условий мне нужно добиться (хотя бы визуально) идеальной окружности, для любой высоты орбиты и тел с любой массой

    Антон Швец,
    И автор рассчитывает ее, только у него G равно единице, хотя она конечно потом в расчете силы притяжения тоже участвует.
    В общем надо аккуратно все проверять, времени столько нет :)
    Вектор движения вот странно как-то рассчитывается, и на глаз видно что тело летит криво изначально


    Ну, сама по себе гравитационная постоянная тут на кривизну орбиты влиять вообще не должна. А так да, изначально орбита искривляется после первой итерации. Перепроверил логику вычислений раз 100500 но ошибки так и не нашел. Если все же поможете выловить причину искривления, буду очень благодарен.
  • Че не так с кодом?

    lastuniverse
    @lastuniverse
    Afafks123132132165, когда допилите свою игру (ну или что вы там делаете) не забудьте в ней указать: "99.9% написано сообществом Тостера)))"
  • Почему данный код работает неправильно?

    lastuniverse
    @lastuniverse
    Afafks123132132165, крайне рекомендую разобраться с вариантом от twobomb
  • Почему данный код работает неправильно?

    lastuniverse
    @lastuniverse
    Afafks123132132165, а еще лучше отвлекитесь от своей задачи и по релаксируйте ))))
  • Почему данный код работает неправильно?

    lastuniverse
    @lastuniverse
    Afafks123132132165, потому что вы намудрили непонятно что:
    1. переменная j у вас и тут for(j = 0;j < 1000;j++){...} и во вложенном цикле (for(j in blocks){...}
    2. соответственно переменная range у вас не длинна луча а index блока в массиве
    3. вы создали в лучах переменную stop и вынужденны обнулять ее в отдельном цикле for(j in blocks){...}
    4. переменная range тоже нафиг не нужна. Пользуйтесь оператором выхода из цикла break. Это во первых уменьшит количество итераций по циклам for(j = 0;j < 1000;j++){...} и for(j in blocks){...} а во вторых избавит от необходимости запоминать значение длинны луча в range, и как следствие вам не надо будет пересчитывать отдельно концы лучей.
    5. ну и вместо setInterval используйте requestAnimationFrame, это уберет подвисания графики

    в общем вот вам исправленная версия вашего кода, дивитесь и разбирайтесь
  • Почему данный код работает неправильно?

    lastuniverse
    @lastuniverse
    Afafks123132132165, возмите мой вариант, там работает с любым количеством блоков
  • Почему данный код работает неправильно?

    lastuniverse
    @lastuniverse
    Afafks123132132165, я ваш цикл по блокам заменил на метод массивов SOME. посмотрите его описание
    Если в кратце, то some - перебирающий массив метод. Вызываемый у массива (в вашем случае blocks) и принимающий в качестве аргумента функцию - обработчик, которая последовательно будет вызываться для каждого элемента массива до тех пор пока не дойдет до конца массива или не вернет true.

    Заменил для того, что по логике, если блоков несколько, то условием прекращение трассировки луча является столкновение с любым из блоков, то есть при столкновении далее трассировку производить не нужно, а соответственно и сравнивать луч с другими блоками тоже.
  • Почему данный код работает неправильно?

    lastuniverse
    @lastuniverse
    Николай Чуприк, для тех кто реально может помочь в вопросе и без комментариев все понятно. Но следуя правилам хорошего тона комментарии к коду бы не помешали)
  • Почему данный код работает неправильно?

    lastuniverse
    @lastuniverse
    вернее, вы правы, но он еще забыл дописать && rays[i].x <= blocks[q].x
  • Почему данный код работает неправильно?

    lastuniverse
    @lastuniverse
    нет, у него там условие не верное)))

    у него:
    rays[i].x == blocks[q].x && rays[i].y >= blocks[q].y && rays[i].y <= blocks[q].y + 32


    а должно быть:
    rays[i].x>=blocks[q].x && rays[i].x <= blocks[q].x + 32 && rays[i].y >= blocks[q].y && rays[i].y <= blocks[q].y + 32