今天做图像旋转练习的时候,要根据鼠标的移动轨迹来确定转过的角度,于是就很自然的想到通过三个点来确定这个转过的角度:图像的中心,鼠标按下的点,鼠标拖到的点。想到使用斜率来计算角度,于是联想到数学公式中的arctan反正切函数,通过搜索得知在math.h函数库中有2个函数:atan与atan2都可以求到角度,我最初使用的是atan函数,可是在使用的过程中,出现了很大的问题。

1.atan()接受一个参数:

angel=atan(slope)
angel为一个角度的弧度值,要换算成角度,必须乘以180/PI,slope为直线的斜率,是一个数字,这个数字可以是负的无穷大到正无穷大之间的任何一个值.
不过,利用他进行计算比较复杂.由于三角函数的周期性,一个数字的反正切值不止一个.例如arctan(1)的值是pi/4 + k * pi.然而通过atan(1)只能得到PI/4,对于正切函数来说,他的周期是180度,所以两个相差180度的角具有相同的正切和斜率:
tanθ=tan(θ+180)
然而,atan()只能返回一个角度值,因此确定他的角度非常的复杂。特别是用在处理图像旋转的问题的时候更是棘手,因为我们要通过这个角度来判断图像是顺时针旋转还是逆时针旋转,从而来确定图像的转动,然而这个函数很难做到。

2.atan2()接受两个参数x和y:

angel=Math.atan2(y,x)
x 指定两个点横坐标的差
y 指定两个点纵坐标的差

计算出来的结果angel是一个弧度值,要换算成角度,也必须乘以180/PI。

double a = atan2(1,1);
  double b = atan2(1,-1);
  double c = atan2(-1,-1);
  double d = atan2(-1,1);
  double e = atan(1);
  double f = atan(-1);
  cout << a * 180/PI << endl;  45    //第一象限
  cout << b * 180/PI << endl;  135   //第二象限
  cout << c * 180/PI << endl;  -135  //第三象限
  cout << d * 180/PI << endl;  -45   //第四象限
  cout << e * 180/PI << endl;  45
  cout << f * 180/PI << endl;  -45

以下是用于图像旋转的代码:与这两个函数的讨论无关......

由于计算机中坐标向右是正X轴方向,向下是正Y轴方向,所以计算机坐标中的4,3,2,1象限就对应数学课本中的1,2,3,4象限。于是得知atan2的取值是-PI到PI。

可以很轻易的通过这个角度来判断我们的鼠标轨迹是顺时针还是逆时针。

处理图像旋转时求夹角部分的代码(图像放整个客户区的中间):

CRect rect;
  GetClientRect(&rect);
  long lWidth =   rect.Width();
  long lHeight =  rect.Height();
  int x1 = m_ptorigin.x;
  int y1 = m_ptorigin.y;
  int x2 = m_ptend.x;
  int y2 = m_ptend.y;
  
  float centerx  = (float)(lWidth / 2);
  float centery =  (float)(lHeight /2) ;
  float a1 = (float)(atan2((y1 - centery) , (x1 - centerx)));    
  float a2 = (float)(atan2((y2 - centery) , (x2 - centerx)));
  TRACE("%f/n",a1 * 180 / PI);
  TRACE("%f",a2 * 180 / PI);
  if(a2 - a1 > 0)  //顺时针转(所得到的角度会越来越小,-X轴是-180,顺时针一圈到-X轴后是180)
  {
   m_iRotateAngle = (float)(a2 * 180 / PI - a1 * 180 /PI) + m_iRotateAngle;
  }
  else        //逆时针转(所得到的角度会越来越大,-X轴是180,顺时针一圈后到-X轴是-180)
  {
   m_iRotateAngle = (float)(a2 * 180 / PI - a1 * 180 /PI + 360) + m_iRotateAngle;
  }

if( m_iRotateAngle > 360)
   m_iRotateAngle -= 360;
  if( m_iRotateAngle < 0)
   m_iRotateAngle += 360;

