博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
matlab 计算逆时针夹角,求取向量A逆时针到向量B的夹角
阅读量:6914 次
发布时间:2019-06-27

本文共 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/

你可能感兴趣的文章
Loadrunner监控Centos
查看>>
转:问题解决:The project cannot be built until build path errors are resolved
查看>>
Python--day25--面向对象之多态
查看>>
submit
查看>>
数据结构-----树状数组
查看>>
mac终端下svn常用命令
查看>>
C++的lambda表达式
查看>>
新手学习python(十六)封装redis
查看>>
vue移动端弹框组件
查看>>
vuex
查看>>
vux 全局使用 loading / toast / alert
查看>>
面向对象数组操作
查看>>
Cocos2d-x之内存管理
查看>>
Sharepoint 列表分页开发
查看>>
当页面是本地页面时,通过ajax访问tomcat里的action,传递的参数在action里并不能识别...
查看>>
RocketMQ Java 客户端实现
查看>>
hdu 1133 Buy the Ticket (大数+递推)
查看>>
java:Java里数字转字符串前面自动补0的实现
查看>>
获取图片颜色的rgb,以供css设计背景颜色
查看>>
org.tinygroup.validate-验证框架
查看>>