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

    Хорошо сформулированный вопрос - половина ответа.
    Что значит "ничего не рисуется"? Нет никаких точек?
    Тогда проверяйте, а рисуется ли просто точка хоть где-нибудь. Если нет - ищите, почему.
    К тому же, кривую лучше рисовать из маленьких отрезков, а не из точек. Т.е. надо считать "предыдущую точку" и "текущую точку", проводить (рисовать) отрезок; затем переходить к новой точке, сохраняя "текущую" в "предыдущую", и так далее.
    Попробуйте нарисовать отрезки P0-P1, P1-P2, чтобы вообще оценить опорные точки безье на картинке, а затем уже проводите какие-то рассчёты, может, проблема в рассчётах.
    Ну и так далее, потом видно будет, в чем проблема.
    Ответ написан
    Комментировать
  • Как Найти точку пересечения 2х прямых, зная только 2 точки каждой прямой?

    Псевдокод:
    vec_t = left.end - left.start;
    vec_k = right.end - right.start;
    r = right.start - left.start;
    d = vec_t ⋅ vec_k;
    if (d ≃ 0.0)
    	return; // параллельны
    d_t = r ⋅ vec_k;
    d_k = r ⋅ vec_t;
    t = d_t / d; // параметр на одном отрезке ∈ [0, 1]
    k = d_k / d; // на втором отрезке ∈ [0, 1]
    if (t ∈ [0, 1] ∧ k ∈ [0, 1])
    	pt = left.start + t ⋅ vec_t = right.start + k ⋅ vec_k;
    Ответ написан
    Комментировать
  • Почему в программировании используются моноширинные шрифты?

    В каких-то случаях для форматирования бывает важно, чтобы ширина всех символов была одинаковая:
    Например, некоторые выравнивают так (или типа того):
    void foo(
             int    x,
             double y)
    {
      int    quux = x;
      double bla  = y;
      float  t    = 0.0;
    }

    С немоноширинным так не получится. Возможно, есть ещё какие-то причины.
    Лично я пользуюсь немоноширинными - они удобнее для чтения, а такое форматирование я не использую и встречаю редко.
    Ответ написан
    Комментировать
  • Как запустить код написанный на Haskell из под Java проекта?

    1) Через C. Haskell экспортит свои функции (foreign export), из Java их зовём (на Java не писал, так что не знаю, как там принято). С тех пор, как я собирал dll под windows прошло много времени, раньше это было несколько напряжно (именно под windows), сейчас возможно и проблемы нет. Почитать можно тут: https://wiki.haskell.org/Calling_Haskell_from_C https://downloads.haskell.org/~ghc/latest/docs/htm...
    2) Через сокеты. Запускаете Haskell-процесс, который слушает подключение. Далее кормите его запросами, а он выдает ответы. В каком виде запросы - неважно, JSON, например.
    Ответ написан
    Комментировать
  • Сидячий образ жизни кодера на самом деле ухудшает здоровье?

    Целью бороться не задавался, просто случайно нашёл спорт (в моём случае - велотриал), заниматься которым мне в кайф, потому и не лень.
    Ответ написан
  • Зачем нужны монады?

    То, что вы описали - частный случай.
    Вот несколько частных случаев (хаскель vs псевдокод).
    Обратите внимание, что на Хаскеле код линейный
    То, что сделано монадами, в других языках нередко встроено. Удобство невстроенного решения в том, что есть немало функций, которые работают с любыми монадами (mapM, filterM, ...), применить которые к встроенным в язык вещам может быть проблематично.

    1. nullable
    do
        x <- foo
        y <- bar x
        return $ baz y

    вместо
    x = foo();
    if (x) {
        y = bar();
        if (y) {
            return baz(y); } }


    2. списки
    do
        x <- lines str
        y <- words x
        return $ length y

    вместо
    for (x in lines(str))
        for (y in words(x))
            yield y.length();


    3. continuation
    do
        h1 <- ContT $ withFile "1.txt" ReadMode
        h2 <- ContT $ withFile "2.txt" WriteMode
        liftIO $ ...use handles...

    вместо
    using (h1 = File.Open("1.txt", File.Mode.Read)) {
        using (h2 = File.Open("2.txt", File.Mode.Write)) {
            ...use files... }}


    Причем можно, например, и так:
    do
        -- сразу список файлов открываем
        hs <- mapM (\name -> ContT (withFile name ReadMode))
            ["1.txt", "2.txt", "3.txt", "4.txt"]

    А как сделать так с using'ами?
    Ответ написан
    Комментировать
  • Как распарсить сложную строку на Swift?

    swift не знаю, но с учётом вашего "и потом" предлагаю:
    split(incomeText) {$0 == "{" || $0 == "}"}
    Ответ написан
    Комментировать
  • Почему идет зацикливование программы на C++?

    Чтобы было понимание, почему так происходит, дополню:

    При попытке чтения 0.1 читается только 0, так как требуется целое число, а ".1" так и остаётся в потоке. Соответственно второй раз идёт попытка прочесть целое из ".1", что приводит к ошибке, а std::cin приходит в ошибочное состояние (std::ios::failbit), n остаётся неизменным, и всё начинает идти по кругу.

    Изменив на double вы исправили только это, однако введите "0.1blabla" - и всё зациклится вновь.

    Решение:

    1. Проверять std::cin на валидность if (std::cin) и, например, выходить, либо восстанавливать состояние:
    if (!std::cin)
    {
    	std::cin.clear(); // очищаем флаги
    	std::cin.ignore(INT_MAX, '\n'); // игнорим входной буфер до переноса строки
    }
    // можем пользоваться

    2. Помимо этого можно попросить поток кидать исключения на ошибках, например:
    std::cin.exceptions(std::ios::failbit);
    Кинет исключение при неудачной попытке прочесть значение.

    В вашем случае, я думаю, стоит проверять std::cin с игнорированием оставшегося ввода и восстанавливать состояние.
    Ответ написан
    Комментировать
  • Пропал интерес к программированию?

    Попробуйте другой язык, но желательно не такой же. Например, Haskell, так как там в корне другие идеи. Может, это пробудит интерес к новому.
    Ответ написан
    Комментировать
  • Правильно ли составлено регулярное выражение?

    regex101.com/r/jH1qR5/1

    Как она может справиться с "(0338)", если там все варианты по три цифры?
    Ответ написан
  • В чем отличие промисов от монад?

    Promise - одна из монад, где bind (>>=), упрощённо, из обещания и из последующей функции делает новое обещание, которое дожидается выполнения первого обещания и передаёт результат в следующую функцию. В итоге управление в вызывающую функцию возвращается на первом же ожидании.

    Но монады есть и другие. Например Either, позволяющий выдать "ошибку", т.о. обрывая всю цепь вычислений на первой же ошибке. Или Maybe, ведущий себя аналогично Either, но не с возвратом какого-то ошибочного значения, а просто с остановкой на первом фейле. Список - тоже монада, там последующая функция будет вычислена на каждом элементе, а результате сконкатенированы.
    Ответ написан
    Комментировать