0

我正在尝试测试与 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,

我相信这与调用 AffineTransform.transform 和 AffineTransform.inverseTransform 的正确组合有关,但我无法将我的大脑包裹在正确的组合上。

4

2 回答 2

2

这是对交互式图形使用级联转换时出现的标准问题。

假设T是定位对象的仿射变换矩阵X。也让U矩阵Y相对于定位一些子对象X。然后每个点pY用矩阵表达式进行转换

p' = T U p

p'变换点在哪里。居住的坐标空间p'与鼠标坐标相同。当您在某个点收到鼠标点击时c'(我在'这里使用素数来匹配p'相同的坐标),您有一个选择。您可以使用c'“向后”变换(T U)^(-1)来进入c子对象的坐标空间。或者您可以手动计算p'所有点p,以便将其与c'.

一般来说,你会想要做后者。Java 将类似于:

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

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

于 2012-07-26T01:49:10.327 回答
1

如本所示,有几件事可能会有所帮助:

  • 区分转换图形上下文和转换Shape.

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

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

于 2012-07-26T01:28:14.007 回答