Modo Incremental com HL

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.
Picture
of hierarchical layouts illustrating the effect of the incremental
mode
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:
  1. 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.
  2. Todos os nós que tocam a mesma linha de referência são designados ao mesmo nível.
  3. 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.
  4. 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.
  5. 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.
Picture
illustrating the layout phases in incremental mode
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.
Picture
of hierarchical layouts illustrating the effect of the incremental
mode with long link crossing reduction
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:
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:
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).
Picture
of hierarchical layouts illustrating the effect of the incremental
mode with absolute level positioning
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).
Picture
of hierarchical layouts illustrating the effect of the incremental
mode with absolute level position tendency
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.