Tome el segmento más largo alrededor de cero (o el gráfico completo, si el cero no está en el rango) - por ejemplo, si tiene algo en el rango [-5, 1], tome [-5,0 ]
Calcule aproximadamente cuánto tiempo durará este segmento, en tics. Esto solo está dividiendo la longitud por el ancho de una marca. Entonces supongamos que el método dice que podemos poner 11 ticks de -5 a 0. Este es nuestro límite superior. Por el lado más corto, simplemente reflejaremos el resultado en el lado más largo.
Ahora intente poner tantos (hasta 11) ticks en, de modo que el marcador para cada tic en el formulario i * 10 * 10^n, i * 5 * 10^n, i * 2 * 10^n, donde n es un número entero, ei es el índice del tic. Ahora es un problema de optimización: queremos maximizar la cantidad de tics que podemos poner, al mismo tiempo que minimizamos la distancia entre el último tic y el final del resultado. Asigne un puntaje para obtener tantos ticks como podamos, menos que nuestro límite superior, y asigne un puntaje para obtener el último tick cercano a n - tendrá que experimentar aquí.
En el ejemplo anterior, intente n = 1. Obtenemos 1 tilde (en i = 0). n = 2 nos da 1 tick, y estamos más lejos del límite inferior, por lo que sabemos que tenemos que ir hacia el otro lado. n = 0 nos da 6 tics, en cada punto de punto entero. n = -1 nos da 12 tics (0, -0.5, ..., -5.0). n = -2 nos da 24 tics, y así sucesivamente. El algoritmo de puntuación les dará a cada uno una puntuación; más alto significa un mejor método.
Repita esto para i * 5 * 10^n, y i * 2 * 10^n, y tome el que tenga el mejor puntaje.
(como un algoritmo de puntuación de ejemplo, digamos que el puntaje es la distancia al último tic multiplicado por el número máximo de ticks menos el número necesario. Esto probablemente será malo, pero servirá como un punto de partida decente) .
Esto se ve bien, puedo comprar el libro. – Nick
¿Cómo diablos puede un libro sin un libro electrónico disponible ser una respuesta tan aceptada? – geotheory
Puede leer el artículo de Heckbert en [Amazon] (https://www.amazon.com/dp/0122861663/) (vea la función "Mirar dentro"). La implementación de C está en el Apéndice. –