0

VisualizationView 内の画面に描画されているマップがあります。タッチ機能を使用して、このビュー内の焦点を合わせた場所に応じて、このマップをズームインおよびズームアウトできます。

また、この地図の拡大と描画を切り替えます。地図上に矢印を描いてズームインに戻ると、地図上に描いた矢印が、ズームインおよびズームアウトしている地図に対して同じ場所にとどまるようにします。つまり、この矢印の x 位置と y 位置を調整する必要があります。

必要なすべての変数がありますが、数学に関連しているため、これを解決する方法がわかりません。

誰かがこの数学の賢明な解決方法を説明してくれませんか? インターネットで調べてみましたが、良い説明が見つかりませんでした。また、タブレットのマップ解像度は常に 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());
}

}

誰かがこれを解く背後にある数学を説明できることを願っています。

4

1 に答える 1

0

私はあなたが使用しているライブラリに直接精通していませんが、矢印(三角形)の位置を新しい位置に移動するには、マップに適用するのと同じ変換を適用する必要があります。

このように考えてください。ズームする前に、矢印の位置(矢印の中心または頭。ただし、「位置」を定義します)とそれが指しているマップ上の点は同じ座標を持ちます。ズーム後、マップ上のポイントは新しい場所に移動し、矢印を同じ新しい場所に移動する必要があるため、同じ変換を使用する必要があります。私が言ったように、私はあなたが使用しているライブラリに精通していないので、それを行う方法を正確に教えることはできませんが、それはあなたがなりたい場所です。

ただし、矢印/三角形の1つのポイントのみを変換し、それを基準にして他のポイントを描画する必要があることに注意してください。3つすべてを変換すると、ズームインおよびズームアウトするにつれて矢印がどんどん大きくなっていきます(これは望ましくないと思います)。

于 2012-11-14T20:27:22.230 に答える