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 相关文章推荐
强制设为首页代码
Jun 19 Javascript
javascript document.execCommand() 常用解析
Dec 14 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
Jan 23 Javascript
jquery 定位input元素的几种方法小结
Jul 28 Javascript
JS.getTextContent(element,preformatted)使用介绍
Sep 21 Javascript
SeaJS 与 RequireJS 的差异对比
Dec 08 Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 Javascript
很棒的Bootstrap选项卡切换效果
Jul 01 Javascript
angularJS Provider、factory、service详解及实例代码
Sep 21 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 Javascript
深入理解Vue 组件之间传值
Aug 16 Javascript
JavaScript图像放大镜效果实现方法详解
Jun 28 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
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
2016/02/19 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
判断一个变量是数组Array类型的方法
2013/09/16 Javascript
判断访客终端类型集锦
2015/06/05 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
python里dict变成list实例方法
2019/06/26 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
Python使用Matlab命令过程解析
2020/06/04 Python
python3将变量输入的简单实例
2020/08/19 Python
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
外贸专业求职信
2014/03/09 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书
道歉的话怎么说
2015/05/12 职场文书
初中班主任心得体会
2016/01/07 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js