写一个c++获取两向量间夹角
时间: 2024-06-02 12:13:53 浏览: 68
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
int main()
{
double x1, y1, x2, y2;
printf("请输入第一个向量的坐标x1,y1:");
scanf("%lf,%lf", &x1, &y1);
printf("请输入第二个向量的坐标x2,y2:");
scanf("%lf,%lf", &x2, &y2);
double dot_product = x1 * x2 + y1 * y2; //向量点积
double len1 = sqrt(x1 * x1 + y1 * y1); //向量1的模长
double len2 = sqrt(x2 * x2 + y2 * y2); //向量2的模长
double cos_theta = dot_product / (len1 * len2); //余弦值
double theta = acos(cos_theta); //角度值
printf("两向量的夹角为:%f度\n", theta * 180 / PI);
return 0;
}
相关问题
c++求两向量求夹角代码
以下是求两个向量夹角的 C 代码:
```c
#include <stdio.h>
#include <math.h>
#define PI 3.14159265
// 计算两个向量的点积
double dot_product(double x1, double y1, double x2, double y2) {
return x1 * x2 + y1 * y2;
}
// 计算向量的模长
double norm(double x, double y) {
return sqrt(x * x + y * y);
}
// 计算两个向量的夹角(单位为弧度)
double angle(double x1, double y1, double x2, double y2) {
double dot = dot_product(x1, y1, x2, y2);
double norm1 = norm(x1, y1);
double norm2 = norm(x2, y2);
double cos_theta = dot / (norm1 * norm2);
return acos(cos_theta);
}
int main() {
double x1, y1, x2, y2;
printf("请输入第一个向量的 x 分量和 y 分量:");
scanf("%lf %lf", &x1, &y1);
printf("请输入第二个向量的 x 分量和 y 分量:");
scanf("%lf %lf", &x2, &y2);
double theta = angle(x1, y1, x2, y2);
printf("两个向量的夹角为 %.2f°\n", theta * 180.0 / PI);
return 0;
}
```
注:本程序中,`dot_product` 函数用来计算两个向量的点积,`norm` 函数用来计算向量的模长,`angle` 函数用来计算两个向量的夹角(单位为弧度)。最后,将夹角转换为度数并输出。
c++中两向量的夹角怎么求,夹角值为-Π到Π
在C++中,由于`atan2`函数可以处理返回值在-π到π之间的角度,所以计算两个向量的夹角通常会用到它。假设我们有两个二维向量`(x1, y1)`和`(x2, y2)`,其夹角可以通过以下步骤来求:
```cpp
#include <cmath>
#include <complex>
// 将向量转换为复数形式
std::complex<double> vec1{x1, y1};
std::complex<double> vec2{x2, y2};
// 计算两个向量的内积和各自的模长
double dotProduct = vec1 * conj(vec2);
double magnitudeA = abs(vec1);
double magnitudeB = abs(vec2);
// 使用atan2计算夹角
double angleInRadians = std::atan2(dotProduct.imag(), dotProduct.real()) / magnitudeA;
angleInRadians += std::acos(std::min(1.0, dotProduct.real() / (magnitudeA * magnitudeB)));
// 如果角度超过π,减去2π,保持在(-π, π]范围内
if (angleInRadians > M_PI)
angleInRadians -= 2.0 * M_PI;
// 或者直接使用asin来避免溢出,但可能会有精度损失
// double angleInRadians = std::asin(dotProduct.real() / magnitudeA) / M_PI;
```
这里使用了复数库`<complex>`,因为`std::atan2`更适合处理这种情况。
阅读全文