Углы и расстояния
Расстояние до точки, угол на неё и разница между углами — три операции, которые нужны всем
Почти всё, что делает процессор с миром, упирается в два вопроса: далеко ли и в какую
сторону. Далеко — это len, в какую сторону — angle. Обе работают не с точками,
а со смещением: сколько вправо и сколько вверх.
| Операция | Что считает | Ответ |
|---|---|---|
len |
длину смещения, то есть расстояние | 50 |
angle |
угол этого смещения, от 0 до 360 | 53.130008697509766 |
angleDiff |
кратчайшую разницу двух углов, от 0 до 180 | 20 |
sin |
синус — и он в градусах | 0.49999999999999994 |
Два ответа из четырёх с длинным хвостом — так и должно быть, и почему, разобрано ниже.
Смещение считается вычитанием: op sub dx кудаX откудаX и то же для y. Координаты
процессор берёт у мира — как именно, в уроке
«Свойства зданий».
Угол считается против часовой стрелки от направления вправо
Заголовок раздела «Угол считается против часовой стрелки от направления вправо»Ноль — это «вправо», 90 — «вверх», 180 — «влево», 270 — «вниз». Тот же порядок, что
у поворота блоков в игре, и та же система, в которой отвечает sensor @rotation.
angleDiff отвечает на вопрос «насколько один угол не совпадает с другим», и ответ всегда
неотрицательный и не больше 180: между 350 и 10 разница 20, а не 340. Через ноль она
считает правильно — этим и полезна.
Ответы чуть-чуть не такие, как в учебнике
Заголовок раздела «Ответы чуть-чуть не такие, как в учебнике»Диагональ единичного квадрата — это √2, то есть 1.4142135623730951. mlog отвечает 1.4142135381698608. Угол «влево» — это 180, а mlog отвечает 179.99989.
Дело не в ошибке, а в точности, и причин у неё две.
len, angle и angleDiff в игре считаются числами одинарной точности, вдвое короче
обычных, а сам угол берётся приближённой формулой — отсюда и оборванный корень, и 179.99989
вместо 180. Остальная арифметика идёт в полной точности: так расходятся только эти три.
Синус же считается полной точностью, и хвост у него другого происхождения — тот самый, о котором урок «Целые и точность»: градусы переводятся в радианы делением, и половина не выходит ровной. Ноль целых четыре девятки девяносто девять — это и есть половина, просто записанная честно.
Остальная тригонометрия
Заголовок раздела «Остальная тригонометрия»cos, tan — как sin, в градусах. Обратные — asin, acos, atan — наоборот, отдают
градусы. Второго поля у всех пяти нет: считают одно число.
Отдельно стоит angle: она делает то же, что atan2 в других языках, и старое имя atan2
игра до сих пор понимает при чтении программы.
Неофициальный проект, с Anuke не связан. Спрайты, шрифты и переводы Mindustry © Anuke, используются по GPL-3.0; Fira Code — по OFL-1.1. Код сайта — GPL-3.0.