首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java2D应用编程接口中的转换

Java2D应用编程接口中的转换
EN

Stack Overflow用户
提问于 2012-07-26 09:20:21
回答 2查看 174关注 0票数 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,200)。

我相信这与调用AffineTransform.transform和AffineTransform.inverseTransform的正确组合有关,但我无法理解正确的组合。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-26 09:49:10

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

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

代码语言:javascript
运行
复制
p' = T U p

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

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

代码语言:javascript
运行
复制
AffineTransform TU = new AffineTransform(T);
TU.concatenate(U);
Point2D pPrime = new Point2D();
TU.transform(p, pPrime);

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

票数 2
EN

Stack Overflow用户

发布于 2012-07-26 09:28:14

如此example所示,以下几点可能会有所帮助:

转换图形上下文和转换Shape.

  • Transformations之间的区别不是可交换的;它们是串联的,就好像应用于明显的最后指定先应用的order.

  • AffineTransform包括允许锚点的静态工厂一样。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11661035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档