2012-10-23 49 views
2

我正在使用JAVA swing进行我的个人项目。放大affinetransform swing

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

enter image description here

该地图是可缩放的使用的AffineTransform。 我在这里的问题是,每当我或缩小地图也转移,而不是输入/输出缩放在地图上的点是在屏幕的中央

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

我不确定这是否可以解决问题,但我会使用单个转换并对其应用每个操作,而不是在最后将它连接起来,我也会玩弄顺序。看一下'AffineTransform#translate'和'AffineTransform#scale' ...这么多翻译可能不是一个好主意:P – MadProgrammer

+0

为了实现这个,有必要连接几个变换。 1)将“中心”移动到原点。 2)缩放大小。 3)将其移回原始中心点。或者与@MadProgrammer相似:) –

+0

@AndrewThompson我对'AffineTransform'的经验相当有限(对'getScaledInstance'或'getRotateInstance'),所以请随意阐述;) – MadProgrammer

回答

4

example中心和放大鳞一个Shapep3,通过

  • 平移对称于原点,

  • 缩放Polygon然后

  • 翻译回面板的中心。

注意,级联操作在声明顺序的(表观)反向进行,如所讨论here

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

这实际上工作。感谢垃圾!我发布了两个问题,并且针对这两个问题都得到了答案!谢谢堆:D –

+0

好问题;乐意效劳。 – trashgod