private void moveIfOverlaps(Map<V, Point2D> vertexLocations,
			VisualGraphVertexShapeTransformer<V> xform, V vertex, V otherVertex,
			boolean moveRight) {

		if (vertex == null || otherVertex == null) {
			// no way to overlap
			return;
		}

		Shape vertexShape = xform.apply(vertex);
		Point2D vertexPoint = vertexLocations.get(vertex);
		Rectangle vertexBounds = vertexShape.getBounds();

		Shape otherVertexShape = xform.apply(otherVertex);
		Point2D otherVertexPoint = vertexLocations.get(otherVertex);
		Rectangle otherVertexBounds = otherVertexShape.getBounds();

		//
		// Visual points (after the centering has taken place).  Update the location to account
		// for this centering before checking for clipping.
		//
		int myWidth = vertexBounds.width >> 1; // half width
		int myHeight = vertexBounds.height >> 1; // half height
		double x = vertexPoint.getX();
		double y = vertexPoint.getY();

		int otherWidth = otherVertexBounds.width >> 1;
		int otherHeight = otherVertexBounds.height >> 1;
		double otherX = otherVertexPoint.getX();
		double otherY = otherVertexPoint.getY();

		Point myNewPoint = new Point((int) x - myWidth, (int) y - myHeight);
		vertexBounds.setLocation(myNewPoint);

		Point otherNewPoint = new Point((int) otherX - otherWidth, (int) otherY - otherHeight);
		otherVertexBounds.setLocation(otherNewPoint);

		boolean hasCrossed = hasCrossed(moveRight, myNewPoint, otherNewPoint);
		Rectangle intersection = vertexBounds.intersection(otherVertexBounds);
		if (!hasCrossed && intersection.isEmpty()) {
			return;
		}

		int spacer = 10;
		int width = myWidth + otherWidth; // the total width is half of the width from each vertex
		double offset = width + spacer;
		if (!moveRight) {
			offset = -offset;
		}

		double oldY = vertexPoint.getY();
		double newX = otherX + offset;
		vertexPoint.setLocation(newX, oldY); // editing this point changes the map's value

// DEBUG this can be deleted in the future, future, future
//		//@formatter:off
//		Msg.debug(this,
//			vertex +
//			"\n\tat " + vertexPoint.getX() +
//			"\n\tvisual x: " + myNewPoint +
//			"\n\tw: " + vertexBounds.width +
//				"\n\t\t" + otherVertex +
//				"\n\t\tat: " + otherVertexPoint +
//				"\n\t\tvisual x: " + otherNewPoint.getX() +
//			"\n\t\tw: " + otherVertexBounds.width +
//			"\n\tclip: " + intersection.width +
//			"\n\toffset: " + offset +
//			"\n\tnew pt: " + newX);
//		//@formatter:on

	}
The amount (from 0 to 1.0) by which to condense the vertices of the graph when that
feature is enabled.  The default is .5 (50%).  A value of 1.0 would be fully-condensed
such that all vertices are aligned on the x-axis on the center of the graph.
@return the condense factor
Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/layout/AbstractVisualGraphLayout.java