//static int drawArrowBetweenRects_headSize = 5; static int drawArrowBetweenRects_width = 4; static double drawArrowBetweenRects_headScale = 2; static void drawArrowBetweenRects(Graphics2D g, Rect r1, Rect r2, Color color) { // TODO: more cases Pt p1, p2; if (r2.x > r1.x2()) { p1 = pt(r1.x2(), middleOfY(r1)); p2 = pt(r2.x-1, middleOfY(r2)); } else { p1 = pt(middleOfX(r1), r1.y-1); p2 = pt(middleOfX(r2), r2.y+r2.h); } int x1 = p1.x, y1 = p1.y, x2 = p2.x, y2 = p2.y; double dist = pointDistance(x1, y1, x2, y2); double headSize = drawArrowBetweenRects_width*drawArrowBetweenRects_headScale*drawArrowHead_length-1; DoublePt v = blendDoublePts(new DoublePt(x2, y2), new DoublePt(x1, y1), headSize/dist); DoublePt p = blendDoublePts(new DoublePt(x2, y2), new DoublePt(x1, y1), 0); g.setColor(color); g.setStroke(new BasicStroke(drawArrowBetweenRects_width)); g.draw(new Line2D.Double(x1, y1, v.x, v.y)); drawArrowHead(g, x1, y1, p.x, p.y, drawArrowBetweenRects_width*drawArrowBetweenRects_headScale); }