我正在使用Java的Graphics2D库来绘制各种形状,并将线条连接在一起。其中一些线路在线路末端需要一个箭头。形状可以处于任何位置,因此箭头的角度会发生变化。
到目前为止,我的代码绘制箭头并旋转它,除非它不是直角或正确的位置。当我在屏幕上移动我的形状时,箭头会出现在它想要指向的形状的轨道上。 (coord 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 coords。 (形状中心)
你可以在这些图片中看到我的意思:
我有一种感觉我接近这个,因为它似乎完美地围绕着形状,这表明它不是以正确的角度或点旋转。
答案 0 :(得分:1)
首先你需要获得该线的角度,所以首先注意线的起点(接触顶盒的那个)作为原点。 可以使用以下公式找到角度:tan(theta)=(y / x) 你是多少下来,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文档上使用方法 <。> .rotate(双角,双x,双y)用于绕(x,y)点旋转答案 1 :(得分:-1)
使用原点(0,0)进行旋转
您有两种方式:
1.-计算形状原点的旋转。
2.-将形状移动到(0,0)旋转,然后返回当前位置。
我现在没有代码,但很容易:)我已经做到了。