JavaScript使用atan2来绘制箭头和曲线的实例


Posted in Javascript onSeptember 14, 2017

最近搞Canvas绘图,知道了JavaScript中提供了atan2(y,x)这样一个三角函数。乍眼一看,不认识,毕竟在高中时,学过的三角函数有:sin,cos,arcsin,arccos,tan,arctan等,并没有这个。而工作中又需要用到它,所以这里就做了个简单的了解。

在坐标系中理解tan atan

回顾一下三角函数tan

tanθ,用三角函数来表示时,它的值等于sinθ/cosθ,如果将其放到坐标系中,它的的值等价于:dy/dx。在坐标系中,任意两个点所组成的直线,相对于x轴的斜率就是tanθ = dy /dx,相对于y轴的斜率就是dx/dy ,此时我们用cot来表示;其中,dy 是两个点的y坐标的差值,dx是两个点的x坐标的差值。

那么坐标系内除了y轴,任何一个点(x,y),相对于x轴的斜率就是y-0/x-0,也即是y/x

JavaScript使用atan2来绘制箭头和曲线的实例

我们将tanθ称为一条直线相对于x轴的斜率,那么θ就是相对于x轴的夹角(旋转角度)了。

tan,是根据角度计算斜率的。那么反过来 arctan(反正切)自然就认为是根据斜率来计算角度的。

为何存在atan2 ?

JavaScript中,提供了两个arctan函数,一个是atan, 一个是atan2 atan就是我们所熟知arctan。其实在很多编程语言中都提供了atan2

那么atan2又是怎么回事呢?

要知道这个,需要知道arctan的不足之处:

arctan的返回值范围是(-π/2, π/2) 不包括, ±π/2,也就是(两个点组成的直线与x轴夹角是90°)90°是计算不出来的。为啥呢?在计算arctan ( dy/dx)时,如果两个点(x1,y1),(x2,y2)组成的直线与x轴的夹角呈90°时,dx= x2-x1 = 0 0 是不能作为除数的,所以就无法计算这种情形。

值的范围也就是计算的角度的范围在(-π/2, π/2),从坐标系来看,这个角度的范围只能是在第14象限,并不能表示出第23象限的角。

为了弥补atan的不足,在计算机编程领域,引入了atan2函数,它的计算结果是在(-π,π]。它正好可以覆盖整个坐标系,包括90°的情形。

它的计算过程是怎样的呢?

关于这个,我从wikipedia上摘取了它的计算过程:

JavaScript使用atan2来绘制箭头和曲线的实例

atan2的应用

在第一小节中的那张图中的坐标系,是我们熟知的。在HTMLCanvas中,坐标系并不像我们熟知的坐标系那样。它是这样的:

x轴正向沿顺时针方向,所经过的角度分别是0,π/2, π,3π/22π。

x轴正向沿逆时针方向,所经过的角度分别是0-π/2, -π,-3π/2-2π。

JavaScript使用atan2来绘制箭头和曲线的实例

atan2的结果在(-π,π]之间,恰好一周,四个象限全覆盖。从坐标系来看,顺时针方向的值是正值,逆时针方向的值是负的。

从坐标系上来看,atan2结果是(0,-π)时就表示,从x轴正向逆时针方向转最大 π弧度(180角度)。同理,(0,π)表示从x轴正向顺时针转最大π弧度(180角度)。

在第1)小节中说了atan可以用来计算平面坐标系内任意两点的连线与x轴正向之间的夹角。而atan2atan的补充,那么使用atan2自然就可以来计算平面坐标系内任意两点的连线与x轴正向之间的夹角了。

如果两个点在第一象限内:

JavaScript使用atan2来绘制箭头和曲线的实例

如果两个点在第四象限内:

JavaScript使用atan2来绘制箭头和曲线的实例

如果两个点在不同的象限内,我们也可以平移来看。

何时需要使用atan2 ?

目前我遇到了两种情况,是通过atan2来解决的:

1) 在平面坐标系内任意两个点间画一条带有箭头的直线(可以是单向箭头,可以是双向箭头)。在这个需求中,另外也知道了箭头的一条边与直线的夹角和箭头的长度。

这个需求的难点就是要计算出箭头的另外两个点坐标。

2) 在平面坐标系内任意两个点之间画一条指定曲率的曲线(arc)。在这个需求中,要计算arc,自然要知道radius, startAngle, endAngle,圆心坐标。可以根据曲率来计算出半径等,但是难点在计算圆心坐标。

这两个需求的共同特点是:

1)两个已知的点

2)根据这两个点和其他的条件去计算一些必须的(画line,arc等必须的)点坐标。

目前我遇到了这两种需求,都通过atan2来解决的。其他的情况,目前尚且未知,待后续发现时,补充上。

以上这篇JavaScript使用atan2来绘制箭头和曲线的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery CSS样式控制 学习笔记
Jul 23 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
Nov 04 Javascript
jquery 得到当前页面高度和宽度的两个函数
Feb 21 Javascript
jquery中EasyUI实现同步树
Mar 01 Javascript
Javascript非构造函数的继承
Apr 27 Javascript
Javascript HTML5 Canvas实现的一个画板
Apr 12 Javascript
轮播图组件js代码
Aug 08 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
Mar 01 Javascript
Vue keep-alive实践总结(推荐)
Aug 31 Javascript
javaScript实现滚动条事件详解
Mar 24 Javascript
为vue项目自动设置请求状态的配置方法
Jun 09 Javascript
vue data引入本地图片的两种方式小结
Nov 13 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
Sep 14 #Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
Sep 14 #Javascript
对于js垃圾回收机制的理解
Sep 14 #Javascript
使用SVG基本操作API的实例讲解
Sep 14 #Javascript
JSON 数据格式详解
Sep 13 #Javascript
JS库 Highlightjs 添加代码行号的实现代码
Sep 13 #Javascript
详解动画插件wow.js的使用方法
Sep 13 #Javascript
You might like
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
中国第一家无线电行
2021/03/01 无线电
PHP+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
PHP socket 模拟POST 请求实例代码
2016/07/18 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
详解HTML5 使用video标签实现选择摄像头功能
2017/10/25 Javascript
angularjs 页面自适应高度的方法
2018/01/17 Javascript
vue移动端使用appClound拉起支付宝支付的实现方法
2019/11/21 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
Python中每次处理一个字符的5种方法
2015/05/21 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
django连接mysql配置方法总结(推荐)
2018/08/18 Python
python实现QQ邮箱/163邮箱的邮件发送
2019/01/22 Python
python求最大值,不使用内置函数的实现方法
2019/07/09 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
乡村文明行动实施方案
2014/03/29 职场文书
中药学自荐信
2014/06/15 职场文书
广告学专业求职信
2014/06/19 职场文书
学生偷窃检讨书
2014/09/25 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
小学运动会加油稿
2015/07/22 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