我想弄清楚如何放大地图,这意味着我缩放到鼠标的位置然后再回来。 为此,我必须为每个缩放迭代重新计算地图的中心。
我使用这些公式进行放大并且工作正常
// amount is 1.0 when zooming in and -1.0 when zooming out
newCenterX = (eventPoint.getX() - (mapWidth / 2)) * resolution + center.getX();
newCenterY = ((eventPoint.getY() - (mapHeight / 2)) * resolution / (-amount)) + center.getY();
但不幸的是我无法弄清楚如何缩小,我只是有点无法理解它,所以一些数学爱好者的一些帮助将非常感激。感谢。
答案 0 :(得分:1)
你的问题不太清楚。我假设您的问题是:如果我在地图上更改缩放,我必须在哪里移动地球上图像中心的位置,以便鼠标仍然指向地球上的相同位置。
我不知道任何合理接近实际情况的封闭公式(即考虑到地球的曲率)。对于一个近距离变焦的简单情况,当您可以通过局部平面矩形逼近地球表面时,问题或多或少会成为放大图像的问题。
我们来介绍一些符号。 Xr
- 原始图像(地球)上的实际X位置(以像素为单位)。 Xi
- 缩放图像上的位置(以像素为单位)。 W
- 缩放视图的宽度(以像素为单位)。 Z
- 缩放级别。任何这些符号可能会被索引和/或后缀c
另外修改,意思是“中心”。示例:Xrc1
- 原始图像(地球)上缩放级别#1处图像中心的X位置。
如果我们想从Xi
计算Xr
,则公式为:
(Xi - Xic)*Z = (Xr - Xrc)
显然Xic
总是W/2
。
现在考虑我们有一个缩放级别Z1
,鼠标指向Xi
,用户可以缩放到其他缩放级别Z2
。我们希望找到移动Xrc1
的位置,以便我们在真实图像(地球)上的点Xr
其投影相同或Xi1
= Xi2
= {{1 }}。所以
Xi
要为(Xi - W/2)*Z1 = (Xr - Xrc1)
(Xi - W/2)*Z2 = (Xr - Xrc2)
解决此问题,我们先将Xrc2
乘以Z2
,将第二个乘以Z1
(Xr - Xrc1)*Z2 = (Xi - W/2)*Z1*Z2 = (Xr - Xrc2)*Z1
所以
Xrc2 = (Xrc1*Z2 + Xr*(Z1-Z2)) / Z1
或者,如果我们使用K
作为缩放比例Z2/Z1
Xrc2 = Xrc1*K + Xr*(1-K)
完整性检查:
Xr
= Xrc1
,即鼠标指向中心,Xrc2
= Xrc1
K
为0.5
(缩放两次近),则中心应该移近Xr
两次。答案 1 :(得分:0)
问题是我使用了"新决议"由于缩放事件,在它已经改变之后进行计算。相反,我需要"旧决议"这是新决议的一半。
另外,我不得不考虑中心的x偏移,当缩小时,它会被反转。
所以修改后的缩放公式是
Double resolutionFactor = zoomLevels > 0 ? resolution : (resolution / 2);
newCenterX = ((eventX - (mapWidth / 2)) * zoomLevels) * resolutionFactor + oldCenterX;
newCenterY = ((eventY - (mapHeigth / 2)) * resolutionFactor / (-zoomLevels)) + oldCenterY;