sinh
2026/4/15大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — sinh
sinh
定义
sinh() 是双曲正弦函数(hyperbolic sine)。
如果你还记得中学数学,普通的 sin() 是在圆上取纵坐标——角度转一圈又回到原点。而 sinh() 是在双曲线上取纵坐标——它的图像是一条从原点出发、向两端无限增长的曲线。
打个生活中的比方:普通 sin() 就像钟摆,来回摆动有规律;而 sinh() 更像一根挂在两个支点间的晾衣绳——中间最低(在零点处为 0),越往两边垂得越低(数值越大)。
实际上,晾衣绳的形状就是"悬链线",而悬链线的数学表达正是由 cosh() 和 sinh() 组合而成的。
函数签名
C#
// 方式一:使用 Godot 的 Mathf(推荐,返回 float)
public static float Sinh(float x)
// 方式二:使用 .NET 标准库(返回 double)
public static double Sinh(double x)GDScript
func sinh(x: float) -> float参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| x | float | 是 | 输入值,可以是任意实数(正数、负数、零都可以) |
返回值
类型: float
返回 x 的双曲正弦值。与普通 sin() 不同,sinh() 的输出没有上下界,可以无限增大或无限减小。
| 输入 | 输出 | 说明 |
|---|---|---|
| 0.0 | 0.0 | 原点处输出恰好为零 |
| 正数(如 2.0) | 正数(约 3.63) | 正方向指数级增长 |
| 负数(如 -2.0) | 负数(约 -3.63) | 负方向指数级增长(关于原点对称) |
代码示例
下面演示如何用 sinh() 和 cosh() 计算悬链线的高度,模拟一根挂在两点之间的绳索:
C#
using Godot;
public partial class CatenaryCurve : Node2D
{
// 导出属性:悬链线的参数 a,控制绳索的松紧程度
[Export] public float ExCatenaryA = 50f;
// 导出属性:采样点数量
[Export] public int ExSampleCount = 20;
// 内部变量:绳索起点
private Vector2 _startPoint = new(0, 0);
public override void _Ready()
{
// 悬链线公式:y = a * cosh(x / a) - a
// 这里用 sinh 计算每段的倾斜角度
for (int i = 0; i <= ExSampleCount; i++)
{
float t = (float)i / ExSampleCount;
float xOffset = Mathf.Lerp(-100f, 100f, t);
// cosh 计算高度,sinh 计算斜率
float height = ExCatenaryA * Mathf.Cosh(xOffset / ExCatenaryA) - ExCatenaryA;
float slope = Mathf.Sinh(xOffset / ExCatenaryA);
GD.Print($"位置 {i}: x={xOffset:F1}, 高度={height:F1}, 斜率={slope:F2}");
}
}
}GDScript
extends Node2D
## 导出属性:悬链线的参数 a,控制绳索的松紧程度
@export var ex_catenary_a: float = 50.0
## 导出属性:采样点数量
@export var ex_sample_count: int = 20
## 内部变量:绳索起点
var _start_point := Vector2(0, 0)
func _ready() -> void:
# 悬链线公式:y = a * cosh(x / a) - a
# 这里用 sinh 计算每段的倾斜角度
for i in range(ex_sample_count + 1):
var t := float(i) / ex_sample_count
var x_offset := lerpf(-100.0, 100.0, t)
# cosh 计算高度,sinh 计算斜率
var height := ex_catenary_a * cosh(x_offset / ex_catenary_a) - ex_catenary_a
var slope := sinh(x_offset / ex_catenary_a)
print("位置 %d: x=%.1f, 高度=%.1f, 斜率=%.2f" % [i, x_offset, height, slope])注意事项
- 输出没有上限:与
sin()(范围 -1 到 1)不同,sinh()的输出可以非常大。输入 10.0 时输出约 11013,输入 100.0 时会溢出为无穷大。使用时要注意数值范围。 - 关于原点对称:
sinh(-x) = -sinh(x),即奇函数。这意味着输入正数和负数时,输出的绝对值相同但符号相反。 - 与
sin()的区别:sin()是三角函数,输入是角度(弧度),输出在 -1 到 1 之间来回波动;sinh()是双曲函数,输入是实数,输出向两端指数级增长,不会波动。 - C# 中的选择:在 Godot C# 中推荐使用
Mathf.Sinh()(返回float),而不是Math.Sinh()(返回double),这样可以避免不必要的类型转换。 - 常用恒等式:
cosh(x) * cosh(x) - sinh(x) * sinh(x) = 1,这是双曲函数最基础的等式,类似于三角函数的sin^2 + cos^2 = 1。
