(много картинок) - Тригонометрия и вектор взгляда [проще некуда] [v1.2]

astr34

Активный участник
Регистрация
16 Июл 2023
Сообщения
18
Версия гайда: 1.2 (31.10.23)

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

Для понимания потребуются некоторые знания из тригонометрии, поэтому в первой части я расскажу про тригонометрическую окружность, синус и косинус. Если уверен в своих знаниях - пропускай её.


Часть I. Начала тригонометрии.

Тригонометрическая окружность
- это единичная окружность (окружность с радиусом 1) с центром в начале координат.

1.png

Какой угол (по величине) показан на правой окружности?
приблизительно -45°

Возьмём единичную окружность, отметим на ней случайную точку P.
Проведём отрезок PA параллельно оси X, точка A лежит на оси Y.
Проведём отрезок PB параллельно оси Y, точка B лежит на оси X.

2.jpg

Синус - координата точки A на оси Y.
Косинус - координата точки B на оси X.

Т.е синус и косинус - это просто координаты любой точки, лежащей на единичной окружности.
Синус - координата на вертикальной оси, косинус - на горизонтальной оси (если оси расположены так как на рисунке).

Но что если радиус окружности не равен 1?
С изменением радиуса окружности пропорциоонально изменяются и координаты точки.
  • Чтобы найти координаты точки зная синус и косинус нужно умножить их на радиус.
  • Чтобы найти синус и косинус точки зная координаты нужно разделить координаты на радиус.

Чему равен косинус этого угла?

3.jpg

0.5 (1/R = 1/2 = 0.5)


Часть II. Что такое вектор взгляда?

Вектор
- это отрезок, имеющий направление, т.е начало и конец.

4.png

Единичный вектор - это вектор, длина которого равна 1.

Координатами вектора являются значения, сместившись на которые из начальной точки вектора (т.е прибавив их к координатам точки начала), мы окажемся в конечной точке вектора. Если начало вектора находится в начале координат, координаты вектора и координаты его конечной точки совпадают. Если начало не находится в начале координат, то чтобы найти координаты вектора нужно от координат конечной точки отнять координаты начальной.
Пример 1: есть вектор AB: A(0; 0), B(1; 3). Тогда AB{1-0; 3-0} = AB{1; 3}.
Пример 2: есть вектор CD: C(1; 1), D(-2; 3). Тогда CD{-2-1; 3-1} = CD{-3; 2}.

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

Другими словами,
Вектор взгляда - это координаты для осей XYZ, на которые нужно сместиться, чтобы пройти единицу расстояния в направлении взгляда.

5.jpg


Часть III. Как получить вектор взгляда?

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

Для начала получим YAW и PITCH, вытащив значения из "Игровое значение" -> "Текущее направление взгляда".

6.png

PITCH и YAW измеряются в градусах.

PITCH - это поворот вниз-вверх
- Отсчёт: -Y (90°) +Y (-90°) (-90° .. 90°).
YAW - это поворот влево-вправо
- Отсчёт: +Z (0°/360°) -X (90°) -Z (180°) +X (270°) (0° .. 360°).

Так как длина вектора взгляда равна 1 (не меняется), набор всех возможных точек (концов векторов) образуют сферу (т.к сфера это по определению набор равноудалённых точек в трёхмерном пространстве).
На этой сфере PITCH - широта, а YAW - долгота (если вам это как-то поможет).

7.PNG

Рассмотрим PITCH (широту) на плоскости YA (см левую часть).
A - луч, который может лежать на оси X или Z, а может и не лежать, его местоположение зависит от YAW. Смотря на предыдущую картинку несложно представить, как эта полуокружность вращается вокруг оси Y с изменением YAW.

8.jpg

Для удобства перевернём картинку (см. правую часть). На полуокружности возможных значений PITCH находится точка M - случайное значение PITCH. Найдём значение синуса. Как можно видеть, оно лежит на перевёрнутой оси Y. Поэтому, для нахождения координаты Y вектора, его нужно домножить на -1 (это понятно ещё отсюда: "-Y (90°) +Y (-90°)" - в майнкрафте "вверх" это под отрицательным углом)

