@Override
		protected Map<FGEdge, List<Point2D>> positionEdgeArticulationsInLayoutSpace(
				VisualGraphVertexShapeTransformer<FGVertex> transformer,
				Map<FGVertex, Point2D> vertexLayoutLocations, Collection<FGEdge> edges,
				LayoutLocationMap<FGVertex, FGEdge> layoutLocations) throws CancelledException {

			Map<FGEdge, List<Point2D>> newEdgeArticulations = new HashMap<>();

			// 
			// Route our edges!
			//
			for (FGEdge e : edges) {
				monitor.checkCancelled();

				FGVertex startVertex = e.getStart();
				FGVertex endVertex = e.getEnd();

				// 
				// TODO For now I will use the layout positions to determine edge type (nested v.
				// fallthrough). It would be nicer if I had this information defined somewhere
				// -->Maybe positioning is simple enough?
				//

				Column<FGVertex> startCol = layoutLocations.col(startVertex);
				Column<FGVertex> endCol = layoutLocations.col(endVertex);
				Point2D start = vertexLayoutLocations.get(startVertex);
				Point2D end = vertexLayoutLocations.get(endVertex);
				List<Point2D> articulations = new ArrayList<>();

				int direction = 20;
				if (startCol.index < endCol.index) { // going forward on the x-axis
					//  TODO make constant					
//						direction = 10;
				}
				else if (startCol.index > endCol.index) { // going backwards on the x-axis
					direction = -direction;
				}

				int offsetFromVertex = isCondensedLayout()
						? (int) (VERTEX_TO_EDGE_ARTICULATION_OFFSET * (1 - getCondenseFactor()))
						: VERTEX_TO_EDGE_ARTICULATION_OFFSET;

				if (startCol.index < endCol.index) { // going left or right
					//
					// Basic routing: 
					// -leave the bottom of the start vertex
					// -first bend at some constant offset
					// -move to right or left, to above the end vertex
					// -second bend above the end vertex at previous constant offset
					//
					// Advanced considerations:
					// -Remove angles from vertex points:
					// -->Edges start/end on the vertex center.  If we offset them to avoid 
					//    overlapping, then they produce angles when only using two articulations.
					//    Thus, we will create articulations that are behind the vertices to remove
					//    the angles.  This points will not be seen.
					//
					Shape shape = transformer.apply(startVertex);
					Rectangle bounds = shape.getBounds();
					double vertexBottom = start.getY() + (bounds.height >> 1); // location is centered

					double x1 = start.getX() + direction;
					double y1 = start.getY(); // hidden
					articulations.add(new Point2D.Double(x1, y1));

					double x2 = x1;
					double y2 = vertexBottom + offsetFromVertex;
					y2 = end.getY();
					articulations.add(new Point2D.Double(x2, y2));

					double x3 = end.getX() + (-direction);
					double y3 = y2;
					articulations.add(new Point2D.Double(x3, y3));

//						double x4 = x3;
//						double y4 = end.getY(); // hidden
//						articulations.add(new Point2D.Double(x4, y4));
				}

				else if (startCol.index > endCol.index) { // flow return
					e.setDefaultAlpha(.25);

					Shape shape = transformer.apply(startVertex);
					Rectangle bounds = shape.getBounds();
					double vertexBottom = start.getY() + (bounds.height >> 1); // location is centered

					double x1 = start.getX() + (direction);
					double y1 = start.getY(); // hidden
					articulations.add(new Point2D.Double(x1, y1));

					double x2 = x1;
					double y2 = vertexBottom + offsetFromVertex;
					articulations.add(new Point2D.Double(x2, y2));

					double x3 = end.getX() + (-direction);
					double y3 = y2;
					articulations.add(new Point2D.Double(x3, y3));

					double x4 = x3;
					double y4 = end.getY(); // hidden
					articulations.add(new Point2D.Double(x4, y4));
				}

				else {  // same column--nothing to route
					// straight line, which is the default
					e.setDefaultAlpha(.25);
				}
				newEdgeArticulations.put(e, articulations);
			}
			return newEdgeArticulations;
		}
A simple layout that is used during testing
Ghidra/Features/FunctionGraph/src/test.slow/java/ghidra/app/plugin/core/functiongraph/graph/layout/TestFGLayoutProvider.java