[英]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坐标。 (形状的中心)
您可以在这些图片中看到我的意思:
我有种接近完成的感觉,因为它似乎完美地绕着轨道运动,这对我来说暗示它并不是以正确的角度或点旋转。
首先,您需要获取直线的角度,因此首先请注意直线的起点(接触顶部框的那一点)作为原点。 可以使用以下公式找到角度: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.