我已经被困在这一段时间了......
我想要做的是在穿过w180时包裹一个latLng以存储坐标,所以我这样做:
latLng = latLng.wrap()
这很好用。但后来我想显示原始值。
它基本上归结为逆向工程这些操作:
var max = 180;
var min = -180;
var d = max - min;
var lng = latLng.lng === max ? latLng.lng : ((latLng.lng - min) % d + d) % d + min;
var lat = latLng.lat === max ? latLng.lat : ((latLng.lat - min) % d + d) % d + min;
return new L.latLng(lat, lng);
由于这个等式中的模运算,我真的很挣扎。
非常感谢任何帮助!
答案 0 :(得分:3)
操作a
计算a
的正余数。
如果a%d
为正,则重复操作是多余的,因此结果将保持a
。
如果a%d
为否定,则通常约定-d+1
将是0
和d
之间的值。添加1,..,d
会将此结果更改为0,..,d-1
,并再次计算余数将减少到目标范围r = a%d;
if( r<0 ) {r=r+d;}
。
可以实现同样的目标
-180,..,179.999999
但这不再是单行公式。
在代码中使用该操作的方式确保结果在180..540
范围内。
关于第一个问题,那是不可能的。余数操作将许多参数映射到一个值,而没有进一步的信息,无法从值计算出来的无限多个参数中得出结论。您必须存储其他信息,例如在剩余操作的整体中使用的有效除数。
您可以通过先将一个周期移至范围... = (a + 360) % 360
然后缩小到最小的非负余数来将范围从0移至360,
... = (a<0)?a+360:a
也可以通过
来实现{{1}}
答案 1 :(得分:1)
不幸的是,您无法检索一个值,因为每个输入都有多个解决方案。换行结果始终在180和-180之间,但输入可以是任何自然数。例如,纬度和经度为60度的结果可以输入420或780或-300 ......