2009-06-23 18 views
5

estoy dibujando perfiles de elevación que muestran la elevación de ganancia/pérdida a lo largo de un sendero, similares a la de abajo:etiqueta (? Simple) Colocación de gráficos de líneas

Sample Elevation Profile with hand-placed labels http://img38.imageshack.us/img38/4079/profilewithgoodlabels.png

Esto es básicamente un gráfico de líneas con distancia desde el inicio en el eje xy elevación en el eje y.

Me gustaría proporcionar etiquetas elegantes con elevaciones puntuales en puntos interesantes a lo largo del camino, como las que he agregado a mano a la imagen de muestra. Estoy en busca de ideas sobre la mejor manera de colocar estas etiquetas para que:

  • que no se solapen entre sí
  • que no se superpongan con el perfil en sí, o por lo menos esto sucede en una modo de aspecto limpio (parece que podría ser necesario en el medio de un valle, por ejemplo)
  • no se extienden fuera de la caja que limita la imagen global

para lograr estos objetivos, calculo Puedo (al menos):

  • Voltear el texto alrededor (ver ejemplo)
  • Elija longitudes apropiadas para los líderes
  • Elija ángulos apropiados para líderes (pero minimizando la variación podría ser deseable por razones estéticas)
  • gota cotas para menos importante lugares en las zonas muy pobladas
  • nombres aBREVIE en las zonas muy pobladas (s PlaceName en mi entorno ya soportan abreviatura de una manera muy agradable, por lo que el cambio de "Twin montaña del sur" a "s doble MTN" es fácil)
  • gota menos- importante a nnotaciones completamente en áreas concurridas

Pero no sé cómo estructurar mejor este algoritmo. Parece un problema de optimización tal vez? (¿Minimizar el apestoso asociado con la anotación y proporcionar una penalización numérica para cada una de las cosas que trato de evitar?) Pero dado que hay muchas variables discretas para optimizar y realmente no me importa lo "mejor" solución (solo una buena, y preferiblemente estable) no estoy seguro de qué hacer.

¿Cómo se suelen abordar problemas como este en los gráficos? ¿Programación dinámica? ¿Sucumbir y atado? ¿La idea de optimización está fuera de lugar? ¿Hay alguna biblioteca útil para .NET que pueda interesarme?

(No quiero ceder esto a una biblioteca general de dibujo de gráficos, ya que es una característica clave del producto en general y tengo algunas características más personalizadas planificadas que pueden ser difíciles de meter en un propósito general graph-drawing library)

+0

¿Cómo te va? ¿Encontraste el mejor algoritmo? –

+0

Terminé yendo con el enfoque de recocido simulado (después de dejar este proyecto de lado por un tiempo). Fue bastante simple de implementar, funciona bastante bien, y partes de ella se pueden reutilizar para otras cosas como etiquetar mapas y seleccionar diseños de página, e incluso predecir qué rutas a través de la red de senderos pueden ser buenas para caminar. –

Respuesta

1

Probablemente coloque una etiqueta, luego coloque la siguiente, compruebe si se superpone con la primera, y si lo hace, si eso no funciona, empuje hacia arriba hasta que no lo haga superponerse más ... como punto de partida de todos modos. Tal vez agregue una función de costo como una distancia desde la ubicación ideal o predeterminada (si no había otras etiquetas en el camino), que se debe minimizar. Luego encuentre la disposición de etiquetas más económica. Puede dar la vuelta, el movimiento, la rotación, la abreviatura y dejar cada uno un costo diferente.

+0

Es una buena idea, pero ¿qué sucede si la primera opción no es buena y arruina las siguientes? Por ejemplo, ¿qué pasaría si la primera opción de izquierda a derecha es colocar una etiqueta que cubra la mayor parte del valle y que haga imposible colocar etiquetas con líderes largos que salen del valle para buscar puntos que estén abajo en el valle? ¿Valle? –

+0

Bueno, entonces su costo total sería mayor porque cada etiqueta subsiguiente tendría que moverse una distancia mayor. Así que supongo que * podrías * probar todos los pedidos posibles de etiquetas y luego tomar el de menor costo ... esto, por supuesto, es altamente ineficiente, pero tal vez puedas inventar algunas heurísticas para minimizar el número de posibilidades que deben ser examinadas . – mpen

2

Esta es mi opinión:

  1. Marcar los puntos donde se quiere poner etiquetas
  2. dividirlas en grupos con la distancia de al menos 2*size entre ellos
  3. Para cada grupo, vaya desde la derecha un intento de poner una etiqueta.
  4. Trate de colocar la etiqueta a la derecha oa la izquierda. Ver lo que se traduce en una menor longitud de la línea vertical
  5. Si no importa, tratar de poner a la derecha
  6. A menos que sea el final del grupo, a continuación, tratar de ponerlo a la
  7. izquierda

Ahora vuelva a examinar las etiquetas y vea si se puede voltear cualquiera de un lado a otro mientras se acorta la longitud de las líneas verticales.

Debe dar lugar a una salida decente, en mi opinión.

1

Esta pregunta me recuerda a un proyecto de gráficos que no hace mucho tiempo. Fue para dibujar un gráfico matemático (como en nodos y bordes) de la manera más agradable posible. Hay varios enfoques, pero mi favorito fue por lejos el enfoque de la física. Tratas cada nodo como una partícula cargada que repele a todos los demás y cada borde como un resorte clásico con una longitud ideal. Ejecuta unos pocos cientos de pasos de tiempo y, finalmente, llega a un estado estable con un efecto de amortiguación adecuado.

Veo muchos paralelismos con su problema. Los cuadros de texto son los nodos y las líneas principales son los bordes.

Deberá modificarse. Por ejemplo, debe haber una fuerza positiva hacia arriba para que no vayan por debajo del gráfico. También debería incorporar la idea de mover el texto hacia la izquierda o hacia la derecha. Pero debería dar un resultado razonable en la mayoría de las entradas.

El artículo que hice referencia para mi proyecto fue here.

+0

Otro buen plan, había oído hablar de este enfoque antes, pero nunca se me pasó por la cabeza al pensar en este proyecto. ¡Gracias! –

Cuestiones relacionadas