tan
2026/4/14大约 5 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — tan
tan
定义
tan() 是正切函数——它等于同一个角度的 sin() 除以 cos(),也就是 tan(angle) = sin(angle) / cos(angle)。
打个比方:如果你站在一座山的脚下,想知道山有多陡,你会看"每走一米水平距离,海拔升高多少米"。这个"陡峭程度"就是正切值。角度越大,山越陡,tan() 的值就越大。当角度接近 90 度(垂直的悬崖)时,tan() 会变得无限大。
与 sin() 和 cos() 不同,tan() 的输出没有上限。它可以是从负无穷到正无穷的任何值。而且在 90 度和 270 度(即 PI/2 和 3*PI/2 弧度)附近,它的值会"爆炸"——趋向于正无穷或负无穷。
角度单位是弧度,不是度数
tan() 接收的参数是弧度。90 度 = PI/2 弧度。如果输入度数,需要先用 deg_to_rad() 转换。
函数签名
C#
// 使用 Godot 的 Mathf(推荐,返回 float)
public static float Tan(float angleRad)GDScript
func tan(angle_rad: float) -> float参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
angleRad / angle_rad | float | 是 | 角度值,单位为弧度。注意避开 PI/2、3*PI/2 等使 cos 为零的角度 |
返回值
类型: float
返回给定角度的正切值。输出范围是负无穷到正无穷。
| 输入(弧度) | 输出 | 说明 |
|---|---|---|
| 0 | 0.0 | sin(0)/cos(0) = 0/1 = 0 |
| PI/4(约 0.785) | 1.0 | 45 度,经典值:sin 和 cos 相等,比值为 1 |
| PI/3(约 1.047) | 约 1.732 | 60 度,即 sqrt(3) |
| PI/2(约 1.571) | 极大数/NaN | 90 度,cos 为零,值"爆炸" |
代码示例
基础用法:计算不同角度的正切值
C#
using Godot;
public partial class TanExample : Node
{
public override void _Ready()
{
// 0 度
float r1 = Mathf.Tan(0f);
GD.Print("tan(0) = " + r1);
// 运行结果: tan(0) = 0
// 45 度 = PI/4
float r2 = Mathf.Tan(Mathf.Pi / 4f);
GD.Print("tan(PI/4) = " + r2);
// 运行结果: tan(PI/4) = 1
// 60 度 = PI/3
float r3 = Mathf.Tan(Mathf.Pi / 3f);
GD.Print("tan(PI/3) = " + r3);
// 运行结果: tan(PI/3) = 1.732051(即 sqrt(3))
}
}GDScript
extends Node
func _ready():
# 0 度
var r1 = tan(0.0)
print("tan(0) = ", r1)
# 运行结果: tan(0) = 0
# 45 度 = PI/4
var r2 = tan(PI / 4.0)
print("tan(PI/4) = ", r2)
# 运行结果: tan(PI/4) = 1
# 60 度 = PI/3
var r3 = tan(PI / 3.0)
print("tan(PI/3) = ", r3)
# 运行结果: tan(PI/3) = 1.732051(即 sqrt(3))实际场景:根据角度和水平距离计算高度
C#
using Godot;
public partial class SlopeCalculator : Node
{
public override void _Ready()
{
// 假设你站在距离山脚 100 米的位置看山顶
float distance = 100f;
// 测量仰角为 30 度
float angle = Mathf.DegToRad(30f);
// 用 tan 计算山的高度
// tan(角度) = 对边 / 邻边 = 高度 / 水平距离
float height = Mathf.Tan(angle) * distance;
GD.Print($"仰角 30 度,距离 {distance} 米,山高 = {height} 米");
// 运行结果: 仰角 30 度,距离 100 米,山高 = 57.73502 米
}
}GDScript
extends Node
func _ready():
# 假设你站在距离山脚 100 米的位置看山顶
var distance := 100.0
# 测量仰角为 30 度
var angle := deg_to_rad(30.0)
# 用 tan 计算山的高度
# tan(角度) = 对边 / 邻边 = 高度 / 水平距离
var height := tan(angle) * distance
print("仰角 30 度,距离 %d 米,山高 = %.5f 米" % [distance, height])
# 运行结果: 仰角 30 度,距离 100 米,山高 = 57.73502 米进阶用法:用 tan 计算视锥体(FOV)相关参数
C#
using Godot;
public partial class CameraHelper : Node
{
public override void _Ready()
{
// 已知相机的垂直视场角(FOV)为 70 度
float fovDegrees = 70f;
float fovRadians = Mathf.DegToRad(fovDegrees);
// 计算从相机到某距离处可见的半高度
// 公式:半高度 = 距离 * tan(FOV / 2)
float distance = 10f;
float halfHeight = Mathf.Tan(fovRadians / 2f) * distance;
float visibleHeight = halfHeight * 2f;
GD.Print($"FOV: {fovDegrees} 度, 距离: {distance}");
GD.Print($"在距离 {distance} 处,相机能看到的高度范围: {visibleHeight:F2}");
// 运行结果: FOV: 70 度, 距离: 10
// 运行结果: 在距离 10 处,相机能看到的高度范围: 14.00
// 根据屏幕宽高比计算水平可视范围
float aspectRatio = 16f / 9f;
float halfWidth = halfHeight * aspectRatio;
float visibleWidth = halfWidth * 2f;
GD.Print($"在距离 {distance} 处,相机能看到的宽度范围: {visibleWidth:F2}");
// 运行结果: 在距离 10 处,相机能看到的宽度范围: 24.89
}
}GDScript
extends Node
func _ready():
# 已知相机的垂直视场角(FOV)为 70 度
var fov_degrees := 70.0
var fov_radians := deg_to_rad(fov_degrees)
# 计算从相机到某距离处可见的半高度
# 公式:半高度 = 距离 * tan(FOV / 2)
var distance := 10.0
var half_height := tan(fov_radians / 2.0) * distance
var visible_height := half_height * 2.0
print("FOV: %d 度, 距离: %d" % [fov_degrees, distance])
print("在距离 %d 处,相机能看到的高度范围: %.2f" % [distance, visible_height])
# 运行结果: FOV: 70 度, 距离: 10
# 运行结果: 在距离 10 处,相机能看到的高度范围: 14.00
# 根据屏幕宽高比计算水平可视范围
var aspect_ratio := 16.0 / 9.0
var half_width := half_height * aspect_ratio
var visible_width := half_width * 2.0
print("在距离 %d 处,相机能看到的宽度范围: %.2f" % [distance, visible_width])
# 运行结果: 在距离 10 处,相机能看到的宽度范围: 24.89注意事项
- 参数是弧度,不是度数:和所有三角函数一样,
tan()接收弧度。tan(45)不等于tan(45度)。 - 在 PI/2 附近会"爆炸":当角度接近 90 度(PI/2 弧度)或 270 度(3*PI/2 弧度)时,
tan()的值趋向无穷大。实际使用中传入这些角度会得到非常大的数字或NaN。如果可能接近这些值,务必做安全检查。 - 输出没有范围限制:不像
sin()和cos()被"关"在 -1 到 1 之间,tan()可以输出任意大小的值。这一点在编写数值逻辑时要特别注意。 - 实际游戏开发中较少直接使用:大多数需要角度计算的场景(如求角度)更适合用
atan2(),而坡度/方向等可以用向量运算替代。tan()主要用于特定的几何计算。 - C# 中的选择:推荐使用
Mathf.Tan()(返回float),而不是Math.Tan()(返回double)。
