繁体   English   中英

如何围绕点旋转多边形

[英]How to rotate a polygon about a point

我正在使用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

我有种接近完成的感觉,因为它似乎完美地绕着轨道运动,这对我来说暗示它并不是以正确的角度或点旋转。

首先,您需要获取直线的角度,因此首先请注意直线的起点(接触顶部框的那一点)作为原点。 可以使用以下公式找到角度: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)

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

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

以原点(0,0)进行旋转

您有2种方法:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM