使用仿射变换放大

时间:2012-10-23 04:29:07

标签: java swing zoom scale affinetransform

我正在使用JAVA swing开展个人项目。

该项目是关于在窗口上绘制地图。

enter image description here

地图可以使用仿射变换进行缩放。 我在这里遇到的问题是每当我放大或缩小地图时,也会移动而不是放大/缩小位于屏幕中心的地图上的点

private void updateAT()
{
    Dimension d = panel.getSize();
    int panelW = d.width;
    int panelH = d.height;

    Rectangle2D r = regionList[0].get("Victoria").getShape().getBounds2D();

    scaleX = (panelW/r.getWidth()) * zoom;
    scaleY = (panelH/r.getHeight()) * zoom;

    AffineTransform goToOrigin = AffineTransform.getTranslateInstance(-r.getMinX(), -r.getMinY());

    AffineTransform pan = AffineTransform.getTranslateInstance(panX, panY);

    AffineTransform scaleAndFlip = AffineTransform.getScaleInstance(scaleX, -scaleY);

    //AffineTransform mirror_y = new AffineTransform(1, 0, 0, -1, 0, panelH);

    AffineTransform centre = AffineTransform.getTranslateInstance(panelW/2, panelH/2);
    centre.translate(-((r.getWidth()*scaleX)/2), ((r.getHeight()*scaleY)/2));

    world2pixel.setToIdentity();
    //world2pixel.concatenate(mirror_y);
    world2pixel.concatenate(pan);
    world2pixel.concatenate(centre);
    world2pixel.concatenate(scaleAndFlip);
    world2pixel.concatenate(goToOrigin);
}

1 个答案:

答案 0 :(得分:4)

example个中心位于Shapep3的中心位置,

  • 将对称点转换为原点,

  • 缩放Polygon然后

  • 转换回小组的中心。

请注意,连接操作是在声明顺序的(明显)反向执行的,如here所述。

at.setToIdentity();
at.translate(w / 2, h / 2);
at.scale(scale, scale);
at.translate(-p3x[5] + 10, -p3y[5]);