Итак, координата Y вектора взгляда найдена: -sin(pitch)

Теперь найдём точку косинуса, а точку sin(M) обозначим буквой P.
Можно заметить что длина отрезка PM = cos(M) = cos(pitch).

9.jpg

PM - это радиус окружности, которая получится на сечении сферы плоскостью XZ (горизонтальной плоскостью) в точке Y равной P. Сечение это то, что находится в секущей плоскости.

Фиолетовым выделена окружность, которая получится на сечении. Это окружность всех возможных значений YAW (долготы). Её центр - точка P, PM - радиус. Радиус PM (равный cos(pitch)) обозначим за R.

10.PNG
Сообщение объединено:

Рассмотрим эту окружность:

11.jpg

Для удобства повернём на 90 градусов по ч.с. Отметим случайное значение YAW, например точку K. Найдём точки синуса и косинуса.

12.jpg

Ось X перевернута, значит синус нужно домножить на -1.
Получаем координаты X и Z нашего вектора взгляда:
X = -sin(yaw)
Z = cos(yaw)
Не забываем домножить на R, потому что окружность не единичная.

Получаем формулы для нахождения вектора взгляда:
X = -sin(yaw) * R = -sin(yaw) * cos(pitch)
Y = -sin(pitch)
Z = cos(yaw) * R = cos(yaw) * cos(pitch)
 
Последнее редактирование:

astr34

Активный участник
Регистрация
16 Июл 2023
Сообщения
18
Если отбросить направления осей, интуитивно понять принцип нахождения вектора взгляда поможет эта картинка:

13.PNG


Часть IV. Как получать синус и косинус в коде?

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

Для реализации функций проще всего использовать табличные значения, их нужно занести в массив. Нам нужны значения синуса и косинуса в диапазоне -90..360 градусов.

При округлении угла до целого, мы получаем максимальную погрешность в 0.5 градуса (если угол % 1 < 0.5, то целая ч. угла; иначе целая ч. угла+1). Погрешность равна tg(0.5°)/м, то есть 0.0087/м. Максимальная дальность видимости игрока на сервере на момент написания - 48 блоков.

Если игрок A находится в (0;0;0), а игрок B в:
а) (48;0;0), то расстояние AB = 48м
б) (48;48;0), то расстояние AB = √(48²+48²) = ~67.8м
в) (48;48;48), то расстояние AB = √(48²+48²+48²) = ~83.1м

Получим погрешности для трёх случаев:
а) 0.0087 * 48 = ~0.41 блока
б) 0.0087 * 67.8 = ~0.59 блока
в) 0.0087 * 83.1 = ~0.72 блока

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

Учтем эти свойства синуса и косинуса:
sin(-x) = -sin(x)
cos(-x) = cos(x)
Косинус можно выразить из синуса: cos(x) = sin(x+90°);
Поэтому занести в массив придется лишь 360 значений синуса. Если заносить 1 значение за 2с, на заполнение уйдет 360*2 / 60 = 6*2 = 12 минут.

Массив значений синусов назовем sin_table, обязательно сохраните его на Shift+ПКМ

Функция sin_table_setup: (эту функцию потом можно скопировать в любой мир)
Операции с массивами -> Создать массив (sin_table)
Операции с массивами -> Добавить элемент в массив, туда последовательно (и внимательно!) заносите значения (потребуется несколько блоков, в сундуке каждого по 27 слотов)

Значения синуса от 0° до 360°:
https://pastebin.com/7SR35Hpf

Получение синуса угла X:
Код:
Округлить X (обычное округление);
X = X % 360 (% - остаток от деления)
Если X < 0:
    X = -1 * X
    X += 1 (индексы массива начинаются с 1, градусы с 0)
    Получить sin из sin_table по индексу X
    sin = -1 * sin
Иначе:
    X += 1 (индексы массива начинаются с 1, градусы с 0)
    Получить sin из sin_table по индексу X

Получение косинуса угла X:
Код:
X += 90
Получить синус угла X

Часть V. Спавн и запуск снаряда. Проблемы реализации.

Познакомимся с алгоритмом спавна и запуска снаряда:

