【问题标题】:How to rotate a polygon about a point如何围绕一个点旋转多边形
【发布时间】:2013-10-10 18:41:02
【问题描述】:

我正在使用 Java 的 Graphics2D 库来绘制各种形状,并用线条将它们连接在一起。其中一些行的末尾需要一个箭头。形状可以在任何位置,因此箭头的角度会发生变化。

到目前为止,我的代码绘制了箭头并旋转了它,但它从来没有处于正确的角度或正确的位置。当我在屏幕上移动我的形状时,箭头似乎围绕它要指向的形状运行。 (坐标 x2, y2)

private static void drawArrow(Graphics2D g, int size, int x1, int y1, int x2, int y2) {
    double dx = x2 - x1, dy = y2 - y1;
    double theta = Math.atan2(dy, dx);
    AffineTransform at = AffineTransform.getTranslateInstance(x2, y2);
    Polygon p = new Polygon();
    p.addPoint(0, 0);
    p.addPoint(size, 0 - size);
    p.addPoint(0 - size, 0 - size);
    at.rotate(theta, x2, y2);
    java.awt.Shape shape = at.createTransformedShape(p);
    g.fill(shape);
}

int size - 箭头除以 2 的大小。

int x1, y1 - 首先是 x 和 y 坐标的形状。 (形状中心)

int y2, x2 - 第二个形状 x 和 y 坐标。 (形状中心)

您可以在这些图片中看到我的意思:

我感觉我快要得到这个了,因为它似乎完美地围绕形状运行,这表明它只是没有以正确的角度或点旋转。

【问题讨论】:

  • 您可以在翻译之前尝试旋转它...
  • double theta = Math.atan2(dy, dx);你试过打印这个值吗?

标签: java graphics rotation polygon


【解决方案1】:

首先,您需要获取直线的角度,因此首先将直线的起点(与顶框接触的那一条)作为原点。 可以使用以下公式找到角度:tan(theta) = (y/x) y 是你往下走的距离,x 是你往左走的距离(从原点开始,左/下是你的轴方向,通常在 java 中默认为输出)

theta = Math.atan(x/y);

然后您将旋转角度应用到带有偏移的三角形上,以使其朝着正确的方向:

at.rotate(theta + offset);

您可以通过反复试验获得偏移量。 请记住 cos/sin/tan 使用弧度

Math.toRadians(double angleInDegrees)
Math.toDegrees(double angleInRadians)

您还应该阅读 Java 文档中如何使用 AffineTransform @ docs 的方法

.rotate(double angle, double x, double y) 用于围绕 (x,y) 处的点旋转
使用 .rotate(double angle) 代替。 然后将三角形转换回新点

【讨论】:

    【解决方案2】:

    使用原点 (0,0) 进行旋转

    你有两种方法:

    1.- 计算形状原点的旋转。

    2.- 将形状移动到 (0,0) 旋转然后返回当前位置。

    我现在没有代码,但很容易 :) 我已经做到了。

    【讨论】:

      猜你喜欢
      • 2014-02-08
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      相关资源
      最近更新 更多