In some circumstances you, might need to use a sequence
of layouts on the same graph. Por exemplo:
- Você trabalha com gráficos que ficaram desatualizados e é necessário estender o gráfico. Se você executar um layout no gráfico estendido, provavelmente queira identificar as partes que já foram organizadas no gráfico original. O layout não deve ser muito alterado quando comparado com o layout do gráfico original.
- O primeiro layout resulta em um desenho com deficiências menores. Você deseja resolver estas deficiências manualmente e executar um segundo layout para limpar o desenho. O segundo layout provavelmente não deve alterar muito as partes do gráfico que já foram aceitas após o primeiro layout.
O Layout Hierárquico normalmente funciona de forma não incremental.
Ele executa um layout a partir do início e move todos os nós para novas posições
e roteia novamente todos os links. As posições anteriores de nós não têm nenhuma influência
no resultado do layout. Portanto, mesmo uma pequena mudança pode causar
um grande efeito no próximo layout.
Mas o Layout Hierárquico também suporta sequências incrementais
de layout que “não são muito alteradas.”
Ele pode posicionar os nós próximos de suas posições anteriores, para que seja possível
identificar mais facilmente as partes que já foram organizadas
no gráfico original. O modo incremental considera as posições anteriores
dos nós. In this mode, the algorithm preserves the
relative order of the levels and the nodes within the levels in the
subsequent layout. Ele não preserva as posições absolutas dos nós,
mas tenta detectar a estrutura do layout anterior,
examinando as coordenadas do nó. Por exemplo, se dois nós estiverem
no mesmo nível, eles permanecerão no mesmo nível após um
layout incremental. Se um nó estiver em um nível mais alto que outro nó, ele permanecerá
no nível mais alto.
A figura a seguir ilustra a diferença entre um
layout incremental e não incremental.

Layouts incrementais e não incrementais
O modo incremental é desativado por padrão.
Para ativar o modo incremental:
Use o método setIncrementalMode. Por exemplo:
layout.setIncrementalMode(true);
Fases do Modo Incremental
O algoritmo de layout analisa o desenho em modo incremental
da seguinte maneira:
- Primeiro, ele determina a partir das coordenadas do nó quais nós devem pertencer ao mesmo nível. Por exemplo, se a direção do fluxo for para a parte inferior, ele tentará detectar linhas de referência horizontais nas posições verticais em que muitos nós são posicionados em uma linha. The specified vertical node offset helps to detect these lines because the horizontal reference lines must be approximately the vertical node offset apart. Consulte a figura a seguir.
- Todos os nós que tocam a mesma linha de referência são designados ao mesmo nível.
- Ele determina a ordem dos nós em cada nível, analisando onde o nó toca a linha de referência. Por exemplo, se a direção do fluxo for para a parte inferior, ele determinará a partir da coordenada x dos nós como eles serão ordenados nos níveis.
- Se os links longos estenderem vários níveis, o algoritmo poderá preservar a forma de um link longo. Ele determina o ponto em que um link cruza a linha de referência do nível. Ele cria um ponto de curvatura para o link longo dentro do nível. Ele tenta preservar a ordem dos pontos de curvatura em cada nível. For instance, if in a flow direction towards the bottom, a long link bypasses another node on the right side, then the incremental layout tries to find a similar shape of the link that bypasses the node on the right side. Consulte a figura a seguir.
- Por último, o layout tenta calcular as posições absolutas dos nós que respeitam os níveis e a ordenação nos níveis. Ele tenta balancear as posições dos nós. No entanto, ele também tenta posicionar cada nó próximo de sua posição anterior. Os critérios geralmente competem entre si, porque, para obter um balanceamento perfeito, às vezes os nós devem mover-se para longe de sua posição original. O Layout Hierárquico contém uma heurística parametrizada para atender aos dois critérios.
A figura a seguir mostra o resultado das fases incrementais.

Fases de layout incrementais
Parâmetros de Especialistas do Modo Incremental
Cada fase do modo incremental pode ser parametrizada.
These layout parameters are effective only if incremental mode is
enabled.
Minimizando Cruzamentos de Links Longos
O layout incremental tenta preservar a forma de links
longos que cruzam vários níveis. It implies that link crossings
between long links are not resolved. If crossings of long links are
not wanted, it might be better to reroute long links from scratch.
A figura a seguir mostra quatro árvores de hierarquia, com o layout original
na parte superior esquerda. A parte inferior direita mostra o resultado se os links
longos forem roteados novamente, e a parte superior direita mostra o resultado se a forma
dos links longos for preservada.

