【问题标题】:Graphics2D - Rotating Shapes on a Graphics2D objectGraphics2D - 在 Graphics2D 对象上旋转形状
【发布时间】:2013-10-02 07:50:06
【问题描述】:

我有一个Graphics2D 对象,我用它来在我的Canvas 上绘图。我在Canvas 上绘制了多个形状,并且只想转换其中一个(或部分)。

我会尽量保持简单:

void render(Graphics2D g) {
    ... // Draw shape 1
    ... // Draw shape 2
    ... // Draw shape 3
}

如何在保持形状 1 和 3 不变的情况下旋转形状 2? “旋转”是指围绕其中心点旋转,我们可以将其定义为 xy例如。

我一直在寻找一种方法来执行此操作,但找不到任何可以按我想要的方式工作的方法。

有什么简单的方法吗?

【问题讨论】:

  • “找不到任何符合我要求的方法” 您能否展示一下您的最佳尝试SSCCE?描述转换不符合您的期望的方式。

标签: java swing graphics2d


【解决方案1】:

不是围绕它的中心点旋转形状,而是旋转然后平移画布。要在(x, y) 处围绕形状中心旋转,首先将画布平移(-x, -y),然后将画布旋转-d 度并在(0,0) 处正常绘制形状。

完成后,旋转回来然后平移回来(请注意,对于这些几何变换,顺序很重要,平移然后旋转会给您带来完全不同的结果)。

这意味着您仍然可以以任意旋转方式绘制对象,而无需自己重新计算坐标。

【讨论】:

  • 我确实把它改了一下,看起来像这样:1) g.translate(x, y) 2) g.rotate(d) 3) 以 (0, 0) 为中心绘制形状 4) g.rotate(-d) 5) @ 987654327@。这正是我想要的方式。谢谢。
【解决方案2】:
    AffineTransform afx = new AffineTransform();
    afx.rotate(angleRad, s.getCenter().x, s.getCenter().y);
    //afx.rotate(angleRad);
    java.awt.Shape ss = afx.createTransformedShape(s.getPrimativeShape());
    return ss;   

s 是我的 java.awt.Shape 包装类,并用它做一些事情......但你想要的是在第 2 行。 afx.rotate(Angle,xAnchorPoint,yAnchorPoint); afx.rotate 围绕点 (xAnchorPoint;yAnchorPoint) 旋转对象。

希望这是你想要的

【讨论】:

    【解决方案3】:

    要旋转形状,请使用Graphics2D.rotate 方法之一。

    缓存用于shape 1shape 3 的转换。在绘制shape 3 之前,请确保将变换重置为缓存的变换,因为将rotate 用于shape 2 会改变当前的变换坐标。

    步骤:

    1. 缓存当前变换
    2. 绘制shape 1
    3. 旋转
    4. 绘制shape 2
    5. 将转换设置为缓存的
    6. 绘制shape 3

    【讨论】:

    • 这确实有效,因为它会旋转形状,但不会停留在同一个地方。
    猜你喜欢
    • 2018-07-23
    • 2013-08-18
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2011-01-27
    • 2013-03-06
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多