Перейти к содержимому

Углы и расстояния

Расстояние до точки, угол на неё и разница между углами — три операции, которые нужны всем

среднийНужно знать: op: арифметика

Почти всё, что делает процессор с миром, упирается в два вопроса: далеко ли и в какую сторону. Далеко — это len, в какую сторону — angle. Обе работают не с точками, а со смещением: сколько вправо и сколько вверх.

тик 0
Установить0
=
Установить1
=
Операция2
=
Операция3
=
Операция4
=
Операция5
=
@counter0number
dxnullnull
dynullnull
расстояниеnullnull
уголnullnull
разницаnullnull
высотаnullnull
Операция Что считает Ответ
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. Через ноль она считает правильно — этим и полезна.

тик 0
Операция0
=
Операция1
=
@counter0number
диагональnullnull
назадnullnull

Диагональ единичного квадрата — это √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.