繁体   English   中英

Java2D API中的转换

[英]Transformations in Java2D API

我正在尝试测试与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的正确组合有关,但是我无法围绕正确的组合进行操作。

当对交互式图形使用级联转换时,这是一个标准问题。

假设T是定位对象X的仿射变换矩阵。 同样,让U为相对于X定位某些子对象Y的矩阵。 然后用矩阵表达式p Y每个点p进行变换

p' = T U p

其中p'是变换点。 p'所在的坐标空间与鼠标坐标相同。 当您在点c'处单击鼠标时(我在同一坐标中使用质数'这里匹配p' ),您可以选择。 您可以使用(TU)^(-1)变换c' “向后”以在子对象的坐标空间中获得c 或者,您可以手动计算所有点p p' ,以便将其与c'进行比较。

通常,您会希望选择后者。 Java将类似于:

AffineTransform TU = new AffineTransform(T);
TU.concatenate(U);
Point2D pPrime = new Point2D();
TU.transform(p, pPrime);

现在您将很快注意到,由于您是手动计算这些点,因此您可能会保留转换后的点的数据结构,以便始终可以与鼠标坐标进行比较。 可以使用相同的数据结构绘制屏幕,​​而无需进行任何转换:它们已经被应用。 这是用于交互式图形的相当标准的技术。 当整个图形快速更新时,它会失去吸引力。 但是,当工程图很大且一次最多只能更新小图时,这可能是性能上的一大胜利。 您给一些内存并恢复一些速度。

如本示例所示,以下几点可能会有所帮助:

  • 在转换图形上下文和转换Shape之间进行区分。

  • 转换不是可交换的。 它们是串联在一起的 ,就像以明显的后指定先应用的顺序应用一样

  • AffineTransform包含允许锚点的静态工厂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM