private Map<FcgVertex, TransitionPoints> createDestinationLocation() {

		// note: both collections of vertices are sorted
		Map<FcgVertex, Point2D> finalDestinations = arrangeNewVertices();

		Map<FcgVertex, TransitionPoints> transitions = new HashMap<>();
		FcgLevel parentLevel = expandingLevel.parent();
		Iterable<FcgEdge> newEdges = newVertexCollection.getNewEdges();
		Set<FcgVertex> newVertices = newVertexCollection.getNewVertices();
		for (FcgEdge e : newEdges) {

			FcgVertex newVertex = incoming ? e.getStart() : e.getEnd();
			if (!finalDestinations.containsKey(newVertex)) {
				continue; // this implies the edges is between 2 existing vertices
			}

			if (!newVertices.contains(newVertex)) {
				continue; // a new edge to an existing vertex
			}

			FcgVertex existingVertex = incoming ? e.getEnd() : e.getStart();
			FcgLevel existingLevel = existingVertex.getLevel();
			if (!existingLevel.equals(parentLevel)) {
				// Only the parent level can be the source of the transition.  This ensures
				// that the animation starts at the level that was expanded and not at some
				// other level in the graph that happened to have an edge to the new node.
				continue;
			}

			Point2D start = (Point2D) toLocation(existingVertex).clone();
			Point2D end = finalDestinations.get(newVertex);

			TransitionPoints trans = new TransitionPoints(start, end);
			transitions.put(newVertex, trans);
		}

		return transitions;
	}
Constructor

@param viewer the graph viewer
@param newVertexCollection the collection of new vertices and edges being addeds
@param useAnimation true to use animation
Ghidra/Features/GraphFunctionCalls/src/main/java/functioncalls/graph/job/BowTieExpandVerticesJob.java