1) Найти вектор взгляда;
2) Найти точку спавна снаряда, умножив координаты вектора на коэффициент Q (расстояние от игрока) и добавив результат к местоположению игрока + 1.62 по Y (высота взгляда игрока);
3) Найти силу запуска (Motion) снаряда, умножив координаты вектора на коэффициент P (для стрел он будет задавать и урон);
4) Заспавнить сущность в точке спавна;
5) Выбрать сущность по условию в радиусе 0 блоков от точки спавна;
6) Запустить сущность по полученным значениям Motion;

Проблема 1.
Хитбокс снаряда на сфере возможных точек спавна снаряда может пересекаться с хитбоксом игрока. Получается, что снаряд может столкнуться с игроком, относительно которого он был запущен. Решить эту проблему можно несколькими способами:

1) Увеличить коэффициент Q, но есть вероятность того, что при pitch близком к 0, снаряд будет проходить через стену (спавниться за стеной) или через близко стоящую сущность.
2) Рассчитать отдельный вектор для спавна снаряда с ограниченным pitch (min = -max; если pitch > max, то pitch = max; если pitch < min, то pitch = min). Игрок ничего не заметит пока pitch не выйдет за пределы.
3) Рассчитать отдельный вектор для спавна снаряда, концы которого будут образовывать не сферу, а цилиндр (хитбокс игрока в него помещается более "компактно"). Просто значения вектора x и z нужно брать не от сечения сферы в sin(pitch), а от единичной окружности, т.е просто не домножать на радиус. Длина такого вектора уже не будет равна 1 при pitch отличном от 0; Чем дальше будет pitch от 0, тем больше игрок будет замечать, что снаряд спавнится дальше от него, но это сэкономит немного операций.

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

Проблема 2.
Снаряд может всё равно столкнуться с игроком, относительно которого он запущен, если игрок идет или бежит в направлении снаряда. Возможные решения:

1) Увеличить дальность спавна снаряда (коэффициент Q)
2) Увеличить скорость полета снаряда (коэффициент P)
3) Замедлить игрока при запуске снаряда
4) Использовать сразу несколько из вышеперечисленных решений, чтобы уменьшить меру каждого по отдельности.