C语言math.h库函数中atan与atan2的区别相关推荐

  1. c语言math.atan,C语言math.h库函数中atan与atan2的区别

    今天做图像旋转练习的时候,要根据鼠标的移动轨迹来确定转过的角度,于是就很自然的想到通过三个点来确定这个转过的角度:图像的中心,鼠标按下的点,鼠标拖到的点.想到使用斜率来计算角度,于是联想到数学公式中的 ...

  2. c语言中math的库函数,C语言中math.h库中的常用函数

    C语言中math.h库中的常用函数 int abs(int i) 返回整型参数i的绝对值 double cabs(struct complex znum) 返回复数znum的绝对值 double fa ...

  3. python中 math模块下 atan 和 atan2的区别

    atan 和 atan2 都是反正切函数,返回的都是弧度 对于两点形成的直线,两点分别是 point(x1,y1) 和 point(x2,y2),其斜率对应角度的计算方法可以是: angle = at ...

  4. LINUX下c语言调用math.h库函数的注意事项

    2019独角兽企业重金招聘Python工程师标准>>> 在Ubuntu上做C语言程序练习时,用到了sqrt函数,尽管在源文件中已包含了math.h头文件,但在编译的时候总是提示sqr ...

  5. C语言math.h中的常用函数实例详解

    1.绝对值 2.取整和取余 3.三角函数 4.反三角函数 5.双曲三角函数 6.指数和对数 7.标准化浮点数 8.多项式 9.数学错误计算处理 1.绝对值 函数原型: int abs(int x); ...

  6. C语言math.h详解

    math.h常用函数详解 1. 取绝对值 double fabs(double a); 对a取绝对值 2.取整与取余 int ceil (double a); 取上整(里面可以填整数也能填小数,整数返 ...

  7. c语言中引用头使用什么指令,在源文件(.c)和头文件(.h)中声明和定义的区别——C语言...

    最近在看多文件编程的时候遇到的一个问题,本来以为理解了声明和定义的区别(然而并没有····),也算是重新认识了一次声明和定义,下面上代码 声明和定义:有分配空间的叫定义,没分配空间的叫声明 定义:表示 ...

  8. C语言后缀.h文件和.c文件作用和区别

    简述C语言中.h文件和.c文件作用和区别 在c语言学习过程中,对.h文件和.c文件不甚了解,参考其他资料后对它进行简要分析: .h文件和.c文件作用 使用.h文件和.c文件的原因 .h文件和.c文件作 ...

  9. JAVA语言-比较器Comparator(java中Comparable和Comparator的区别)

    文章目录 一.什么是Comparator 二.Java compare方法和compareTo方法 三.java中Comparable和Comparator的区别 Comparator的例子 三.de ...

最新文章

  1. 【Computer Vision】 复现分割网络(1)——SegNet
  2. EF-Net一种适用于双流SOD的有效检测模型(Pattern Recognition)
  3. CodeForces 86 D Powerful array 莫队
  4. [NOIP2017]逛公园 最短路+拓扑排序+dp
  5. oracle 行送,Oracle 行专列
  6. 视觉错觉模型_有才!将立体模型涂改伪装成平面二次元,视觉错觉玩法在日本风靡...
  7. 计算机启动类型bios,UEFI还是Legacy BIOS?如何确定Windows启动类型
  8. 地表上最强编程语言——C语言
  9. Python常用正则表达式语法和写法
  10. python 视频转场_Python 带你高效创作短视频,视频创作秀到飞起!!!
  11. vagrant up 时提示错误 cound not open file
  12. SourceInsight4.0黑色背景主题
  13. WPF定制实现自己的分页控件并配合DataGrid使用
  14. win10, cuda 9.0, python 3.5环境下复现 Flow-Guided Feature Aggregation for Video Object Detection 问题总结
  15. uniapp的语音功能
  16. 小米手环4NFC模拟门禁卡Sak20
  17. 三种男性最需要的营养素
  18. Steam32寄存器实现流水灯
  19. AWS免费套餐服务器部署NET CORE网站
  20. 基金净值预测 建模方案 | 大数据+深度学习应用

热门文章

  1. 项目一 国家电力项目思路总结
  2. ORACLE的HINT详解
  3. C语言中的abort函数
  4. 痞子衡嵌入式:存储器大厂Micron的NOR Flash芯片特殊丝印设计(FBGA代码)
  5. dba怎么报考_深圳dba双证报考时间
  6. 数据库连接池druid 的jar包官网下载-最新版下载
  7. 学点SmallTalk
  8. 量化交易 实战第十三课 打分法选股
  9. 学习计算机网络必看的书
  10. 【Argoverse 1 Motion Forecasting Dataset】轨迹预测数据集简介