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,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);
}
}