2011-12-27 22 views
5

Estoy buscando un buen algoritmo para generar agradables intervalos de marcación mayor/menor para un eje de fecha y hora en el componente de creación de gráficos personalizado. He leído this previous question aquí, que discute una buena manera de calcular las marcas mayores/menores y los valores mínimos/máximos para un eje numérico. Sin embargo, es difícil traducir esto en los cálculos del eje de fecha.Cálculo de fecha y hora Eje mínimo, máximo y mayor intervalo de marcación menor

La razón es que algunos rangos de fechas se basan en bases diferentes a otras, algunos ni siquiera son marcos de tiempo consistentes. Considere un rango de ejes en varios minutos. Este cálculo es bastante fácil ya que puede dividir los minutos usando un algoritmo similar al presentado anteriormente. Sin embargo, ¿qué haces cuando se le pide al mismo eje que presente datos en el rango Años/Meses o Meses/Semana?

El requisito para este eje es que puede calcular marcas principales/secundarias para que el gráfico nunca sea demasiado abarrotado, con rangos de datos de entrada en milisegundos hasta meses y años. Está destinado a ser utilizado en un gráfico en tiempo real, por lo que la presentación estática no es tan importante como la capacidad de actualizar rápidamente. Mi algoritmo simplista hace esto:

  • si un rango> 3 años, elegir importante = 1 año, menor = 3 meses
  • Si el rango> 1 año, elegir importante = 3 meses, menor = 1 mes
  • Si rango> 3 meses, elija mayor = mes, menor = nada (estaba considerando la semana, sin embargo, dado que el mes no es divisible por semana, parece extraño)
  • Si el rango es> 1 semana, elija mayor = 1 día, menor = nada
  • Si el rango es < 1 día, elija las horas según el algoritmo de números agradables
  • Si
  • < rango de 1 hora, minuto elegir
  • Si < rango de 1 minuto, segundo eligen

etc ...

Como se puede ver que es un montón de sentencias if y posible perder algo fuera. En este enfoque, a menudo termino con problemas técnicos en ciertas fechas y me preguntaba si había una forma fácil o común de abordar este problema.

Saludos, Andrew

Respuesta

2
  1. Tener una matriz ordenada de todas las garrapatas posibles: 1 segundo, 1 minuto, 1 hora, 1 día, 1 mes, 1 año.
  2. Decida cuál es la distancia mínima para el mayor (min_dist_major) y para el menor (min_dist_minor) marque. Esas son constantes y tienen valores en píxeles.
  3. Encuentra la marca más pequeña más grande que es más grande que min_dist_major cuando se muestra en el monitor.
  4. A continuación, busque la marca menor más pequeña que sea menor que la marca principal, pero mayor que min_dist_minor cuando se muestre en el monitor. Si no se puede encontrar una marca menor, entonces no existe.

Puede ampliar su matriz con otros ticks, como 2 y 5 de cada tipo.

+0

Gran solución, déjame intentar eso. Supongo que durante un segundo y más de un año puede usar el cálculo numérico de ticks: múltiplos de 1, 2, 5 –

+0

Puede usar cualquier valor que desee, pero 1, 2 y 5 son los más comunes.Durante meses serían 1, 2, 3, 4 y 6, y durante días junto con 1, 2 y 5, agregaría 10 y 15 también. El problema es si no sabes el límite superior. Solo agregue 10, 20, 50, 100, 200, 500 años y probablemente esté bien :) – Dialecticus

+0

Un problema que tengo es hacer que la marca principal sea divisible por un tic menor. Esto se debe principalmente a cómo otras partes de mi software calculan las coordenadas de las marcas de graduación. 3-Month/week fue una mala combinación, por ejemplo. Lo que podría hacer, en cambio, es deshabilitar el menor para ciertas combinaciones de ticks. Voy a probar tu sln, dame unos días ya que es Navidad y todo ;-) –