una trazar sirve recta que para lineas empresa ejemplos dibujar decisiones dda circunferencias arbol algoritmo algorithm graphics graph drawing

algorithm - trazar - ¿Cuáles son algunos buenos algoritmos para dibujar líneas entre nodos gráficos?



arbol de decisiones ejemplos (5)

Con lo que estoy lidiando específicamente no es solo el diseño de un gráfico, sino que cuando un usuario selecciona un nodo de gráfico y comienza a arrastrarlo alrededor del área de la pantalla, la línea debe volver a dibujarse constantemente para reflejar cómo se vería si el El usuario debía liberar el nodo. Supongo que esto es parte del algoritmo de diseño?

Además, algunas aplicaciones se vuelven un poco sofisticadas y no simplemente dibujan la línea de una manera agradable y con curvas, sino que también doblan la línea alrededor del nodo de forma cuadrada en ángulos casi rectos. Vea la imagen adjunta y tenga en cuenta que a medida que se arrastra un nodo, la línea se dibuja como hormigas en marcha y se reorganiza de forma agradable, al tiempo que conserva su estilo curvo.

texto alternativo http://img260.imageshack.us/img260/5458/nodesr.png


¿Estás familiarizado con Graphviz ? No estoy seguro de qué tan dinámicos y valiosos sean los algoritmos de diseño, pero podría ser un buen punto de partida.



Realmente no hay necesidad de nada dramático más allá de dibujar directamente sobre coordenadas cartesianas. Se pueden usar heurísticas simples para manejar la ruta y es probable que alcancen el número mínimo de ángulos óptimo la mayoría de las veces, pero es probable que la ruta de longitud más corta sea incluso más frecuente. Todo esto se puede hacer dinámicamente según sea necesario, pero manteniendo la precisión de los gráficos sin dividir la pantalla de forma más discreta que necesita (los píxeles deben seguir siendo el nivel más discreto) y sin la necesidad de algoritmos complejos.

Para la superposición, simplemente configure todos los píxeles en el color de sus líneas y modifique los bits del canal alfa para que sean transparentes u opacos, dependiendo de si el píxel es o no es parte de la línea. Para averiguar qué bits que forman parte de la línea requiere un poco de geometría, pero eso es un pedazo de pastel una vez que tienes todo en su lugar.

Para descubrir cómo dibujar su línea en el canal alfa, deberá averiguar el estilo de sus líneas. Mucho de lo que harás depende del estilo. Un estilo común es el uso de líneas rectas que están alineadas horizontal y verticalmente con cuartos de círculos para los ángulos rectos.

Para los algoritmos de "evitación", estos no son muy difíciles de implementar cuando solo se quieren evitar las "cajas" que representan sus nodos ... descifrar todas sus líneas es una tarea un poco más grande y algo que ni siquiera Visio emplea . Para evitar las cajas / nodos, es bueno usar simetría en el punto medio entre los bordes de la caja (como los bordes verticales entre geo1 y geo3) y luego elegir una distancia predefinida simple para mantener las líneas no conectadas (es decir, líneas que no se conecte a esa caja en particular) lejos de las cajas también funciona bien. Un algoritmo generalizado para esto es simple de hacer, pero un poco demasiado detallado para describirlo aquí, pero es esencialmente un conjunto de controles e interruptores generalizados que funcionan en líneas horizontales y verticales alineadas y cuartos de vuelta. Si terminas queriendo más detalles sobre cómo hacer esto, simplemente publica un comentario sobre esta respuesta.

Si está buscando algo que ya está hecho para usted, el tipo de conexiones y la reorganización que desea realmente depende de la aplicación y no muchas personas hacen herramientas que sean de baja demanda o demasiado específicas de una demanda. Obviamente, este tipo de software está disponible ya que Visio y otros lo emplean, pero no estoy seguro de si está disponible como fuente abierta o como parte de otras bibliotecas gratuitas.


Si tus diagramas no están completamente locos, no deberías necesitar un algoritmo extra sofisticado para esto, solo usa un poco de sentido común.

  1. Cubra la superficie con una cuadrícula rectangular y luego encuentre una manera de conectarse a cuadros con líneas rectas a lo largo de las líneas de cuadrícula con un número mínimo de ángulos: si los cuadros no están en las mismas líneas de cuadrícula y no le importa dónde se conecta, necesita un ángulo si no hay otro nodo en el medio. Si hay, por ejemplo, nodos en la forma en que necesita al menos un ángulo más.

  2. Como segundo paso para diagramas más completos, agregue un código que no solo se optimice para un número mínimo de bordes, sino también para una longitud mínima de las líneas. Si sus diagramas no están demasiado llenos, esto debería ser apenas perceptible en términos de respuesta de la aplicación.

  3. Para un ojo extra, redondee los ángulos teniendo en cuenta la longitud de ambas piernas y verifique si hay intersecciones con otros objetos en la superficie. Yo usaría 90 ° de círculos de círculos y ajustaría el radio de los círculos (aparentemente no lo que se hizo arriba); para patas más largas, el radio debería ser más grande. Tal vez el kit de herramientas que está utilizando pueda ayudarle aquí.