我正在尝试测试与Rectangle2D.Float和Point2D.Float的冲突。我有一个包含相机的2D世界(它基于相机的AffineTransform转换graphics2D画布)。然后我有了一个包含子对象Y的对象X的列表。画布在相机转换为X的AffineTransformation的顶部进行变换,因此对象被渲染到正确的位置。我可以成功地用鼠标在对象X内部测试碰撞,但我在测试子对象Y时遇到了问题,因为Y对象“认为”它们位于位置(0,0),即使它们位于其他位置,因为其父对象X被重新定位为(200,200)。换句话说,对象X和Y出现在(200,200)位置,但碰撞发生在(0,0),而不是(200,200)。
我相信这与调用AffineTransform.transform和AffineTransform.inverseTransform的正确组合有关,但我无法理解正确的组合。
发布于 2012-07-26 09:49:10
这是在对交互式图形使用串联变换时出现的标准问题。
假设T是定位对象X的仿射变换矩阵。另外,假设U是相对于X定位一些子对象Y的矩阵。然后用矩阵表达式对Y中的每个点p进行变换
p' = T U p其中p'是变换点。p'所在的坐标空间与鼠标坐标相同。当您在点c'处收到鼠标单击时(我在这里使用质数'来在相同坐标下匹配p' ),您有一个选择。您可以使用(T U)^(-1)向后变换c',以便在子对象的坐标空间中获得c。或者,您可以手动计算所有点p的p',以便与c'进行比较。
一般来说,你会想要做后一件事。Java将类似于:
AffineTransform TU = new AffineTransform(T);
TU.concatenate(U);
Point2D pPrime = new Point2D();
TU.transform(p, pPrime);现在,您很快就会注意到,因为您是手动计算这些点,所以您可能会保留变换点的数据结构,以便始终可以与鼠标坐标进行比较。同样的数据结构也可以用于绘制屏幕,根本不需要转换:它们已经被应用了。对于交互式图形,这是一种非常标准的技术。当整个图形被快速更新时,它就失去了吸引力。但是,当绘图很大,并且一次最多只能更新较小的部分时,这可能是性能的一大胜利。你给了一些内存,然后又恢复了一些速度。
发布于 2012-07-26 09:28:14
如此example所示,以下几点可能会有所帮助:
转换图形上下文和转换Shape.
AffineTransform包括允许锚点的静态工厂一样。https://stackoverflow.com/questions/11661035
复制相似问题