我在VisualizationView内的屏幕上绘制了一张地图。我可以在此地图上放大和缩小,具体取决于我使用触摸功能在此视图中聚焦的位置。
我还在放大和绘制此地图之间切换。当我在地图上绘制箭头并切换回放大时。我希望我在地图上绘制的箭头保持在相对于我放大和缩小的地图的相同位置。这意味着必须调整此箭头的x和y pos。
我有所需的所有变量我不知道如何解决这个因为它的数学相关。
有人可以向我解释我如何才能明智地解决这个问题。我试过在网上看,但我找不到一个好的解释。此外,平板电脑上的地图分辨率始终为576 x 576。
public void onZoom(final double focusX, final double focusY,
final double factor) {
//pseudocode
Triangle.x = ..
Triangle.y = ..
Triangle.repaint();
//peusocode
}
缩放的代码如下所示。
public void zoom(double focusX, double focusY, double factor) {
synchronized (mutex) {
Transform focus = Transform.translation(toMetricCoordinates((int) focusX, (int) focusY));
double zoom = RosMath.clamp(getZoom() * factor, MINIMUM_ZOOM, MAXIMUM_ZOOM) / getZoom();
transform = transform.multiply(focus).scale(zoom).multiply(focus.invert());
}
}
我希望有人可以解释解决这个问题背后的数学。
答案 0 :(得分:0)
我并不直接熟悉您正在使用的库,但是要将箭头(三角形)的位置移动到新位置,您应该像对地图一样对其应用相同的变换。
这样想:在缩放之前,箭头的位置(箭头的中心或头部,但是你定义“位置”)和它指向的地图上的点具有相同的坐标。缩放后,地图上的点将移动到新位置,您希望箭头移动到同一个新位置,因此您需要使用相同的变换。就像我说的那样,我对你正在使用的库不熟悉,所以我不能确切地告诉你如何做到这一点,但那就是你想成为的地方。
但是,请注意,您只想转换箭头/三角形的一个点并绘制相对于它的其他点。如果你变换所有3,你最终会在放大和缩小时变大和变小(我假设你不想要)。