python 计算方位角实例(根据两点的坐标计算)
作者:JohnieLi 发布时间:2023-08-01 09:30:54
知道两点坐标,怎么计算两点方向的方位角?
答:首先计算坐标增量dx,dy(两个对应坐标分量相减,终点的减始点的)。
若dx,dy中有一个为零时,根据另一个的正负决定方位角(0,90,180,270这四个中的一个,可画坐标轴图分析,但不要画为数学坐标哦)。
基本思路:
若dx,dy都不为零;则
计算a=arcatn(|dy/dx|)(这好像叫象限角)
当dx>0dy>0时方位角=a;
当dx<0dy>0时方位角=180-a;
当dx<0dy<0时方位角=180+a; 负范围为a-pi
当dx>0dy<0时方位角=360-a; 负范围为-a
还有一种方法,使用 atan2来计算方位角,范围为-pi,pi
atan2(y,x)所表达的意思是坐标原点为起点,指向(x,y)的射线在坐标平面上与x轴正方向之间的角的角度。
结果为正表示从 X 轴逆时针旋转的角度,结果为负表示从 X 轴顺时针旋转的角度。
atan 和 atan2 都是求反正切函数,如:有两个点 point(x1,y1), 和 point(x2,y2);
那么这两个点形成的斜率的角度计算方法分别是:
float angle = atan( (y2-y1)/(x2-x1) );
float angle = atan2( y2-y1, x2-x1 );
atan 和 atan2 区别:
1:参数的填写方式不同;
2:atan2 的优点在于 如果 x2-x1等于0 依然可以计算,但是atan函数就会导致程序出错;
3:atan2(a,b)的取值范围介于 -pi 到 pi 之间(不包括 -pi),而atan(a/b)的取值范围介于-pi/2到pi/2之间(不包括±pi/2)。
另外要注意的是,函数atan2(y,x)中参数的顺序是倒置的,atan2(y,x)计算的值相当于点(x,y)的角度值。
atan2(y, x)是4象限反正切,它的取值不仅取决于正切值y/x,还取决于点 (x, y) 落入哪个象限:
当点(x, y) 落入第一象限时,atan2(y, x)的范围是 0 ~ pi/2;
当点(x, y) 落入第二象限时,atan2(y, x)的范围是 pi/2 ~ pi;
当点(x, y) 落入第三象限时,atan2(y, x)的范围是 -pi~-pi/2;
当点(x, y) 落入第四象限时,atan2(y, x)的范围是 -pi/2~0.
而 atan(y/x) 仅仅根据正切值为y/x求出对应的角度 (可以看作仅仅是2象限反正切):
当 y/x > 0 时,atan(y/x)取值范围是 0 ~ pi/2;
当 y/x < 0 时,atan(y/x)取值范围是 -pi/2~0.
如果要实现方位角的计算,代码如下:
# 计算方位角函数
def azimuthAngle( x1, y1, x2, y2):
angle = 0.0;
dx = x2 - x1
dy = y2 - y1
if x2 == x1:
angle = math.pi / 2.0
if y2 == y1 :
angle = 0.0
elif y2 < y1 :
angle = 3.0 * math.pi / 2.0
elif x2 > x1 and y2 > y1:
angle = math.atan(dx / dy)
elif x2 > x1 and y2 < y1 :
angle = math.pi / 2 + math.atan(-dy / dx)
elif x2 < x1 and y2 < y1 :
angle = math.pi + math.atan(dx / dy)
elif x2 < x1 and y2 > y1 :
angle = 3.0 * math.pi / 2.0 + math.atan(dy / -dx)
return (angle * 180 / math.pi)
math中关于三角函数常用的操作:
import math
math.acos(x) # 返回 x 的反余弦 弧度值。
math.asin(x) # 返回 x 的反正弦 弧度值。
math.degrees(x) # 将 弧度 转换为 角度, 如 degrees(math.pi/2) , 返回90.0
math.radians(x) # 将 角度 转换为 弧度
注意负数角度的转换。
来源:https://blog.csdn.net/JohinieLi/article/details/81041550


猜你喜欢
- 字典什么是字典说到字典,第一时间想到的应该就是新华字典,实际上,这跟编程中的字典类似,两者都有一个特点,就是一一对应(yi yi dui y
- pytest-playwright 是一个 Python 包,它允许您使用 Microsoft 的 Playwright 库在 Python
- 项目中需要从Windows系统传输ISO文件到Linux测试系统,然后再Linux测试系统里安装这个ISO文件。所以就需要实现如何把文件从W
- 忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串。相信不少同学会有同感。几乎任何一种编程语言,都把字符串列为最
- 一、问题描述SQL Server 的master数据库不能像其他用户或 系统数据库一样恢复, 因为没有活动的master数据库 SQL Se
- Python语言中import的使用很简单,直接使用 import module_name 语句导入即可。这里我主要写一下"imp
- 简介主要是尝试简单的使用pyhton的爬虫功能,于是使用有道进行尝试,并没有进行深入的诸如相关api的调用。以下是需要的POST数据代码以下
- 从PHP生成HTML静态页面并存储到以年份和月份为名称创建的目录。读取全部数据批量生成,全部生成后弹出提示。可指定批次生成数量,建议不超过8
- 关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码。这样并不利于初学者的学习,希望这篇文章可以更通
- 当后端并未编写后台json数据,但是前端又要使用数据进行页面的编写,这是便可用mockjs编写一个假的数据源,发送ajax请求并获取数据1.
- 今天,在项目中遇到一个问题,两个js页面要共享一个就js对象。js全局变量和静态变量都不行,其他苦逼的小农们就不要去强求了。而LZ又不想用c
- 以下虚线框内为mk.asp文件的具体代码:<%filename="test.htm"if request
- Step 1:Creating a Linked Server. EXEC sp_addlinkedserver 'ADSI'
- 前言在实际业务场景我们可能需要开放单独用户给第三方使用,并且不想让第三方看到与业务不相关的表或视图,我们需要在数据库中设置一切权限来实现此功
- 问题介绍棋盘覆盖问题,是一种编程问题。如何应用分治法求解棋盘覆盖问题呢?分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋
- 官方文档:需求:当1个job启动构建后,获取它的构建状态.(成功,失败,驳回,构建中,正在排队)关键函数:获取job是否在排队的结果获取正在
- 以如下代码为例,我们在局部作用域内使用全局变量a,需要使用global关键字进行声明。否则代码会不可用。a = 100def fun():&
- SQL Server UPDATE语句用于更新数据,下面就为您详细介绍SQL Server UPDATE语句语法方面的知识,希望可以让您对S
- 问题:我想每日从数据库里导出一些数据,内容基本上都是一样的,只是时间不同,比如导出一张表wjzcreate table wjz(id int
- 最近在学习python爬虫,使用requests的时候遇到了不少的问题,比如说在requests中如何使用cookies进行登录验证,这可以