0

我正在使用 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 坐标。(形状中心)

你可以在这些图片中看到我的意思: 示例 1

示例 2

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

4

2 回答 2

1

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

theta = Math.atan(x/y);

然后你将旋转角度应用到你的三角形上,当然要让它朝着正确的方向:

at.rotate(theta + offset);

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

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

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

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

于 2013-10-10T19:18:37.447 回答
-1

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

你有两种方法:

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

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

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

于 2013-10-10T18:58:21.127 回答