Проблема 3.
Операции ограничены. 1 блок кода запущенный 1 раз = 1 операция. Для Hero и выше лимит операций на сервере на момент написания - 800 на 5 тиков или 3200/с (секунда = 20 тиков при нормальной производительности сервера). С каждым зашедшим в игру игроком лимит увеличивается (см. https://ruforum.mineland.net/threads/kak-sdelat-anti-spam.1495/post-5438).

Потребление операций на один запуск (одно выполнение алгоритма) зависит в основном от выбранного вами решения для первой проблемы и от реализации конечного алгоритма в коде (если вы хотите добавить разброс, отдачу, звук, частицы, счётчик обоймы - потребление операций увеличится).

Допустимое количество операций будет зависеть от вашего ранга; нагрузки остального кода вашей игры; количества игроков, на которое рассчитана игра. От допустимого количества операций будет зависеть насколько часто могут запускаться снаряды.

Предполагаю, что в большинстве случаев конечный алгоритм будет потреблять в районе 40-80 операций на 1 запуск.

Пример: ваш ранг - Hero (лимит 3200/с, +1600/с за каждого игрока начиная со второго), остальной код независимо от кол-ва игроков потребляет не более 1000 операций в секунду, ваша игра рассчитана на 2-8 игроков, а конечный алгоритм потребляет 70 операций на запуск. 3200-1000=2200 оп/с доступно, когда в игре один игрок; 2200+1600=3800 оп/с доступно для 2 игроков, 1900 на игрока; 2200+(8-1)*1600=13400 оп/с доступно для 8 игроков, 1675 на игрока. Возьмём наименьшее значение (из 1900 и 1675), 1675/70=23 раза в секунду можно запускать снаряды относительно каждого игрока в этой игре.

Прочее:

- Как увеличить разброс снаряда?
К значениям PITCH и YAW перед получением вектора нужно добавить случайное число из диапазона (-угол разброса; угол разброса).

- Как сделать отдачу?
После запуска снаряда изменять значения взгляда игрока (PITCH и YAW) и телепортировать на измененные значения взгляд игрока (при телепортации учитывать только значения взгляда).
 
Последнее редактирование:

astr34

Активный участник
Регистрация
16 Июл 2023
Сообщения
18
до определённого момента всё понятно, пока не началось первое предложение в этой теме
да, вроде тут всё интуитивно объяснили, но... лучше в шк бозубрить, нежели пытаться что-то тут вникнуть
удали свои сообщения пожалуйста, не могу вставлять туда больше картинки из-за лимита
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
297
Часть IV. Как получать синус и косинус в коде?
если честно, тут тоже нифига не понятно, либо я слишком тупой
Сообщение объединено:

Получение синуса угла X:
а откуда мы этот X берём? это тот-же YAW ?
как я понял - да
 
Последнее редактирование:

astr34

Активный участник
Регистрация
16 Июл 2023
Сообщения
18
если честно, тут тоже нифига не понятно, либо я слишком тупой
Сообщение объединено:


а откуда мы этот X берём? это тот-же YAW ?
как я понял - да
Если не понятно что-то из этого:
tg(0.5°), sin(-x) = -sin(x), cos(-x) = cos(x), cos(x) = sin(x+90°);
То это и не важно, и так простыня вышла, думаю некоторые могут испугаться таких размеров.
X это любой угол в градусах.
PITCH и YAW измеряются в градусах.
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
297
Если не понятно что-то из этого:
tg(0.5°), sin(-x) = -sin(x), cos(-x) = cos(x), cos(x) = sin(x+90°);
То это и не важно, и так простыня вышла, думаю некоторые могут испугаться таких размеров.
X это любой угол в градусах.
PITCH и YAW измеряются в градусах.
угу, так стало понятно, наверно даже получится сделать
Сообщение объединено:

свой первый вектор, капец
у меня вопрос по реализации: игрок скажем вызывает вектор, вызываем рекурсивную функцию, делаем эту операцию с вектором, сохраняем получившуюся координату и вызываем повторно эту функцию, или как?
 

astr34

Активный участник
Регистрация
16 Июл 2023
Сообщения
18
угу, так стало понятно, наверно даже получится сделать
Сообщение объединено:

свой первый вектор, капец
у меня вопрос по реализации: игрок скажем вызывает вектор, вызываем рекурсивную функцию, делаем эту операцию с вектором, сохраняем получившуюся координату и вызываем повторно эту функцию, или как?
Спавн и запуск снаряда:

1) Найти вектор взгляда;
2) Найти точку спавна снаряда, умножив координаты вектора на коэффициент Q (расстояние от игрока) и добавив результат к местоположению игрока + 1.62 (высота взгляда игрока);
3) Найти силу запуска (Motion) снаряда, умножив координаты вектора на коэффициент P (для стрел он будет задавать и урон);
4) Заспавнить сущность в точке спавна:
5) Выбрать сущность по условию в радиусе 0 блоков от точки спавна.
6) Запустить сущность по полученным значениям Motion.


подробнее в 5 части будет
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
297
ок
Спавн и запуск снаряда:

1) Найти вектор взгляда;
2) Найти точку спавна снаряда, умножив координаты вектора на коэффициент Q (расстояние от игрока) и добавив результат к местоположению игрока + 1.62 (высота игрока);
3) Найти силу запуска (Motion) снаряда, умножив координаты вектора на коэффициент P (для стрел он будет задавать и урон);
4) Заспавнить сущность в точке спавна:
5) Выбрать сущность по условию в радиусе 0 блоков от точки спавна.
6) Запустить сущность по полученным значениям Motion.


подробнее в 5 части будет
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
297
Получение косинуса угла X:
Код:
X += 90
X = X % 360
Получить синус угла X
бригаду

x % 360 - это типо получить остаток деления?
Сообщение объединено:

Получаем формулы для нахождения вектора взгляда:
X = -sin(yaw) * R = -sin(yaw) * cos(pitch)
Y = -sin(pitch)
Z = cos(yaw) * R = cos(yaw) * cos(pitch)
я тут покумекал - понял как это работает, прикольно
 

