Para Especialistas: Opções Especiais do Layout de Link Longo

As opções a seguir se aplicam apenas ao Layout de Link Longo.

Especificando Obstáculos Adicionais

O algoritmo de Layout de Link Longo considera nós como obstáculos que não podem ser sobrepostos e links como obstáculos que podem ser cruzados em um ângulo de 90 graus (aproximadamente, se o estilo de link for direto), mas que não podem ser sobrepostos.
Um link
primeiro sobrepondo um nó, em seguida, cruzando outro link, em seguida, sobrepondo
outro link
Cruzamento e sobreposição
Exemplo de Especificação de Obstáculos Adicionais (algoritmo de Layout de Link)
If an application requires additional obstacles that are not links or nodes, they can be specified as follows:
Chamada:
layout.addRectObstacle(rect);
layout.addLineRectObstacle(rect);
layout.addLineObstacle(p1, p2);
Os obstáculos retangulares se comportam como nós: os links não podem sobrepor os retângulos. Os obstáculos de linhas se comportam como segmentos de links: outros links podem cruzar os segmentos de linhas, mas não podem sobrepor os segmentos. These obstacle settings can be removed as follows:
layout.removeAllLineObstacles();
layout.removeAllRectObstacles();

Penalidades para Terminais Variáveis

Se os pontos de terminação dos links não forem fixos, o algoritmo usará uma heurística para calcular os pontos de terminação de cada link. Ele examina todos os pontos da grade livres que estão próximos da borda dos nós inicial e de extremidade e designa uma penalidade a cada ponto da grade. Se um filtro de lado do nó estiver instalado, a penalidade dependerá de o lado do nó ser permitido ou rejeitado.
Uma maneira mais precisa para afetar como os pontos de terminação são escolhidos é o filtro de ponto de terminação. It allows the user to specify the penalty for each grid point.
Exemplo de Especificação do Filtro de Ponto de Terminação (algoritmo de Layout de Link)
Um filtro de ponto de terminação é uma classe que implementa a interface ibm_ilog.graphlayout.longlink.LongLinkTerminationPointFilter que define o seguinte método:
getPenalty(graphModel, link, origin, node, point, side, proposedPenalty)
Para selecionar o ponto de origin ou de destino do link de entrada, o point de entrada (um ponto da grade no side de entrada do node) é examinado. proposedPenalty é calculado pela heurística padrão do algoritmo. É possível retornar uma penalidade alterada ou retornar Number.MAX_VALUE para rejeitar o ponto da grade. Se o ponto da grade for rejeitado, ele não será escolhido como ponto de terminação do link.
O filtro de ponto de terminação pode ser configurado com o método setTerminationPointFilter.
layout.setTerminationPointFilter(new MyTerminationPointFilter());

Manipulando as Fases de Roteamento

Conforme mencionado em Algoritmo de Layout de Link Longo, o algoritmo primeiro trata cada link individualmente e, em seguida, aplica uma fase de redução de cruzamento a todos os links. Para localizar uma rota para um link individual, o algoritmo primeiro verifica se é possível um roteamento (como uma linha reta ou com apenas uma curvatura). If this type of routing is not possible, it uses a sophisticated, but more time consuming, grid search algorithm with backtracking to find a route with many bends.
Exemplo de Manipulação das Fases de Roteamento (algoritmo de Layout de Link)
To disable the phase that finds a straight-line or one-bend routing:
layout.setStraightRouteEnabled(true);
A procura de retrocesso para uma rota com muitas curvaturas pode ser feita de várias maneiras.
Uma maneira conveniente é especificar o tempo máximo disponível para procurar a rota para cada link.
Exemplo de Especificação de Etapas de Retrocesso (algoritmo de Layout de Link)
É possível especificar o número máximo de etapas de retrocesso.
Use o método setMaxBacktrack:
layout.setMaxBacktrack(25000);
O número máximo padrão de retrocesso é 30000.
Exemplo de Especificação do Tempo Máximo para Procura de Rota (algoritmo de Layout de Link)
Para especificar o tempo máximo disponível para procurar a rota para cada link.
Use o método setAllowedTimePerLink.
layout.setAllowedTimePerLink(2500);
O tempo permitido padrão por link é de 2000 milissegundos (2 segundos).
Finally, you can specify how many steps must be done during the crossing reduction phase.
Exemplo de Especificação do Número de Etapas na Fase de Redução de Cruzamentos (algoritmo de Layout de Link)
To specify how many steps must be done during the crossing reduction phase:
layout.setNumberCrossingReductionIterations(3);
Exemplo de Desativação da Redução de Cruzamentos (algoritmo de Layout de Link)
É possível desativar totalmente a redução de cruzamentos.
layout.setCrossingReductionEnabled(false);

Mecanismo de Fallback

Se um dos nós de extremidade estiver dentro de um enclave, o algoritmo de Layout de Link Longo não poderá localizar um roteamento para um link. Em Um nó dentro de um enclave, o nó rosa está dentro de um enclave. Neste caso, o algoritmo de procura de retrocesso falhará ao localizar um roteamento sem nós de sobreposição. The backtrack search algorithm can also fail if the situation is so complex that the search exceeds the allowed time per link.
Um link
que sobrepõe um nó para conectar-se a um nó dentro de um enclave
Um nó dentro de um enclave
Quando o algoritmo de procura de retrocesso falhar ao localizar um roteamento, será aplicado um mecanismo de fallback simples que cria um roteamento com uma sobreposição de nó.
Exemplo de Desativação do Mecanismo de Fallback (algoritmo de Layout de Link)
Para desativar o mecanismo de fallback:
layout.setFallbackRouteEnabled(false);
Se o mecanismo de fallback for desativado, estes links não serão roteados e permanecerão na mesma forma que antes do layout. No código Java, é possível recuperar os links que não puderam ser roteados de maneira usual sem o mecanismo de fallback.
Exemplo de Recuperação de Links sem o Mecanismo de Fallback (algoritmo de Layout de Link)
Para recuperar os links que não puderam ser roteados de maneira usual sem o mecanismo de fallback:
var links = layout.getCalcFallbackLinks();
while(links.hasNext()){
    var link = links.next();
    // ...
} 
Por exemplo, é possível iterar sobre estes links e aplicar seu próprio mecanismo de fallback específico em vez do mecanismo de fallback padrão do algoritmo de Layout de Link Longo.