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);
screen: http://imglink.ru/show-image.php?id=254ac13712ad825a1a1b99181170f747
EDIT So, I changed the code on the advice of MadProgrammer, but there is such an unpleasant shift of the arrow. screen -> 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);
}
}
class ArrowHead extends Path2D.Double {
public ArrowHead() {
double size = Config.ARROW_HEAD_SIZE;
moveTo(0, size);
lineTo(size / 2, 0);
lineTo(size, size);
}
}