• Как оптимизировать алгоритм самонаведения ракеты?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Тут квадратное уравнение зарыто.

    Обозначьте |MSL_VEL - TGT_VEL| за t.

    Получите уравнение TGT_DIR = (MSL_VEL-TGT_VEL)/t

    Преобразуйте: TGT_DIR*t = (MSL_VEL-TGT_VEL)

    Но тут неизвестные вектор MSL_VEL и t. Но они связаны, ведь t - это длина вектора. Обозначим неизвестный вектор MSL_VEL как (x, y, z) Значит:
    t^2=(x - TGT_VEL_x)^2 + (y - TGT_VEL_y)^2 + (z - TGT_VEL_z)^2

    Ну и еще вы знаете, что скорость ракеты фиксированная же:
    x^2+y^2+z^2 = MSL_SPEED^2

    У вас тут 4 неизвестных и аж 5 уравнений (ведь первое - это векторное уравнение):
    TGT_DIR_x*t = x - TGT_VEL_x
    TGT_DIR_y*t = y - TGT_VEL_y
    TGT_DIR_z*t = z - TGT_VEL_z
    t^2=(x - TGT_VEL_x)^2 + (y - TGT_VEL_y)^2 + (z - TGT_VEL_z)^2
    x^2+y^2+z^2 = MSL_SPEED^2


    Раскройте скобки в 4-ом, подставьте туда пятое и из первых трех выразите x, y, z:

    t^2 = MSL_SPEED^2+TGT_SPEED^2-2*TGT_VEL_x*(TGT_DIR_x -t*TGT_VEL_x)-... = MSL_SPEED^2+(1-2t)TGT_SPEED^2-2(TGT_DIR*TGT_VEL)


    Там в конце векторное произведение векторов. Дальше сами раскройте и получите квадратное уравнение на t. Решите его по школьной формуле. Если дискриминант отрицательный, то решения тупо нет. Слишком быстро цель улепетывает. Потом не забудьте проверить, чтобы t получилось положительное. Потом подставьте t в первые 3 уравнения и найдите искомые x, y, z.

    Еще можно так себе это все представить. Свяжем систему координат с целью. Тогда множество точек, куда может смотреть скорость ракеты - это сфера с центром в TGT_VEL и радиусом MSL_SPEED. Вам надо выбрать на этой сфере точку так, чтобы она была коллинеарна с вектором TGT_DIR. Т.е. у вас есть луч из центра координат вдоль векторо TGT_DIR. Вам надо найти где он пересечет сферу. Введите параметр t вдоль луча и дальше получите то же самое квадратное уравнение.
    Ответ написан
    2 комментария
  • Как создают интерфейсы в программах?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Самый низкий уровень - системные вызовы:
    Это WinAPI, X11 и т.д. Я не десктоп разработчик, но сейчас мало кто ими пользуется.

    Дальше идут фреймворки, потроенные вокруг них:
    Это wxWidgets, WTL (Windows Template Library)

    И на самом верху - полноценные языки разметки/программирования:
    Qt, XAML, Electron

    Дополнительно, никто не мешает свой фреймворк написать оконный - поверх существующих WinAPI, либо через графический фреймворк (SDL, например)
    Ответ написан
    1 комментарий
  • Как создают интерфейсы в программах?

    @tifco
    Например, касаемо Qt, я читал как создавать интерфейсы ("сигнал-слоты" или же именно окошки?) при помощи данного фреймворка. Но это программирование на C++. Не на Си.
    Сами по себе Cи и С++, в силу своего давнего развития, заточены для консоли. Какие там графические средства могут быть "из коробки"?
    Да и понятие ООП (объектно-ориентированное прогр.), на принципах которого и строятся оконные интерфейсы, появилось позже, уже в C++. Т. к. последний - язык Си и надмножество над ним. Т. е. дополнительные возможности. Потому так и говорят C++ - Cи с плюсами или Си с классами. Сам же по себе Си - структурно-ориентированный ЯП (если не ошибаюсь). Со всеми вытекающими. Старенький он, старенький. Что вы от него хотите? Кроме низкоуровневого, системного программирования.
    Что касаемо WinAPI, что-то я сомневаюсь в его возможностях на данный счет. Иначе бы зачем тогда дополнительные фреймворки лепить, если бы все было в комплекте?
    Выше пишут про геометрию на экране. Я уж не помню, вроде бы в "Pelles C" можно было выйти в некий графический режим (графическая "песочница"). В рамках которого рисуй себе что хочешь. Быть может и окошки с кнопками, на свой лад. Этот графический режим похож на тот, что применяется часто, для обучения программированию, в Basic. Там ничего другого делать нельзя, кроме как: round, line, circule и т. п. - только на Си. Толи в книге, что в комплекте с этим компилем, этот режим был описан, толи пример был в самой программе приведен. Точно не скажу. Я как-то нашел его, случайно, чисто из любопытства. Можно ли сделать интерактивные объекты - вопрос. А вот просто нарисовать - да.
    В общем, это, не претендую на абсолютную истину. :)
    Ответ написан
    1 комментарий
  • Как создают интерфейсы в программах?

    vabka
    @vabka
    Токсичный шарпист
    Но какой язык разметки и оформления для десктопных программ?

    Какой хочешь, тот и будет.
    1. Хочешь - можно втащить тот же html и css в виде Electron, CEF или чего-то самодельного.
    2. Хочешь - никакого не будет и будешь сам рисовать геометрию на экране.
    3. Хочешь - будет что угодно на спектре от п1 до п2.

    Если тебя интересует именно Си, то можешь посмотреть на GTK, например.
    Ответ написан
    Комментировать
  • Как сделать перенос строки в сообщении от Telegram Bot?

    abdurohman
    @abdurohman
    1С программист, администратор
    Нужно использовать символ переноса строки %0A
    Ответ написан
    3 комментария
  • Как сделать перенос строки в сообщении от Telegram Bot?

    @devtricks
    sendMessage?chat_id=45311499&text=Первая%20строка.%0AВторая%20строка.
    Этот способ получился у меня.
    Ответ написан
    Комментировать
  • Чем отличается FOR от WHILE?

    DevMan
    @DevMan
    В чем разница как выводить, если результат один?
    технически разницы никакой, разница только в семантике:
    • for(буквально "для") - применяется когда нужно что-то выполнить в определенном диапазоне. то есть на человеческом языке это будет звучать примерно как: "для такого диапазона мы делаем что-то".
    • while(буквально "пока") - применяется когда нужно что-то выполнять неопределенное кол-во раз до выполнение конкретного условия. то есть на человеческом языке это будет звучать примерно как: "делать что-то пока не выполнится условие".
    Ответ написан
    5 комментариев