1. 向量与三角函数的基础概念
在C++中处理向量运算时,三角函数是不可或缺的数学工具。我们先明确两个基本概念:什么是向量?什么是弧度制?
向量在几何上可以理解为既有大小又有方向的量,在编程中我们通常用数组或结构体来表示。例如一个二维向量可以表示为:
cpp复制struct Vector2D {
double x;
double y;
};
而三角函数计算有一个关键前提:C++标准库中的三角函数(sin/cos/tan等)都使用弧度制而非角度制。这个细节在实际编程中经常被忽视,导致计算结果错误。弧度与角度的换算关系是:
code复制弧度 = 角度 × π / 180
π ≈ 3.141592653589793
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 计算单个向量的三角函数值
2.1 向量角度的计算
要计算向量的三角函数,首先需要知道向量的角度。对于一个二维向量(x,y),其与x轴的夹角θ可以通过atan2函数计算:
cpp复制double calculateAngle(const Vector2D& v) {
return std::atan2(v.y, v.x); // 返回弧度值
}
atan2相比atan的优势在于:
- 自动处理y=0的情况,避免除零错误
- 返回值范围是[-π, π],可以表示所有象限的角度
- 考虑了x和y的符号,能准确判断角度所在象限
2.2 基本三角函数计算
获得角度后,计算三角函数就很简单了:
cpp复制double sinVal = std::sin(angle);
double cosVal = std::cos(angle);
double tanVal = std::tan(angle);
但需要注意tan函数的特殊情况:
cpp复制// 检查tan是否会导致除零错误
if (std::abs(std::cos(angle)) < 1e-10) {
// 处理90度或270度附近的情况
}
3. 计算两个向量之间的三角函数
实际应用中,我们更常需要计算两个向量之间的夹角关系。
3.1 使用点积公式
两个向量u和v之间夹角θ的cos值可以通过点积公式计算:
cpp复制double dotProduct = u.x * v.x + u.y * v.y;
double uLength = std::sqrt(u.x*u.x + u.y*u.y);
double vLength = std::sqrt(v.x*v.x + v.y*v.y);
double cosTheta = dotProduct / (uLength * vLength);
这个方法的优势是:
- 不需要显式计算角度
- 数值稳定性较好
- 适用于高维向量
3.2 完整三角函数计算
有了cosθ后,可以推导出其他三角函数:
cpp复制double sinTheta = std::sqrt(1 - cosTheta*cosTheta);
// 需要考虑角度所在象限
if (crossProduct(u, v) < 0) {
sinTheta = -sinTh
