如何从距离、方位角和仰角获取 3D 坐标
Posted
技术标签:
【中文标题】如何从距离、方位角和仰角获取 3D 坐标【英文标题】:How to get 3D coordinates from distance, azimuth and elevation 【发布时间】:2020-01-17 04:24:51 【问题描述】:我在 3D 环境(一个 100x100x100 的虚拟立方体)中工作,其中每个点都由其 x、y 和 z 位置定义。我们有两个点:A 位置为 x:20 y:35 z:40 和 B x:50 y:40 z:85。使用这个算法 (https://gis.stackexchange.com/questions/108547/how-to-calculate-distance-azimuth-and-dip-from-two-xyz-coordinates) 我可以找到从 A 看到的 B 的距离、方位角和仰角。
let ax = 20;
let ay = 35;
let az = 40;
let bx = 50;
let by = 40;
let bz = 85;
let dx = bx-ax;
let dy = by-ay;
let dz = bz-az;
let dist = Math.sqrt( Math.pow(dx,2) + Math.pow(dy,2) + Math.pow(dz,2) ); // SQRT((x2–x1)2+(y2–y1)2+(z2–z1)2)
let azim = toDeg( Math.atan( dx / dy ) ); // arctan((x2–x1)/(y2–y1))
let elev = toDeg( Math.asin( dz / dist ) ); // arcsin ((z2–z1) / distance)
方位角+仰角用toDeg()函数转换成度数进行验证
function toDeg (angle)
let a = angle * (180 / Math.PI);
return a
结果:
dist = 54.31390245600108
azim = 80.53767779197439
elev = 55.94671404468539
现在的问题是:如何取回 B 的初始值?知道B的A pos(20,35,40)和dist+azim+elev,是否可以得到它的位置50,40,85?
假设数学函数不返回确切的结果(截断小数),绝对精度并不重要,因为找到 49.9999 而不是 50 会给出正确的值 Math.round() -> 点 x:49.9999 y:40.0002 z:84,9999 在多维数据集中不存在。
提前谢谢帮助
【问题讨论】:
我找到了这个页面,但我不明白如何使用它...抱歉我的 trigo 水平很差 :-) gis.stackexchange.com/questions/76077/… 还有这个:softwareengineering.stackexchange.com/questions/179389/…(见最后一个答案) 【参考方案1】:关闭以获得解决方案:
let azim = Math.atan( dx / dy ); // keep result in radians
let elev = Math.asin( dz / dist );
X = Math.round( dist * ( Math.cos( elev ) * Math.sin( azim ) ) );
Y = Math.round( dist * ( Math.cos( elev ) * Math.cos( azim ) ) );
Z = Math.round( dist * Math.sin( elev ) );
最后一个要解决的问题:在某些情况下(即 X 为负且 ax 低于 Math.abs(X) )X 和 Y 是错误的。我现在正在寻找一种直接获得正确结果的方法,而不是编码条件(if/else...)。
【讨论】:
以上是关于如何从距离、方位角和仰角获取 3D 坐标的主要内容,如果未能解决你的问题,请参考以下文章