以球坐标

时间:2018-03-07 04:35:41

标签: algorithm geometry

假设我在球坐标中有一个刻度(比如1度分辨率)。

Spherical graticule

现在,假设某个球形物体处于已知方向(已知philambda)并且从坐标系的原点看具有已知的角直径,我该怎样才能有效计算在对象上“结束”的经纬网点列表?

天真算法当然是计算每个网格方向与对象的已知(phi / lambda)方向之间的角度,如果小于角度半径则包括该点。如果刻度很好,这非常慢。

我可以使用哪些算法来加速计算?

2 个答案:

答案 0 :(得分:2)

让你有基础坐标(lat0, lon0),网格步长da和最大圆弧角AA(你的#34;已知角直径的一半" )。

您可以在笛卡尔平面上使用类似于光栅化的算法:在圆内的每条扫描线(此处为平行线)上枚举整数点。

从中心(lat0, lon0)点开始。沿着子午线向上和向下走,并在给定角度半径的平行内得到点

修改:大圆弧计算已被重写

对于子午线(lat[i], lon0)的每个点,使用here(距离部分)的BigArc计算得到具有相同纬度的点列表。

 var a = Math.sin(diflat/2) * Math.sin(diflat/2) +
         Math.cos(lat0) * Math.cos(alat) *
         Math.sin(diflon/2) * Math.sin(diflon/2);
 var BigArc = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

(当极点位于半径内时,此方法可能会失败)

meridiansteps = Floor(AA / da)
for i = - meridiansteps to meridiansteps: 
    diflat = da * i
    alat = lat0 + diflat
    addpoint(alat, lon0)  
    diflon = da
    while BigArc <= AA:
        addpoint(alat, lon0  + diflon)  
        addpoint(alat, lon0  - diflon)  //symmetric
        diflon = diflon + da

答案 1 :(得分:0)

如果您可以在对象的经纬网上找到最近的点,例如通过将对象的方向投影到经纬网的方向,那么您有一个点或者是否在经纬网上,如果是不是在格子上,没有意义。

因为物体是凸的,所以它在格子上的投影应该是凸的,因此格子上最终在物体上的点应该是连续的。在对象上有一个点,你可以使用二进制印章找到它两边的两个点,它们只是在对象上。

物体上的一组刻度点就是这两个最远点之间的所有刻度点。