Para expertos: opciones especiales del diseño de enlaces largos

Las opciones siguientes sólo se aplican al Diseño de enlaces largos.

Especificación de obstáculos adicionales

El algoritmo Diseño de enlaces largos considera los nodos como obstáculos que no pueden solaparse y los enlaces como obstáculos que pueden intersecarse en un ángulo de 90 grados (aproximadamente, si es estilo del enlace es directo), pero que no pueden solaparse.
Enlace
solapando un nodo, después, intersecando otro enlace y, a
continuación, solapando otro enlace
Intersecciones y solapamientos
Ejemplo de cómo especificar obstáculos adicionales (algoritmo Diseño de enlaces)
Si una aplicación requiere obstáculos adicionales que no son enlaces ni nodos, se pueden especificar de la forma siguiente:
Llame a:
layout.addRectObstacle(rect);
layout.addLineRectObstacle(rect);
layout.addLineObstacle(p1, p2);
Los obstáculos rectangulares se comportan como nodos: los enlaces no pueden solapar los rectángulos. Los obstáculos de línea se comportan como segmentos de enlaces: otros enlaces pueden intersecar los segmentos de línea, pero no pueden solapar los segmentos. Esta configuración de los obstáculos se puede eliminar del modo siguiente:
layout.removeAllLineObstacles();
layout.removeAllRectObstacles();

Penalizaciones para los puntos finales variables

Si los puntos de terminación de los enlaces no son fijos, el algoritmo utiliza un método heurístico para calcular los puntos de terminación de cada enlace. Examina todos los puntos libres de la cuadrícula que están cerca del borde de los nodos iniciales y finales y asigna una penalización a cada punto de la cuadrícula. Si se instala un filtro de caras del nodo, la penalización depende de si la cara del nodo está permitida o rechazada.
Una manera más precisa de influir en el modo de elegir los puntos de terminación es el filtro de puntos de terminación. Permite que el usuario especifique la penalización para cada punto de la cuadrícula.
Ejemplo de cómo especificar el filtro de puntos de terminación (algoritmo Diseño de enlaces)
Un filtro de punto de terminación es una clase que implementa la interfaz ibm_ilog.graphlayout.longlink.LongLinkTerminationPointFilter que define el método siguiente:
getPenalty(graphModel, link, origin, node, point, side, proposedPenalty)
Para seleccionar el punto de origin o de destino del enlace de link, se examina el point de entrada (un punto de la cuadrícula de la side de entrada del node). La proposedPenalty se calcula mediante el método heurístico predeterminado del algoritmo. Puede devolver una penalización modificada o puede devolver Number.MAX_VALUE para rechazar el punto de la cuadrícula. Si el punto de la cuadrícula se rechaza, no se elige como punto de terminación del enlace.
El filtro de punto de terminación se puede establecer con el método setTerminationPointFilter.
layout.setTerminationPointFilter(new MyTerminationPointFilter());

Manipulación de las fases de direccionamiento

Como se explica en Algoritmo Diseño de enlaces largos, el algoritmo primero trata cada enlace individualmente y, a continuación, aplica una fase de reducción de intersecciones a todos los enlaces. Para buscar una ruta para un enlace individual, el algoritmo primero comprueba si es posible un direccionamiento (por ejemplo, una línea recta o con una sola inflexión). Si este tipo de direccionamiento no es posible, utiliza un sofisticado algoritmo de búsqueda en la cuadrícula con marcha atrás para encontrar una ruta con muchas curvas, aunque tarda más tiempo en ejecutarse.
Ejemplo de cómo manipular las fase de direccionamiento (algoritmo Diseño de enlaces)
Para inhabilitar la fase que busca un direccionamiento de straight-line o con una sola inflexión:
Utilice el método setStraightRouteEnabled:
layout.setStraightRouteEnabled(true);
La búsqueda hacia atrás de una ruta con muchas curvas se puede hacer de varias maneras.
Es conveniente especificar el tiempo máximo disponible para buscar la ruta para cada enlace.
Ejemplo de cómo especificar pasos hacia atrás (algoritmo Diseño de enlaces)
Puede especificar el número máximo de pasos hacia atrás.
Utilice el método setMaxBacktrack:
layout.setMaxBacktrack(25000);
El número máximo predeterminado de pasos hacia atrás es 30000.
Ejemplo de cómo especificar el tiempo máximo de búsqueda de la ruta (algoritmo Diseño de enlaces)
Para especificar el tiempo máximo disponible para buscar la ruta para cada enlace.
Utilice el método setAllowedTimePerLink.
layout.setAllowedTimePerLink(2500);
El tiempo permitido predeterminado por enlace es de 2000 milisegundos (2 segundos).
Por último, puede especificar cuántos pasos deben efectuarse durante la fase de reducción de intersecciones.
Ejemplo de cómo especificar el número de pasos de la fase de reducción de intersecciones (algoritmo Diseño de enlaces)
Para especificar cuántos pasos deben efectuarse durante la fase de reducción de intersecciones:
layout.setNumberCrossingReductionIterations(3);
Ejemplo de cómo inhabilitar la reducción de intersecciones (algoritmo Diseño de enlaces)
Puede inhabilitar completamente la reducción de intersecciones.
Utilice el método setCrossingReductionEnabled.
layout.setCrossingReductionEnabled(false);

Mecanismo de repliegue

Si uno de los nodos finales está dentro de un enclave, el algoritmo Diseño de enlaces largos no podrá encontrar un direccionamiento para un enlace. En Un nodo dentro de un enclave , el nodo rosa está dentro de un enclave. En este caso, el algoritmo de búsqueda hacia atrás no encuentra un direccionamiento sin nodos que se solapen. El algoritmo de búsqueda hacia atrás también puede fallar si la situación es tan compleja que la búsqueda supera el tiempo permitido por enlace.
Un
enlace que se solapa con un nodo para conectarse con un nodo dentro
de un enclave
Un nodo dentro de un enclave
Cuando el algoritmo de búsqueda hacia atrás no encuentra un direccionamiento, se aplica un mecanismo de repliegue simple que crea un direccionamiento con un solapamiento con un nodo.
Ejemplo de cómo inhabilitar el mecanismo de repliegue (algoritmo Diseño de enlaces)
Para inhabilitar el mecanismo de repliegue:
Utilice el método setFallbackRouteEnabled:
layout.setFallbackRouteEnabled(false);
Si el mecanismo de repliegue está inhabilitado, estos enlaces no se direccionan y conservan la misma forma que antes de ejecutar el diseño. En código Java, puede recuperar los enlaces que no se pueden direccionar de la manera habitual sin el mecanismo de repliegue.
Ejemplo de cómo recuperar enlaces sin el mecanismo de repliegue (algoritmo Diseño de enlaces)
Para recuperar los enlaces que no se pueden direccionar de la manera habitual sin el mecanismo de repliegue:
var links = layout.getCalcFallbackLinks();
while(links.hasNext()){
    var link = links.next();
    // ...
} 
Por ejemplo, puede iterar por estos enlaces y aplicar su propios mecanismo de repliegue en lugar del mecanismo de repliegue predeterminado del algoritmo Diseño de enlaces largos.