打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
求取向量A逆时针到向量B的夹角

算法思路:通过余弦定理求取向量夹角的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 < 0);
}

//得到两向量的夹角
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<<"the angle between vector A and B is: "<<><>
    return 0;
}<>
<>

如果要投入使用,还需要对边界条件进行处理,添加当向量长度为0时的处理。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何简单判断一个点是否在某个区域之中
第二题
空间任意三点的圆心和构成圆的半径算法
Graham's Scan法求解凸包问题
让Android自带的Gallery实现多点缩放,拖动和边界回弹效果,效果流畅 | 夜半难...
android 大图片拖拽并缩放实现原理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服