0

それらをリンクするために、いくつかのポイントとポリゴンを描画する必要があります。カスタム ペインティングは、JScrollPane を使用して JPanel で実行され、AffineTransformation によるスケーリング/ズームをサポートします。JPanels の推奨サイズをポイント座標で定義された必要な寸法に設定し、再検証を行った後、図面が適切に表示され、スクロールできるようになりました。ポイント座標が、データ型整数、ズーム、および Dimension クラスの制限によって設定された制限を超えない限り、すべて問題ありません。

例: 座標に 4 つの点があるとします。

(10000,10000), (10000,-10000), (-10000,10000), (-10000,-10000).

それらは、中心に原点を持つ正方形の角を定義します。私の paintComponent メソッドの短い形式:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;

    // Backup original transform
    AffineTransform originalTransform = g2d.getTransform();

    // Set virtual drawing area to scroll through, scaled by zoomfactor
    double viewZoomFactor = 1.0; // Will be set to other values != 1.0 later
    // Because of the points coordinates a rectangle of size 20000 by 20000 is required
    this.setPreferedSize(new Dimension(20000 * viewZoomFactor,20000 * viewZoomFactor));
    this.revalidate();

    // Move point of origin to the center 
    Point pointOfOrigin = new Point(10000, 10000);
    // Translate all points and revert y-direction
    AffineTransform t = AffineTransform.getTranslateInstance(
                pointOfOrigin.x, this.getHeight() - pointOfOrigin.y)
    t.scale(viewZoomFactor, -viewZoomFactor);
    g2d.transform(t);

    this.drawPointsAndPolygonOnPanel();

    // Restore original transform
    g2d.setTransform(originalTransform);
}

zoomFactor == 1.0 の場合、1 ピクセルは正確に 1 つの座標値に等しくなります。

それらのコンストラクターPoint(int, int)により、ポイントは [Integer.MIN_VALUE, Integer.MAX_VALUE] によって [Integer.MIN_VALUE, Integer.MAX_VALUE] の平面内に配置できます。JPanels の推奨サイズは、タイプDimension(int,int)です。通常、幅と高さの値は負でない整数です。

問題は巨大な座標値で発生します: 次のような点のセットを想像してください:

(Integer.MAX_VALUE,Integer.MAX_VALUE), 
(Integer.MAX_VALUE,Integer.MIN_VALUE), 
(Integer.MIN_VALUE,Integer.MAX_VALUE), 
(Integer.MIN_VALUE,Integer.MIN_VALUE)

私が最初に考えたのは、すべての座標値を縮小する別の倍率を導入することでした。

t.scale(viewZoomFactor * dataZoomFactor, -viewZoomFactor * dataZoomFactor);

これにより、ピクセル対座標値の比率が減少します。viewZoomFactor = 1.0 での 1 ピクセル = 1/dataZoomFactor 座標値。

描画するポイントが上記の極端な位置に配置されている場合、描画全体の 1:1 のスケーリングされたスクロール可能な可視セクションを実現するにはどうすればよいですか? viewZoomFactor > 1.0 (拡大鏡) の場合は?

4

0 に答える 0