2010-04-01 95 views
0

我想通过覆盖paintComponent在JPanel上绘制一些形状。我希望能够平移和缩放。在Graphics2D对象上使用AffineTransformsetTransform方法轻松进行平移和缩放。做完这些之后,我可以用easyli绘制形状g2.draw(myShape)这些形状是用“世界坐标”定义的,所以在平移时它可以很好地工作,我必须在绘制之前将它们转换为画布/ JPanel坐标。如何使用另一个象限在坐标上绘制JPanel?

现在我想更改坐标的quadrant。从JPanel和计算机常用的第四象限到用户最熟悉的第一象限。 X是相同的,但Y轴应该向上而不是向下增加。很容易通过new Point(origo.x, -origo.y);

重新定义这个象限中的形状?我想保留形状的坐标(在世界坐标中定义),而不是将它们放在画布坐标中。所以我需要以某种方式转换它们,或者转换Graphics2D对象,并且我希望有效地使用。我可以用AffineTransform来做到吗?

我的绘图代码:

 public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D)g; 
      g2.setColor(Color.blue); 

      AffineTransform at = g2.getTransform(); 
      at.translate(-origo.x, -origo.y); 
      at.translate(0, getHeight()); 
      at.scale(1, -1); 
      g2.setTransform(at); 
      g2.drawLine(30, 30, 140, 20); 
      g2.draw(new CubicCurve2D.Double(30, 65, 23, 45, 23, 34, 67, 58)); 
     } 

回答

1

这是一个即兴的回答,所以这是未经测试,但我认为它会工作。

由(0,高度)翻译。这应该将原点重新定位到左下角。

按(1,-1)进行缩放。这应该绕X轴翻转。

我不认为在这种情况下操作的顺序很重要。