c++ - 带有acos的两个向量之间的C ++角度
问题描述
我试图让这段代码工作,它给出了角度,但不是正确的,它们加起来不等于 180°,我找不到问题。我已经实现了一个类似于二维向量的 Vector2 结构,并且我一直在尝试为其定义 ^ 运算符作为给出两个向量之间角度的函数。
我在这里先向您的帮助表示感谢!
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
struct Vector2 {
double x, y;
};
ostream& operator<<(ostream& out, const Vector2& w){
cout << '[' << w.x << " , " << w.y << ']';
return out;
}
double operator*(const Vector2& a, const Vector2& b){
double w = a.x*b.x + a.y*b.y;
return w;
}
double absc(const Vector2& d) {
return sqrt(d*d);
}
constexpr Vector2 operator+(const Vector2& a, const Vector2& b){
Vector2 y{a.x+b.x, a.y+a.y};
return y;
}
constexpr Vector2 operator-(const Vector2& a,const Vector2& b){
Vector2 z{a.x-b.x, a.y-b.y};
return z;
}
double operator^(const Vector2& a,const Vector2& b){
double n = (absc(a))*(absc(b));
double c = acos((a*b)/n);
return c;
}
int main(){
Vector2 a = {1.0, 1.0};
Vector2 b = {4.0, 7.0};
Vector2 c = {-2.0, 5.0};
double d =c^b;
double e = a^c;
double f = a^b;
auto grad = [](double rad) { return rad * (45./atan(1.0)); };
cout<<"Angle Alpha: "<<grad(c^b)<<"rad "<<d<<"\n";
cout<<"Angle Beta: "<<grad(a^c)<<"rad "<<e<<"\n";
cout<<"Angle Gamma: "<<grad(a^b)<<"rad "<<f<<"\n";
return EXIT_SUCCESS;
}
解决方案
你不是在比较直角,而是试试这个(从你拥有的点创建向量):
double d = (a-c)^(a-b);
double e = (b-a)^(b-c);
double f = (c-b)^(c-a);
auto grad = [](double rad) { return rad * (45./atan(1.0)); };
cout<<"Angle Alpha: "<<grad((a-c)^(a-b))<<"rad "<<d;
cout<<"\nAngle Beta: "<<grad((b-a)^(b-c))<<"rad "<<e;
cout<<"\nAngle Gamma: "<<grad((c-a)^(c-b))<<"rad "<<f;
现在你有 180° 或 pi。
推荐阅读
- javascript - 我们是否需要包含 javascript 方法的返回类型
- javascript - reactstrap 样式显示问题
- algorithm - 在法雷序列的第 n 阶中找到第 k 个元素
- php - 添加具有自定义主题但未定义的“setSortable”的 Visual Composer 版本 5.1.1
- react-native - React 本机项目无法在我的外部设备上运行
- angular - 将数据从firebase检索到数组中
- c# - 如何在 asp.net 中修复“System.Data.SqlClient.SqlException:'列名或提供的值的数量与表定义不匹配。'”
- html - 在 Apple Mail 中使用 html 电子邮件签名的正文出现问题
- python - 尝试从字符串转换数字列表时出现错误“int() 的文字无效”
- php - 在 WooCommerce 中的我的帐户仪表板上显示用户角色名称