显示,缩放和缩放巨大的自定义绘画

时间:2012-06-04 07:09:11

标签: java swing zoom jscrollpane affinetransform

我必须绘制一些点和一个多边形来将它们链接在一起。 自定义绘画将在具有JScrollPane的JPanel上完成,并通过AffineTransformation支持一些缩放/缩放。将JPanels首选大小设置为由点坐标定义的所需尺寸并执行重新验证后,图形将正确显示并可以滚动。 只要点坐标不超过数据类型整数,缩放和Dimension类限制设置的某些限制,一切都很好。

实施例: 想象一下坐标

处有四个点
(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时,一个像素恰好等于一个坐标值。

由于它们的构造函数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(放大镜)?

0 个答案:

没有答案