astr34

Активный участник
Регистрация
16 Июл 2023
Сообщения
18
бригаду

x % 360 - это типо получить остаток деления?
Сообщение объединено:


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

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
297
Версия гайда: 1.0 (01.10.23)

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

Для понимания потребуются некоторые знания из тригонометрии, поэтому в первой части я расскажу про тригонометрическую окружность, синус и косинус. Если уверен в своих знаниях - пропускай её.


Часть I. Начала тригонометрии.

Тригонометрическая окружность
- это единичная окружность (окружность с радиусом 1) с центром в начале координат.

Посмотреть вложение 4098

Какой угол (по величине) показан на правой окружности?
приблизительно -45°

Возьмём единичную окружность, отметим на ней случайную точку P.
Проведём отрезок PA параллельно оси X, точка A лежит на оси Y.
Проведём отрезок PB параллельно оси Y, точка B лежит на оси X.

Посмотреть вложение 4099

Синус - координата точки A на оси Y.
Косинус - координата точки B на оси X.

Т.е синус и косинус - это просто координаты любой точки, лежащей на единичной окружности.
Синус - координата на вертикальной оси, косинус - на горизонтальной оси (если оси расположены так как на рисунке).

Но что если радиус окружности не равен 1?
С изменением радиуса окружности пропорциоонально изменяются и координаты точки.
  • Чтобы найти координаты точки зная синус и косинус нужно умножить их на радиус.
  • Чтобы найти синус и косинус точки зная координаты нужно разделить координаты на радиус.

Чему равен косинус этого угла?

Посмотреть вложение 4100

0.5 (1/R = 1/2 = 0.5)


Часть II. Что такое вектор взгляда?

Вектор
- это отрезок, имеющий направление, т.е начало и конец.

Посмотреть вложение 4101

Единичный вектор - это вектор, длина которого равна 1.

Координатами вектора являются значения, сместившись на которые из начальной точки вектора (т.е прибавив их к координатам точки начала), мы окажемся в конечной точке вектора. Если начало вектора находится в начале координат, координаты вектора и координаты его конечной точки совпадают. Если начало не находится в начале координат, то чтобы найти координаты вектора нужно от координат конечной точки отнять координаты начальной.
Пример 1: есть вектор AB: A(0; 0), B(1; 3). Тогда AB{1-0; 3-0} = AB{1; 3}.
Пример 2: есть вектор CD: C(1; 1), D(-2; 3). Тогда CD{-2-1; 3-1} = CD{-3; 2}.

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

Другими словами,
Вектор взгляда - это координаты для осей XYZ, на которые нужно сместиться, чтобы пройти единицу расстояния в направлении взгляда.

Посмотреть вложение 4102


Часть III. Как получить вектор взгляда?

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

Для начала получим YAW и PITCH, вытащив значения из "Игровое значение" -> "Текущее направление взгляда".

Посмотреть вложение 4103

PITCH и YAW измеряются в градусах.

PITCH - это поворот вниз-вверх
- Отсчёт: -Y (90°) +Y (-90°) (-90° .. 90°).
YAW - это поворот влево-вправо
- Отсчёт: +Z (0°/360°) -X (90°) -Z (180°) +X (270°) (0° .. 360°).

Так как длина вектора взгляда равна 1 (не меняется), набор всех возможных точек (концов векторов) образуют сферу (т.к сфера это по определению набор равноудалённых точек в трёхмерном пространстве).
На этой сфере PITCH - широта, а YAW - долгота (если вам это как-то поможет).

Посмотреть вложение 4104

Рассмотрим PITCH (широту) на плоскости YA (см левую часть).
A - луч, который может лежать на оси X или Y, а может и не лежать, его местоположение зависит от YAW. Смотря на предыдущую картинку несложно представить, как эта полуокружность вращается вокруг оси Y с изменением YAW.

Посмотреть вложение 4105

