cosh
2026/4/15大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — cosh
cosh
定义
cosh() 是双曲余弦函数(hyperbolic cosine)。
普通 cos() 的图像是一条在 -1 到 1 之间来回波动的波浪线。而 cosh() 的图像像一个大大的 U 形山谷——谷底在 cosh(0) = 1,往两边越走越高,永远不会下降。
打个比方:想象一个 U 形山谷的截面图,你站在谷底(高度为 1),往左走或往右走都是上坡,越走越高,永远不会停下来。cosh() 的图像就是这个山坡的轮廓。
生活中最常见的 cosh() 应用是悬链线——两根电线杆之间的电线、挂在两个挂钩之间的项链,它们的形状都可以用 cosh() 来精确描述。
函数签名
C#
// 方式一:使用 Godot 的 Mathf(推荐,返回 float)
public static float Cosh(float x)
// 方式二:使用 .NET 标准库(返回 double)
public static double Cosh(double x)GDScript
func cosh(x: float) -> float参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| x | float | 是 | 输入值,可以是任意实数(正数、负数、零都可以) |
返回值
类型: float
返回 x 的双曲余弦值。输出永远大于等于 1,没有上限。
| 输入 | 输出 | 说明 |
|---|---|---|
| 0.0 | 1.0 | 最小值,"山谷谷底" |
| 正数(如 2.0) | 正数(约 3.76) | 向右"爬坡" |
| 负数(如 -2.0) | 正数(约 3.76) | 向左"爬坡",与正数结果相同 |
代码示例
下面演示用 cosh() 绘制一根挂在两个固定点之间的悬链线(比如桥上的钢缆):
C#
using Godot;
public partial class CableRenderer : Node2D
{
// 导出属性:悬链线参数,控制"松弛程度"(值越小越紧绷)
[Export] public float ExCatenaryA = 80f;
// 导出属性:两个支点的水平距离
[Export] public float ExSpanWidth = 400f;
// 内部变量:采样点数组
private Vector2[] _cablePoints;
public override void _Ready()
{
int pointCount = 50;
_cablePoints = new Vector2[pointCount];
for (int i = 0; i < pointCount; i++)
{
float t = (float)i / (pointCount - 1);
// 从 -halfSpan 到 +halfSpan 等间距采样
float halfSpan = ExSpanWidth / 2f;
float x = Mathf.Lerp(-halfSpan, halfSpan, t);
// 悬链线公式:y = a * cosh(x / a) - a
// 减去 a 是为了让最低点高度为 0
float y = ExCatenaryA * Mathf.Cosh(x / ExCatenaryA) - ExCatenaryA;
_cablePoints[i] = new Vector2(x, -y); // 取负让线往下垂
}
GD.Print($"钢缆最低点下垂距离: {_cablePoints[pointCount / 2].Y:F1}");
}
}GDScript
extends Node2D
## 导出属性:悬链线参数,控制"松弛程度"(值越小越紧绷)
@export var ex_catenary_a: float = 80.0
## 导出属性:两个支点的水平距离
@export var ex_span_width: float = 400.0
## 内部变量:采样点数组
var _cable_points: Array[Vector2] = []
func _ready() -> void:
var point_count := 50
for i in range(point_count):
var t := float(i) / (point_count - 1)
# 从 -half_span 到 +half_span 等间距采样
var half_span := ex_span_width / 2.0
var x := lerpf(-half_span, half_span, t)
# 悬链线公式:y = a * cosh(x / a) - a
# 减去 a 是为了让最低点高度为 0
var y := ex_catenary_a * cosh(x / ex_catenary_a) - ex_catenary_a
_cable_points.append(Vector2(x, -y)) # 取负让线往下垂
var lowest := _cable_points[point_count / 2]
print("钢缆最低点下垂距离: %.1f" % lowest.y)注意事项
- 最小值是 1:
cosh(0) = 1是整个函数的最小值。不管输入正数还是负数,输出都大于等于 1。这与cos()(最小值为 -1)完全不同。 - 关于 y 轴对称:
cosh(-x) = cosh(x),即偶函数。这意味着输入正数和负数的结果完全相同,图像左右对称。 - 输出增长非常快:
cosh()是指数级增长的函数。cosh(10)约等于 11013,cosh(100)会溢出为无穷大。实际使用中要注意输入范围不要太大。 - 与
sinh()的关系:cosh(x)和sinh(x)就像一对"兄弟函数",满足恒等式cosh^2(x) - sinh^2(x) = 1(对比三角函数的cos^2 + sin^2 = 1)。 - C# 中的选择:在 Godot C# 中推荐使用
Mathf.Cosh()(返回float),而不是Math.Cosh()(返回double),这样可以避免不必要的类型转换。
