向量的点乘和叉乘都是很有用的数学工具,不过他们也有局限性。关键是向量点乘可以得到两个向量之间的夹角, 而不是旋转角,这个角度是没有方向的,范围是[0-pi], 而这往往不是我们想要的, 实际问题中我们常常要计算从向量p1沿逆时针方向转到与向量p2方向一致的确切角度,我把这个角度定义为旋转角。 旋转角的计算既需要夹角,还需要两个向量的叉乘, 以确定p1和p2的角度方向关系。

关于叉乘符号与向量的角度方向关系,请参考《算法导论》,我只给出结论:

p1 * p2 = x1y2  - x2 y1 = -p2 * p1

If p1 * p2 is positive, then p1 is clockwise from p2 with respect to the origin (0, 0); if this cross product is negative, then p1 is counterclockwise       from p2.

另外考虑的是共线(collinear )的问题, arcsine很难处理这个问题, 不过arecosine却能够明确的区分0和pi,因此作为特殊情况提前得出结论。

代码如下:文章出处狗刨学习网

#i nclude <stdio.h>
#i nclude <math.h>
double getRotateAngle(double x1, double y1, double x2, double y2);
int main(int argc, char **argv)
{
double x1, x2, y1, y2;
double dist, dot, degree, angle;
freopen("angle.in", "r", stdin);

while(scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2) == 4) {
printf("the rotate angle from p1 to p2 is %.3lf\n", 
getRotateAngle(x1, y1, x2, y2));
}
}
/*
* 两个向量之间的旋转角
* 首先明确几个数学概念:
* 1. 极轴沿逆时针转动的方向是正方向
* 2. 两个向量之间的夹角theta, 是指(A^B)/(|A|*|B|) = cos(theta),0<=theta<=180 度, 而且没有方向之分
* 3. 两个向量的旋转角,是指从向量p1开始,逆时针旋转,转到向量p2时,所转过的角度, 范围是 0 ~ 360度
* 计算向量p1到p2的旋转角,算法如下:
* 首先通过点乘和arccosine的得到两个向量之间的夹角
* 然后判断通过差乘来判断两个向量之间的位置关系
* 如果p2在p1的顺时针方向, 返回arccose的角度值, 范围0 ~ 180.0(根据右手定理,可以构成正的面积)
* 否则返回 360.0 - arecose的值, 返回180到360(根据右手定理,面积为负)
*/ 
double getRotateAngle(double x1, double y1, double x2, double y2)
{
const double epsilon = 1.0e-6;
const double nyPI = acos(-1.0);
double dist, dot, degree, angle;

// normalize
dist = sqrt( x1 * x1 + y1 * y1 );
x1 /= dist;
y1 /= dist;
dist = sqrt( x2 * x2 + y2 * y2 );
x2 /= dist;
y2 /= dist;
// dot product
dot = x1 * x2 + y1 * y2;
if ( fabs(dot-1.0) <= epsilon ) 
angle = 0.0;
else if ( fabs(dot+1.0) <= epsilon ) 
angle = nyPI;
else {
double cross;

angle = acos(dot);
//cross product
cross = x1 * y2 - x2 * y1;
// vector p2 is clockwise from vector p1 
// with respect to the origin (0.0)
if (cross < 0 ) { 
angle = 2 * nyPI - angle;

}
degree = angle * 180.0 / nyPI;
return degree;
}

本文有关于两向量的旋转角的计算就这些,希望对读者起到一定的作用。

unity3d之计算两向量的旋转角相关推荐

  1. matlab计算两向量的乘积,matlab中两个函数相乘

    变量名最多不超过63个字符; ? 变量名区分大小写; ? Matlab提供的标准函数名以及命令名必须用小写字母; ? 变量名中不能包含空格.标点.运算符. 1.变量及其...... 中的元素; (2) ...

  2. c++做一个计算两向量夹角的程序

    请测试,结果正好是90度#include<iostream> #include<cmath> using namespace std; #define PI 3.1415926 ...

  3. R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离、dist函数计算矩阵中两两元素的曼哈顿距离

    R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离.dist函数计算矩阵中两两元素的曼哈顿距离 目录 R语言计算曼哈顿距离(Manhattan Distance ...

  4. R语言union函数计算数据对象(vector、list、dataframe)的并集:union函数计算两个vector向量、dataframe、列表list的并集

    R语言union函数计算数据对象(vector.list.dataframe)的并集:union函数计算两个vector向量.dataframe.列表list的并集 目录

  5. python计算两个向量之间的欧氏距离

    python计算两个向量之间的欧氏距离 代码: import numpy as np # 向量的值 feature_1 = np.array([1,2,3]) feature_2 = np.array ...

  6. sklearn计算两个向量之间的距离

    from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import euc ...

  7. 计算两个向量的逆时针夹角

    大多数的时候,计算两个向量或者直线的夹角就可以,通常在0~180°.然而,有的时候,需要知道向量到另一个向量按某一种旋转的角度,即0-360°,比如polygon的计算. MATLAB Code 计算 ...

  8. 两个向量之间的夹角公式_Python 计算任意两向量之间的夹角方法

    如图所示,我们要计算任意两个向量之间的夹角. (图中的坐标数字是估计值,随手给定) python代码如下 import math AB = [1,-3,5,-1] CD = [4,1,4.5,4.5] ...

  9. Unity中如何判断两个向量的旋转角?

    本文为转载自用 在游戏中经常用到的,已知两向量A, B ,求出A->B的旋转角.但U3D给出的Vector3.Angle()方法只能返回0到180度的向量夹角.如果想得到0到360度的旋转角,需 ...

  10. c++ 用 eigen与opencv计算两个向量的夹角,两个向量之间的夹角,向量的朝向

    计算两个向量的夹角,两个向量之间的夹角 eigen: #include "Eigen/Dense" #include "Eigen/Geometry" usin ...

最新文章

  1. Oracle的括号转义字符,SQL中通配符、转义符与括号的使用
  2. Python--day28--set去重
  3. SVN账号重新指定方法
  4. 第二次爬虫,更加熟练啦
  5. 中国水处理行业十四五趋势规划与布局动态分析报告2022年
  6. htpasswd java_mod_rewrite,reverseProxy和.Htpasswd
  7. java 数组 树_java使用顺序数组实现二叉树
  8. mysql 5.6加用户_Mysql 5.6添加修改用户名和密码的方法
  9. “如何学习”系列文章2007年全部文章索引
  10. cmd使用SBT构建scala项目
  11. CentOS部署×××
  12. 堪称神级的Spring Boot手册,从基础入门到实战进阶
  13. CSS定位设置实例——盒子的定位
  14. 【JVM · 调优】监控及诊断工具
  15. python制作日历_用Python制作一份你专属的爱豆日历
  16. 牛客网小白月赛22计算A+B(题解)
  17. 基于CTP的期货智能程序化交易系统平台
  18. 生物特征识别性能的不同衡量标准以及python源代码
  19. 使用 Hyper-V 安装 Linux
  20. 云服务器部署SpringBoot工程-瑞吉外卖项目

热门文章

  1. trans系列是sci几区_怎么确定SCI是几区的?
  2. iOS 蓝牙扫描枪功能
  3. 聊聊图标和MBE图标
  4. Servlet 身份验证体系结构(源码)
  5. dota2 服务器尚未更新到最新版本,dota2更新不动_steam dota2更新不动
  6. neutron的dvr
  7. 计算机里面的wps如何删除,如何快速删除电脑上的wps的所有换行符
  8. 导航栏的HTML的布局方式
  9. 每日一记:2017.7.20
  10. 《ROS理论与实践》学习笔记(七)机器人语音交互