Redução de cruzamentos durante layouts incrementais
Para rotear novamente links longos a partir do início, você deve ativar o mecanismo
de redução de cruzamentos para links longos:
Use o método setLongLinkCrossingReductionDuringIncremental. Por exemplo:
layout.setLongLinkCrossingReductionDuringIncremental(true);
A redução de cruzamentos de links longos determina apenas
a forma dos links. Ele não influencia a ordem dos outros nós
nos níveis.
Minimizando Todos os Cruzamentos de Links
Opcionalmente, é possível aplicar uma redução de cruzamentos a todos os nós
em cada nível. In this case, the incremental layout determines
from the node coordinates which nodes belong to the same level, but
it might reorder the nodes within the levels completely to avoid link
crossings. Ele também reordena os links longos neste caso. A figura anterior,
inferior esquerda, mostra o resultado. Observe que a ordem dos
nós “F,” “G” e “H”
foi alterada para resolver os cruzamentos de links.
Para ativar a redução de cruzamentos para todos os nós:
Use o método setCrossingReductionDuringIncremental:
layout.setCrossingReductionDuringIncremental(true);
Configurando o Posicionamento de Nível Absoluto
O layout incremental tenta posicionar os nós em posições
absolutas que estão próximas das posições anteriores. It tries to avoid
nodes moving a long distance, because even if the relative order of
the nodes within the levels does not change, long distances can be
confusing for users. É muito mais fácil manter um mapa mental
do diagrama, se os nós permanecerem próximos das posições anteriores.
A figura a seguir ilustra o reposicionamento de nós
considerando e não considerando as posições anteriores. The incremental
layout of the original graph (upper left) results in the graph at
the upper right, which is easier to recognize as being the same graph
than is the graph at the bottom.
O recurso de posicionamento de níveis absoluto é ativado por padrão,
mas pode ser desativado.
Para desativar o recurso de posicionamento de níveis absoluto:
Use o método setIncrementalAbsoluteLevelPositioning. Por exemplo:
layout.setIncrementalAbsoluteLevelPositioning(false);
Com esta instrução, o layout não tenta posicionar
os nós próximos das posições anteriores. Ele posiciona os nós de forma
que o layout fique balanceado. However, to create a perfect balance,
the layout might need to move a few nodes so far apart that you no
longer recognize the diagram (see the following figure, bottom).

Posicionamento absoluto durante layouts incrementais
Configurando o Intervalo e Tendência de Posição de Nível Absoluta
Se o posicionamento de nível absoluto estiver ativado, ele competirá
com os critérios estéticos para criar um layout balanceado. Because nodes
must stay close to their previous positions, the diagram after incremental
layout might be unbalanced and unsymmetrical. O algoritmo de Layout Hierárquico usa uma heurística que pode ser influenciada
por dois parâmetros, o intervalo e a tendência de posição de nível absoluto.
O recurso de posicionamento de níveis absoluto é ativado por padrão,
mas pode ser desativado.
Para desativar o recurso de posicionamento de níveis absoluto:
Use o método setIncrementalAbsoluteLevelPositionRange. Por exemplo:
layout.setIncrementalAbsoluteLevelPositionRange(100);
Esta instrução especifica que dentro do intervalo de 100
unidades de coordenadas a partir da posição antiga do nó, o balanceamento é o único
critério para o posicionamento. Isto significa que um nó cuja posição ideal
é menor que 100 unidades de coordenadas de distância de sua posição anterior
é posicionado exatamente em sua posição ideal. Os nós cuja posição ideal
está mais distante são colocados em uma posição que é um compromisso
entre a posição anterior e a posição ideal. See the following
figure, right.
Para configurar a tendência de posição de nível absoluta:
Use o método setIncrementalAbsoluteLevelPositionTendency. Por exemplo:
layout.setIncrementalAbsoluteLevelPositionTendency(70);
Esta instrução especifica que, quando a posição ideal de um nó
está distante de sua posição anterior, sua posição é
70% influenciada por sua posição anterior e 30% influenciada por sua
posição ideal. Imagine um elástico que tenta puxar um nó para sua posição anterior
e outro elástico que tenta puxar o mesmo nó
para a sua posição balanceada de maneira ideal. A tendência de posição
de nível
70
significa que um elástico
puxa com 70% da força na direção da posição anterior e o outro elástico
puxa com 30% na direção da posição ideal. Aumentar a tendência
significa que o nó permanece mais próximo de sua posição antiga,
diminuir significa que o nó se move para mais perto de sua posição ideal.
If you set the tendency to 0%, it has the same effect as disabling
the incremental absolute level positioning (see the following figure). 
Posicionamento absoluto durante layouts incrementais
Marcando Nós para Layout Incremental
O layout incremental normalmente marca todos os nós e links
do desenho da mesma maneira. However, you might have added nodes
and links to the drawing programmatically, and the new nodes and links
do not have meaningful coordinates yet. Talvez você tenha posicionado todos eles
na origem (0,0), ou em coordenadas aleatórias. In this case, you
need an incremental layout that takes into account the coordinates
of all nodes that were previously laid out while ignoring the coordinates
of the new nodes.
O modo incremental do Layout Hierárquico permite especificar
quais nós não podem ser organizados de maneira incremental, usando
o método:
layout.markForIncremental(nodeOrLink);
Se você chamar esta instrução, o nó ou link será marcado
de forma que suas coordenadas sejam ignoradas durante o próximo
layout incremental. As posições de nós e links marcados são calculadas
a partir do início. The mark is valid only until the next layout and is automatically
cleared afterward.