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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Одно квадратное уравнение. Пусть точка конца имеет координаты t*v3. Уранение: |t*v3-v1|^2=100^2 (расстояние от начала до конца - 100). Распишите длину как сумму квадратов разностей по всем координатам. Там квадратное уравнение на t, ведь координаты v1 и v3 даны. Найдите положительный корень.
    Ответ написан
  • Найти третью точку правильного треугольника?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Логика у вас правильная - взять середину отрезка AB и отложить от него перпендикуляр длинной sqrt(3)/2*d.

    Но не надо искать углы, вектор перпендикуляр находится тривиально - это {y2-y1, x1-x2} (Можно доказать перпендикулярность через скалярное произведение, например). Более того, длина этого вектора будет уже d (это ведь повернутый на 90 градусов вектор по стороне треугольника). Значит его остается тупо домножить на sqrt(3)/2.

    Таким образом формула x3 = (x1+x2)/2 +sqrt(3)/2*(y2-y1).
    Ответ написан
    Комментировать
  • Как правильно реализовать поворот и движение фигуры?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Это базовые элементарные вещи - используйте тригонометрию. Если направление d градусов (от горизонтальной оси) и вам надо сдвинутся вдоль него на расстояние s, то изменения по осям:

    dx = s*cos(d);
    dy = s*sin(d);

    Обычно, аргументы библиотечных функций cos и sin задаются в радианах. Так что, если у вас d в градусах -то его надо домножить на Pi/180.0

    Эти же синусы и косинусы нужно использовать для отрисовки треугольника. Если, координаты центра x0, y0 - то координаты вершины-острия будут
    x0+triangle_size*cos(d);
    y0+triangle_size*sin(d);

    Две другие вершины строятся точно так же, но, для вытянутой формы нужна другая константа множитель и углы там будут d+120.0 и d-120.0 (разные углы дадут разную форму треугольника).

    Соответственно, алгоритм - при нажатии кнопки поворота увеличиваете или уменьшаете d. При нажатии кнопки движения сдвигаете координаты треугольника на (dx, dy).

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

    cos(d+alpha) = cos(d)*cos(alpha) - sin(d)*sin(alpha);
    sin(d+alpha) = cos(d)*sin(alpha) + sin(d)*cos(alpha);

    Прелесть этого метода в том, что при фиксированном шаге изменения угла alpha - вам нужно подсчитать синус и косинус только один раз для alpha, и потом использовать их везде при пересчете.
    Ответ написан
    Комментировать