@Override
	protected void initializeVertexLocations() {

		//
		// This may be the same as the current locations, or they may be updated, depending upon
		// user options
		// 
		LayoutPositions<FGVertex, FGEdge> positions = updateDestinationLocations();
		Map<FGVertex, Point2D> vertexDestinationLocations = positions.getVertexLocations();
		finalEdgeArticulations = positions.getEdgeArticulations();

		//
		// We want the vertices to start at the group vertex's current position and end 
		// up at their new location; to start at/behind the group vertex and then move
		// outward toward their final location.  
		//
		Point2D oldLocation = toLocation(groupVertex);
		Point2D groupVertexPoint = (Point2D) oldLocation.clone();

		//
		// This group of vertices (all those besides the 'verticesToBeRemoved') will be moved
		// to either 1) their new layout positions, or 2) they will stay just where they are.  The
		// 'verticesToBeRemoved' will always be moved somewhere, depending upon the 'relayout' 
		// variable.
		//
		Collection<FGVertex> vertices = getVerticesToMove();
		for (FGVertex vertex : vertices) {

			Point2D currentPoint;
			if (newVertices.contains(vertex)) {
				// not in the layout yet, we have to use the group as the starting point
				currentPoint = (Point2D) groupVertexPoint.clone();
			}
			else {
				currentPoint = toLocation(vertex);
			}

			Point2D startPoint = (Point2D) currentPoint.clone();
			Point2D destinationPoint = (Point2D) vertexDestinationLocations.get(vertex).clone();
			TransitionPoints transitionPoints = new TransitionPoints(startPoint, destinationPoint);
			vertexLocations.put(vertex, transitionPoints);
		}

		for (FGVertex vertex : newVertices) {
			Point2D startPoint = (Point2D) groupVertexPoint.clone();
			TransitionPoints xPoint = vertexLocations.get(vertex);
			xPoint.startPoint = startPoint;
		}

		//
		// We have to move edge articulations--create transition points. Depending upon the 
		// value of 'relayout', there may be no edges to update.
		//
		Map<FGEdge, List<Point2D>> edgeArticulations = positions.getEdgeArticulations();
		Collection<FGEdge> edgesToMove = graph.getEdges();
		for (FGEdge edge : edgesToMove) {
			List<Point2D> currentArticulations = edge.getArticulationPoints();
			List<Point2D> newArticulations = edgeArticulations.get(edge);
			if (newArticulations == null) {
				newArticulations = Collections.emptyList();
			}

			List<ArticulationTransitionPoints> transitionPoints = getArticulationTransitionPoints(
				currentArticulations, newArticulations, vertexDestinationLocations, edge);

			edgeArticulationLocations.put(edge, transitionPoints);
		}
	}
Constructor

@param controller the controller of the graph to be ungrouped
@param groupVertex The group vertex to be ungrouped
@param useAnimation whether to use animation
@param isPartOfUngroupAll true signals that this ungroup is part of a larger ungrouping
                          process
Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/util/job/UngroupVertexFunctionGraphJob.java