Для удобства перевернём картинку (см. правую часть). На полуокружности возможных значений PITCH находится точка M - случайное значение PITCH. Найдём значение синуса. Как можно видеть, оно лежит на перевёрнутой оси Y. Поэтому, для нахождения координаты Y вектора, его нужно домножить на -1 (это понятно ещё отсюда: "-Y (90°) +Y (-90°)" - в майнкрафте "вверх" это под отрицательным углом)

Итак, координата Y вектора взгляда найдена: -sin(pitch)

Теперь найдём точку косинуса, а точку sin(M) обозначим буквой P.
Можно заметить что длина отрезка PM = cos(M). Это верно пока cos(M) неотрицателен, у нас это условие всегда выполняется (pitch не выходит за пределы -90 .. 90 градусов).

Посмотреть вложение 4106

PM - это радиус окружности, которая получится на сечении сферы плоскостью XZ (горизонтальной плоскостью) в точке Y равной P. Сечение это то, что находится в секущей плоскости.

Фиолетовым выделена окружность, которая получится на сечении. Это окружность всех возможных значений YAW (долготы). Её центр - точка P, PM - радиус. Радиус PM обозначим за R.

Посмотреть вложение 4107
Сообщение объединено:

Рассмотрим эту окружность:

Посмотреть вложение 4108

Для удобства повернём на 90 градусов по ч.с. Отметим случайное значение YAW, например точку K. Найдём точки синуса и косинуса.

Посмотреть вложение 4109

Ось X перевернута, значит синус нужно домножить на -1.
Получаем координаты X и Z нашего вектора взгляда:
X = -sin(yaw)
Z = cos(yaw)
Не забываем домножить на R, потому что окружность не единичная.

Получаем формулы для нахождения вектора взгляда:
X = -sin(yaw) * R = -sin(yaw) * cos(pitch)
Y = -sin(pitch)
Z = cos(yaw) * R = cos(yaw) * cos(pitch)
спасибо за столь крутую тему, я скоро создам свой вектор <3
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
297
что делать, если YAW у меня 670, а не "от -90 до 270"
UPD: мл кринж. Там, где ты пишешь про нахождение синуса, где (x < 0) - сделай, что если x > 360 -> x -360
 

Mee8YT

Эксперт
Регистрация
3 Май 2023
Сообщения
297
Получение косинуса угла X:
Код:
X += 90
X = X % 360 (% - остаток от деления)
Получить синус угла X
не понял
то есть надо найти остаток деления X на 360,а затем с этим индексом взять синус? или нужно делать cos-table?
 

0xWave

Разработчик проекта
Команда форума
Разработчик проекта
Регистрация
1 Май 2023
Сообщения
164
синусы, косинусы, тангенсы, арксинусы, арккосинусы, арктангенсы, радианы
 

astr34

Активный участник
Регистрация
16 Июл 2023
Сообщения
18
что делать, если YAW у меня 670, а не "от -90 до 270"
UPD: мл кринж. Там, где ты пишешь про нахождение синуса, где (x < 0) - сделай, что если x > 360 -> x -360
Ничего себе, я видел только YAW с обратным отсчётом (где -30° это 330°), эти функции с отрицательными значениями должны работать. Добавил получение остатка от деления на 360 перед получением синуса.
Сообщение объединено:

не понял
то есть надо найти остаток деления X на 360,а затем с этим индексом взять синус? или нужно делать cos-table?
нужно вызвать функцию нахождения синуса (вставить весь код из нее), косинус выражен из синуса по свойству cos(x) = sin(x+90°).
Сообщение объединено:


синусы, косинусы, тангенсы, арксинусы, арккосинусы, арктангенсы, радианы
добавлены??
 
Последнее редактирование:

astr34

Активный участник
Регистрация
16 Июл 2023
Сообщения
18
Обновил гайд.

Вообще хотелось бы в одну операцию получать синус/косинус по углу в градусах, а не переводить сначала в радианы.

Надеюсь добавят возведение в n степень и извлечение корня n степени. Пока это можно сделать через экспоненту и натуральный логарифм:
n = e^ln{n}, тогда n^m = (e^ln{n})^m = e^(ln{n}*m)
n√m = m^(1/n), m = e^ln(m), тогда m^(1/n) = e^(ln(m)/n)
 
Сверху