假设我在球坐标中有一个刻度(比如1度分辨率)。
现在,假设某个球形物体处于已知方向(已知phi
和lambda
)并且从坐标系的原点看具有已知的角直径,我该怎样才能有效计算在对象上“结束”的经纬网点列表?
天真算法当然是计算每个网格方向与对象的已知(phi
/ lambda
)方向之间的角度,如果小于角度半径则包括该点。如果刻度很好,这非常慢。
我可以使用哪些算法来加速计算?
答案 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)
如果您可以在对象的经纬网上找到最近的点,例如通过将对象的方向投影到经纬网的方向,那么您有一个点或者是否在经纬网上,如果是不是在格子上,没有意义。
因为物体是凸的,所以它在格子上的投影应该是凸的,因此格子上最终在物体上的点应该是连续的。在对象上有一个点,你可以使用二进制印章找到它两边的两个点,它们只是在对象上。
物体上的一组刻度点就是这两个最远点之间的所有刻度点。