Блог программиста
Математика Unity (Урок 4). Mathf два арктангенса.
04.07.2013Математика Unity

В предыдущем уроке рассматривались обратные функции синуса и косинуса — арксинус и арккосинус. Сегодня мы рассмотрим обратные функции тангенса и котангенса — арктангенс и арккотангенс. Начнём с определений:

Арктангенс числа k – значение угла a в диапазоне от -90 до 90 градусов, тангенс которого равен k. Арккотангенс числа k – значение угла a в диапазоне от 0 до 180 градусов, котангенс которого равен k.

В Unity3D (C#) есть два способа вычислить арктангенс (углы исчисляются в радианах):
float Angle = Mathf.Atan(float tg)			//Арктангенс
float Angle = Mathf.Atan2(float sin, float cos)	//Арктангенс

В первом случае мы получаем, как и написано в определении, значение угла в диапазоне от -90 до 90 градусов.
Во второй функции, в качестве параметров мы передаём не тангенс, а синус и косинус. Благодаря этому получаем значение угла в диапазоне от 0 до 360.

Для арккотангенса отдельной функции не предусмотрено, но его также можно получить тремя способами (углы исчисляются в радианах):
float Angle = 90*Mathf.DegToRad - Mathf.Atan(float ctg)			//Арккотангенс
float Angle = 90*Mathf.DegToRad - Mathf.Atan2(float cos, float sin)	//Арккотангенс

В первом случае мы переводим 90 в радианы и отнимаем арктангенс, полученный от значения котангенса.
Во втором случае мы переводим 90 в радианы и отнимаем арктангенс, в котором поменяли косинус и синус местами.
Третий способ: вычислить тангенс, через котангенс (tg = 1/ctg) и от тангеса вычислить арктангенс.

Можно наоборот, переводить арктангенс в градусы, а 90 не трогать, тогда значение углов будет в градусах:
float Angle = 90 - Mathf.Atan(float ctg) * Mathf.RadToDeg			//Арккотангенс
float Angle = 90 - Mathf.Atan2(float cos, float sin) * Mathf.RadToDeg	//Арккотангенс

Практика с арктангенсом.


Ситуация точно такая же как и в уроке про арксинус и арккосинус: запретная зона, охранник и прогуливающийся игрок.

Только в этом случае мы применим арктангенс:
using UnityEngine;
public class RotateSecurity : MonoBehaviour {
     
    public Transform player;           
     
    // Update is called once per frame
    void Update ()
    {
        if(player == null) return;     
        Vector3 normPos = player.position.normalized;  
	//Получаем арктангенс и переводим его в градусы
        float Angle = Mathf.Atan2(normPos.x, normPos.z) * Mathf.Rad2Deg;
        transform.Rotate(Vector3.up, Angle - transform.rotation.eulerAngles.y);
    }
}

Как видно арктангенс упростил наш код. Мы избавились от условия со знаком синуса.

Урок получился небольшой, но надеюсь полезным.
P.S. Если что-то не понятно, пишите в комментариях.

13659