JavaScript使用atan2来绘制箭头和曲线的实例
发布时间 - 2026-01-11 03:14:48 点击率:次最近搞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。
我们将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),从坐标系来看,这个角度的范围只能是在第1、4象限,并不能表示出第2、3象限的角。
为了弥补atan的不足,在计算机编程领域,引入了atan2函数,它的计算结果是在(-π,π]。它正好可以覆盖整个坐标系,包括90°的情形。
它的计算过程是怎样的呢?
关于这个,我从wikipedia上摘取了它的计算过程:
atan2的应用
在第一小节中的那张图中的坐标系,是我们熟知的。在HTML、Canvas中,坐标系并不像我们熟知的坐标系那样。它是这样的:
从x轴正向沿顺时针方向,所经过的角度分别是0,π/2, π,3π/2,2π。
从x轴正向沿逆时针方向,所经过的角度分别是0,-π/2, -π,-3π/2,-2π。
atan2的结果在(-π,π]之间,恰好一周,四个象限全覆盖。从坐标系来看,顺时针方向的值是正值,逆时针方向的值是负的。
从坐标系上来看,atan2结果是(0,-π)时就表示,从x轴正向逆时针方向转最大 π弧度(180角度)。同理,(0,π)表示从x轴正向顺时针转最大π弧度(180角度)。
在第1)小节中说了atan可以用来计算平面坐标系内任意两点的连线与x轴正向之间的夹角。而atan2是atan的补充,那么使用atan2自然就可以来计算平面坐标系内任意两点的连线与x轴正向之间的夹角了。
如果两个点在第一象限内:
如果两个点在第四象限内:
如果两个点在不同的象限内,我们也可以平移来看。
何时需要使用atan2 ?
目前我遇到了两种情况,是通过atan2来解决的:
1) 在平面坐标系内任意两个点间画一条带有箭头的直线(可以是单向箭头,可以是双向箭头)。在这个需求中,另外也知道了箭头的一条边与直线的夹角和箭头的长度。
这个需求的难点就是要计算出箭头的另外两个点坐标。
2) 在平面坐标系内任意两个点之间画一条指定曲率的曲线(arc)。在这个需求中,要计算arc,自然要知道radius, startAngle, endAngle,圆心坐标。可以根据曲率来计算出半径等,但是难点在计算圆心坐标。
这两个需求的共同特点是:
1)两个已知的点
2)根据这两个点和其他的条件去计算一些必须的(画line,arc等必须的)点坐标。
目前我遇到了这两种需求,都通过atan2来解决的。其他的情况,目前尚且未知,待后续发现时,补充上。
以上这篇JavaScript使用atan2来绘制箭头和曲线的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# 曲线箭头
# JavaScript中的Math.atan2()方法使用详解
# 相对于
# 是在
# 在这个
# 其他的
# 这两个
# 给大家
# 要知道
# 计算出
# 画一
# 两点
# 知道了
# 顺时针方向
# 又是
# 说了
# 两种
# 将其
# 它是
# 希望能
# 不像
# 是怎样
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
详解jQuery停止动画——stop()方法的使用
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
Laravel中的Facade(门面)到底是什么原理
如何在Tomcat中配置并部署网站项目?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
如何在腾讯云免费申请建站?
在线制作视频网站免费,都有哪些好的动漫网站?
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
三星、SK海力士获美批准:可向中国出口芯片制造设备
如何快速生成ASP一键建站模板并优化安全性?
深圳网站制作培训,深圳哪些招聘网站比较好?
如何用PHP快速搭建高效网站?分步指南
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
英语简历制作免费网站推荐,如何将简历翻译成英文?
黑客入侵网站服务器的常见手法有哪些?
如何快速搭建高效香港服务器网站?
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
微信小程序 闭包写法详细介绍
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
如何在阿里云高效完成企业建站全流程?
js实现获取鼠标当前的位置
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
Bootstrap CSS布局之列表
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
深入理解Android中的xmlns:tools属性
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
Laravel怎么清理缓存_Laravel optimize clear命令详解
如何在建站主机中优化服务器配置?
php json中文编码为null的解决办法
Laravel如何升级到最新版本?(升级指南和步骤)
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
如何为不同团队 ID 动态生成多个“认领值班”按钮
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
如何在腾讯云服务器上快速搭建个人网站?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
Laravel如何使用Vite进行前端资源打包?(配置示例)
简单实现jsp分页
如何快速查询网站的真实建站时间?
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
米侠浏览器网页背景异常怎么办 米侠显示修复
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
Python文本处理实践_日志清洗解析【指导】
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】

