2009-11-26 13 views
1

Je crée une chronologie où je veux peindre les tiques à un certain moment. Donc en fonction de la largeur disponible, je veux peindre autant de tiques que possible. mais ils ne devraient pas être trop proches les uns des autres. Ils doivent rester séparés d'au moins un certain nombre de pixels. Par conséquent, lorsque vous zoomez, les graduations s'écartent évidemment, mais à un certain seuil, de nouvelles graduations apparaissent entre les anciennes, dès que la limite permet de peindre. Comment puis-je trouver l'espace entre les graduations en fonction du zoom et de la largeur?peindre des ticks sur une ligne de temps zoomable

+0

Est il y a un problème avec ma deuxième réponse? –

+0

non, je n'ai pas eu beaucoup de temps ces derniers jours pour le tester. Pardon. En fait, il ne fonctionne pas parce que je ne comprends pas un paramètre. Je vais y mettre un commentaire plus tard. Merci! – clamp

Répondre

1

C'est un peu en désordre, mais il est simple et cela fonctionne bien:

d'abord décider quels intervalles devraient être autorisés entre les tiques. En raison de la folie du système de temps (base 10? Base 60? Combien de temps est un mois?) Il n'y a aucun algorithme particulièrement bon pour générer cette liste - il suffit de choisir les intervalles naturels que les gens connaissent et coder en dur dans votre programme:

...etc... 
every 0.1 second 
every 1 second 
every 5 seconds 
every 15 seconds 
every 1 minute 
every 5 minutes 
every 15 minutes 
every 1 hours 
every 2 hours 
every 4 hours 
every 8 hours 
every day, midnight 
every 7 days, midnight 
every month start 
every quarter start 
every year start 
every 10 years 
...etc... 

ensuite donné une largeur d'axe spécifique, et un intervalle de temps spécifique pour afficher, il suffit de parcourir votre liste calculer combien de tiques qu'elle produirait et à quel point les tiques seraient en pixels serait si vous avez utilisé cette échelle. Ce calcul se fait en utilisant une division simple. Choisissez l'échelle avec le plus grand nombre de ticks à la condition que les ticks ne se rapprochent pas trop. Cet algorithme naïf devrait donner des performances parfaitement adéquates, mais vous pouvez utiliser une recherche binaire plutôt que d'itérer sur toute la liste si vous souhaitez l'optimiser (mais cela ne vaut probablement pas la peine).

C'est un peu ennuyeux, mais je ne connais pas de meilleure façon, sauf si vous pouvez trouver une bibliothèque qui fera cela pour vous. Je ne connais aucune bibliothèque qui offre cette fonction, mais il doit y avoir des tonnes de projets open source qui font quelque chose de similaire que vous pourriez récupérer du code si vous ne voulez pas écrire cela vous-même.

+0

merci pour votre réponse! Le temps est abstrait, sans rapport avec les secondes, les minutes, etc. Donc la base devrait être 10. – clamp

+0

Ensuite, vous pouvez commencer avec 1 unité de temps, et voir combien de ticks vous obtenez (numberOfTicks = temps total/1) et comment ils sont proches (distanceBoisTicks = pixelsOnXAxis/numberOfTicks). Si distanceBetweenTicks threshold, timeunit/= 10. Jusqu'à ce que vous obteniez le plus proche possible du seuil, arrêtez-vous. –

+0

Désolé pour le formatage. Est-ce que ma réponse n'était pas claire? –

3

Après ma première réponse, vous avez clarifié vos spécifications et le problème s'est avéré plus simple que prévu. Vous vouliez également une solution plus simple que la solution générale que j'ai fournie plus tôt. Plutôt que d'éditer mon commentaire original, je préfère créer un nouveau commentaire car il s'agit d'une approche complètement différente.

d'abord définir les variables intéressantes:

minimumPixelsBetweenTicks = 5 
axisWidthPixels = 400 
axisRangeTime = 1000.0   # = axisMaximumTime - axisMinimumTime 
tickSeparationTime = 10 ** e # e is an unknown integer that we must find 

vous pouvez calculer directement e en utilisant la formule suivante (vous ne spécifiez pas la langue, donc je suis en utilisant Python):

e = int(math.ceil(math.log(minimumPixelsBetweenTicks * axisRange/axisWidthPixels, 10)))