本文共 2092 字,大约阅读时间需要 6 分钟。
算法思路:通过余弦定理求取向量夹角的cosa,然后判断夹角是否大于180,如果大于,则向量夹角为360-arccosa*180/Pi(单位为°);否则夹角为arccosa*180/Pi。(Pi为常量3.14159265)。实验代码如下:
1、先定义Point头文件(Point.h)
# ifndef POINT_H_
# define POINT_H_
class Point
{
public:
Point()
{
x=0.0;
y=0.0;
}
Point(float inx, float iny)
{
x=inx;
y=iny;
}
//析构函数
~Point(){}
float getX() {return x;}
float getY() {return y;}
//重载=操作符,实现两向量变量的赋值
Point operator =(Point& inPoint)
{
Point temp;
temp.x=inPoint.x;
temp.y=inPoint.y;
return temp;
}
//重载+操作符,实现两向量变量的相加
Point operator+(const Point& inPoint)
{
//返回相加的结果
return Point(inPoint.x + x, inPoint.y + y);
}
//重载-操作符,实现两向量变量的相减
Point operator-(const Point& inPoint)
{
//返回相减的结果
return Point(x - inPoint.x, y - inPoint.y);
}
//重载*操作符,实现一个向量变量和一个浮点数的乘法
Point operator*(float num)
{
//返回缩放了的向量
return Point(x * num, y * num);
}
//重载/操作符,实现一个向量变量和一个浮点数的除法
Point operator/(float num)
{
//返回缩放了的向量
return Point(x / num, y / num);
}
//得到一个向量的绝对长度,即距原点的距离
float Length();
private:
float x;
float y;
};
# endif
2、定义相应的cpp文件,并进行算法实验。
# include "point.h"
# include
# include
# include
using namespace std;
const float Pi=3.14159265;
//返回点到原点的距离
float Point::Length()
{
return sqrt(x*x + y*y);
}
//得到两点的距离
float Distance(Point& pPoint1, Point& pPoint2)
{
float subX=pPoint1.getX()-pPoint2.getX();
float subY=pPoint1.getY()-pPoint2.getY();
return sqrt(subX * subX + subY * subY);
}
//得到两向量的点积(即内积)
float DotProduct(Point& pPoint1, Point& pPoint2)
{
return pPoint1.getX() * pPoint2.getX() + pPoint1.getY() * pPoint2.getY();
}
//判断两向量夹角是否大于180°,大于180°返回真,否则返回假
bool AngleLargeThanPi(Point& point1, Point& point2)
{
float temp=point1.getX() * point2.getY() - point2.getX()* point1.getY();
return ( temp
}
//得到两向量的夹角
float AngleBetweenPoints(Point& pPoint1, Point& pPoint2)
{
float cos_theta = DotProduct(pPoint1,pPoint2) / (pPoint1.Length() * pPoint2.Length());
if( AngleLargeThanPi(pPoint1,pPoint2) )
return 360-acos(cos_theta)*180/Pi;
else
return acos(cos_theta)*180/Pi;
}
//测试程序
int main()
{
Point A(5,0); //可以换不同象限的点,测试夹角。
Point B(-1,-1);
bool largeThanPi = AngleLargeThanPi(A,B);
cout
cout
return 0;
}
如果要投入使用,还需要对边界条件进行处理,添加当向量长度为0时的处理。
转载地址:http://dnncl.baihongyu.com/