【发布时间】:2020-01-25 01:09:05
【问题描述】:
Polygon arrow = new Polygon();
arrow.addPoint(0, 5);
arrow.addPoint(-5, -5);
arrow.addPoint(5, -5);
AffineTransform tx = new AffineTransform();
double angle = Math.atan2(y2 - y1, x2 - x1);
tx.translate(x2 + Config.VERTEX_RADIUS / 2, y2 + Config.VERTEX_RADIUS / 2);
tx.rotate((angle - Math.PI / 2));
graphics.setColor(Color.BLACK);
graphics.draw(new Line2D.Double(x1, y1, x2, y2));
graphics.setTransform(tx);
graphics.fill(arrow);
屏幕:http://imglink.ru/show-image.php?id=254ac13712ad825a1a1b99181170f747
编辑 所以,我在 MadProgrammer 的建议下更改了代码,但是箭头出现了如此令人不快的变化。屏幕 -> http://www.imglink.ru/show-image.php?id=f1d6d3dfdb52972d731690e031af7d71
private void drawEdgeLine(Graphics2D graphics, double x1, double y1, double x2, double y2) {
graphics.setColor(Color.BLACK);
graphics.draw(new Line2D.Double(x1, y1, x2, y2));
ArrowHead arrowHead = new ArrowHead();
double length = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
double t1 = Config.VERTEX_RADIUS / length;
double t2 = (length - Config.VERTEX_RADIUS) / length;
double arrowX, arrowY;
if (t1 > t2) {
arrowX = x1 + t1 * (x2 - x1);
arrowY = y1 + t1 * (y2 - y1);
} else {
arrowX = x1 + t2 * (x2 - x1);
arrowY = y1 + t2 * (y2 - y1);
}
double angle = Math.atan2(y2 - y1, x2 - x1);
/*double angleDegrees = Math.toDegrees(angle + Math.PI);
System.out.println(angleDegrees);
if (angleDegrees > 90 && angleDegrees < 270) {
arrowY += Config.ARROW_HEAD_SIZE / 2;
} else {
arrowX -= Config.ARROW_HEAD_SIZE / 2;
}*/
AffineTransform transform = AffineTransform.getTranslateInstance(arrowX, arrowY);
transform.rotate(angle + Math.PI / 2);
arrowHead.transform(transform);
graphics.draw(arrowHead);
}
}
类 ArrowHead 扩展 Path2D.Double {
public ArrowHead() {
double size = Config.ARROW_HEAD_SIZE;
moveTo(0, size);
lineTo(size / 2, 0);
lineTo(size, size);
}
}
【问题讨论】:
-
因此,旋转将发生在锚点的左上角(
0x0)。我倾向于做的是将区域转换到我想要放置对象的位置,因此锚点变为0x0围绕对象中心旋转,完成后记得撤消混乱
标签: java swing graph graphics graphics2d