【问题标题】:Elevation Angle between Positions [closed]位置之间的仰角[关闭]
【发布时间】:2015-07-03 17:02:57
【问题描述】:

我正在使用 Java NASA WorldWind,我有两个具有不同高度和位置的对象。

如何在考虑地球曲率的情况下找到物体之间的仰角?

这张图片说明(显然不是按比例)我正在尝试做的事情:

对象 A 距地面 50 英尺,对象 B 距地面 500 英尺。考虑到地球的曲率,如何找到角度 X?

【问题讨论】:

  • 物体 A 和 B 沿曲线的距离是多少?仰角也取决于它们之间的距离。
  • 我投票结束这个问题,因为它是关于数学,而不是编程。

标签: java math geospatial worldwind


【解决方案1】:

三角函数拯救了一天!当我完成答案时,请参考这个不整洁的图表:

我们想要找到的角度是α。如果我们知道两点之间的距离(沿着地球的曲率),我们可以很容易地找到 θ(或者更准确地说,如果我们延长一条线,我们在地球表面上得到的两点之间的曲线距离)从每个物体到表面)。如果距离是L,那么θ就是L/R(见Arc Length),其中R是地球的半径。

注意值 d1d2d3。如果我们知道 d2d3,我们可以很容易地找到 α,因为 (θ + α) 是d2/d3 的反正切。那么我们如何找到这些呢?

首先我们会找到d1。我们知道 d1d3 的三角形的斜边是 R + ha,就是地球的半径加上物体A的高程。因此我们可以找到d1: p>

同样,对于 d3

现在我们如何找到d2?我们知道整个三角形底边的总长度是R + hb;基本上只是地球的半径加上物体 B 的高度。我们已经知道 d1。所以 d2 是:

现在我们准备好寻找α了:

所以使用这个表达式,它根据两个物体的高度和地球的半径,你应该能够找到 α。可能有一种更简单的方法可以找到 α,但这是我能想到的;我已经有一段时间没有做任何三角函数了!我认为我的数学是正确的,但是如果您发现任何错误,请告诉我。

【讨论】:

  • 非常感谢!这非常有帮助——我的三角显然比你的要生锈很多。
  • 我尝试遵循这个解决方案,但我有点卡住了——我们确定这些是直角三角形吗?我认为您假设 d3 线垂直于 d1-d2 线,但不一定。如果我理解正确,并且 d3 线是从对象 A 到对象 B 下方的地面。
  • @Shitesh 自从我看到这个已经有一段时间了,但我认为我构建它是为了让它垂直。这不是假设。
【解决方案2】:

我采纳了 Vivin 的答案并将其编码到 WorldWind API 中。我认为它的工作方式符合我的预期:

import gov.nasa.worldwind.BasicModel;
import gov.nasa.worldwind.WorldWindow;
import gov.nasa.worldwind.awt.WorldWindowGLCanvas;
import gov.nasa.worldwind.geom.Angle;
import gov.nasa.worldwind.geom.Position;

public class ElevationAngle {

    static WorldWindow ww = new WorldWindowGLCanvas();

    static {
        ww.setModel(new BasicModel());
    }

    public static void main(String[] args) {

        Position pos1 = new Position(Angle.fromDegrees(34.22389),
                Angle.fromDegrees(117.2458), 50 * 0.3048); //elevation in meters

        Position pos2 = new Position(Angle.fromDegrees(34.22389),
                Angle.fromDegrees(117.2440), 500 * 0.3048); //elevation in meters

        System.out.println(getElevationAngleDegrees(pos1, pos2));
    }

    public static double getElevationAngleDegrees(Position pos1, Position pos2) {

        double R = ww.getModel().getGlobe().getRadiusAt(pos1);

        double L = Position.greatCircleDistance(pos1, pos2).getRadians() * R;

        double theta = L / R;

        double ha = pos1.getElevation();

        double hb = pos2.getAltitude();

        double d1 = (R + ha) * Math.cos(theta);

        double d3 = (R + ha) * Math.sin(theta);

        double d2 = R + hb - d1;

        double alpha = Math.atan(d2 / d3) - theta;

        return Math.toDegrees(alpha);

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多