今天做图像旋转练习的时候,要根据鼠标的移动轨迹来确定转过的角度,于是就很自然的想到通过三个点来确定这个转过的角度:图像的中心,鼠标按下的点,鼠标拖到的点。想到使用斜率来计算角度,于是联想到数学公式中的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.atan,C语言math.h库函数中atan与atan2的区别相关推荐

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

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

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

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

  3. C语言全局变量(c文件和h文件中的全局变量、静态全局变量)使用注意事项

    C语言在头文件中包含全局变量有三种形式: 1 在头文件中声明一个全局变量,在一个C文件中定义全局变量,然后在所有的引用了这个头文件的C文件里都可以使用该全局变量值. 如在main.c定义 int a ...

  4. c语言atan的作用,C语言中的atan和atan2

    在C语言的math.h或C++中的cmath中有两个求反正切的函数atan(double x)与atan2(double y,double x)  他们返回的值是弧度 要转化为角度再自己处理下. 前者 ...

  5. C语言数学函数库<math.h>及常用函数

    C语言数学函数库<math.h>及常用函数 一.<math.h> C语言中常用的一个数学函数库,里面涵盖了常用的数学运算,如求对数.指数.绝对值.三角函数.两数中最大数等.使用 ...

  6. 已知弧度求斜率 C语言,斜率计算:反正切函数 Math.atan() 与 Math.atan2() 的区别

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 我们可以使用正切Math.tan()操作将角度转变为斜率,那么怎样利用斜率来转换为角度呢?可以利用斜率的反正切函数将它转 ...

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

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

  8. C语言试题四十九之只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。 n 给出了字符串的长度,h字符串中前导*号的个数,e给出了字符串中最后的*个数

    1. 题目 假定输入的字符串中只包含字母和*号.请编写函数function,它的功能是:只删除字符串前导和尾部的*号,串中字母之间的*号都不删除.形参n 给出了字符串的长度,形参h给出了字符串中前导* ...

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

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

最新文章

  1. python使用matplotlib可视化堆积的折线图、使用stackplot函数可视化堆积的折线图、不同数据在垂直方向堆叠
  2. java ee核心框架实战 pdf_Java EE核心框架实战 高洪岩 中文PDF
  3. 用tar备份linux
  4. 直播 | COLING 2020 论文解读:基于话题引导的对话推荐系统
  5. IDEA连接Mysql报错: 未找到驱动程序类 ‘com.mysql.cj.jdbc.Driver‘.  Change driver class
  6. 红帽子linux改ip命令,RedHat 7 修改IP地址
  7. 使用Identity Server 4建立Authorization Server (5)
  8. 道指mt4代码_剑指offer算法题052:正则表达式匹配
  9. php MySQL定义,PHP + MySQL用户定义函数
  10. 享元模式C++实现(flyweight)
  11. python tts库_python 使用百度tts 库合成语音
  12. python中模块下载方法(conda+pip)
  13. itextpdf 合并单元格 横向纵向
  14. 中兴B860 AV2.1 S905L刷入armbian并启用docker且使用Portainer汉化版控制面板
  15. BZOJ4565: [Haoi2016]字符合并
  16. QT下以ADO连接ORACLE数据库
  17. [1025]python地理处理包shapely
  18. JSP基础:(7)jsp分页与文件上传下载
  19. 从库延迟增大,MySQL日志出现InnoDB: page_cleaner: 1000ms intended loop took 17915ms.
  20. C专家编程 第10章 再论指针 10.7 使用指针创建和使用动态数组

热门文章

  1. i.MX6ULL终结者虚拟机安装Ubuntu系统
  2. 构建 Ant-Design-Pro 框架出现Error: Cannot find module 'eslint-config-prettier/@typescrip
  3. AsyncHttpClient关于失败响应和网络超时的响应的处理
  4. 好嗨游戏:夏季赛常规赛结束,一文看懂S赛名额形势||附赛程
  5. 查伪输入imel1还是imel2_重新开一贴,科普下电脑知识,电脑小白们,可以来这里学习~~...
  6. 哪里有鸿蒙系统,终于有手机厂商接入鸿蒙系统了
  7. 财神:为何你怎么辛苦赚钱,却赚不到多少?
  8. 国内当前游戏公司一览
  9. 关于object[ 变量],arry[变量]
  10. 反爬虫与反反爬虫技术