java – Graphics2D转换结果与手动转换不匹配

我使用 Java的Graphics2D在一个组件上使用AffineTransform来操作我的绘图.
Graphics2D为此提供了一个方法转换,它采用了AffineTransform.

有时我需要手动操作一个点而不使用内置转换.
但是当我尝试使用相同的变换转换一个点时,我给了Graphics2D.transform有时结果点不一样.

下面的代码重现了这个问题(它是Scala代码,但我认为你可以想象Java代码.):

var transformationMatrix = new AffineTransform()
   /*
    * transformationMatrix is modified throughout the program
    * ...
    */
   override def paintComponent(g: Graphics2D) = {
      super.paintComponent(g)
      /* 1. transform using graphics transform */
      g.transform(transformationMatrix)
      g.setColor(Color.RED)
      g.fill(new Rectangle(0,1,1))
      /* 2. transform point manually */
      g.setTransform(new AffineTransform) // reset transformation to standard
      val p0 = new Point(0,0)
      val pDest = new Point()
      transformationMatrix.transform(p0,pDest)
      g.setColor(Color.BLUE)
      g.fill(new Rectangle(pDest.x,pDest.y,1)
   }

预期的行为

蓝色矩形(手动计算)透过红色矩形(通过变换计算).

经验丰富的行为

我承认我的transformationMatrix并不是真正的整数,但那应该不是问题,不是吗?

affineTransform = 1.1,0.0,520.55
                     0.0,1.1,182.54999999999995
                     0.0,1.0

这是一个错误还是我错过了一些深刻的见解?

编辑:如果将transformationMatrix设置为,则可以重现该错误

transformationMatrix = new AffineTransform(1.1,521.55,183.54999999999995)

在paintComponent的开头.请注意,g是Graphics2D类型.

解决方法

好吧,你做了两件不同的事情.

在(1)中,您要对产生小数坐标的变换进行形状(与Rectangle而不是Rectangle2D.Double无关).它只是涂有别名,因为您没有设置特定的渲染提示(RenderingHints.KEY_ANTIALIASING – > RenderingHints.VALUE_ANTIALIAS_ON和RenderingHints.KEY_stroke_CONTROL – > RenderingHints.VALUE_stroke_PURE).

在(2)中,您将一个点置于变换中,并将其强制转换为别名坐标(Point而不是Point2D.Double).然后从那一点开始连续构造一个矩形.

很明显,幕后可能会发生非常不同的事情,我根本不会期望转换为整数点,而在混叠图形上下文中绘制浮点形状会产生相同的结果.

(没有测试)我猜想(1)的有效等价陈述是

g.fill(transformationMatrix.createTransformedShape(new Rectangle(0,1)))

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...