1

特定のタイムステップで目盛りをペイントするタイムラインを作成しています。

そのため、利用可能な幅に応じて、できるだけ多くの目盛りをペイントしたいと考えています。しかし、それらは近づきすぎてはいけません。それらは、少なくとも特定のピクセル数だけ離れている必要があります。

そのため、ズームインすると目盛りは明らかに離れて移動しますが、特定のしきい値では、制限により新しい目盛りがペイントできるようになるとすぐに、古い目盛りの間に新しい目盛りが表示されます。

では、ズームと幅に応じて目盛り間のスペースを見つけるにはどうすればよいですか?

4

2 に答える 2

3

私の最初の回答の後、あなたはあなたの仕様を明確にし、問題は私が予想していたよりも単純であることが判明しました. また、以前に提供した一般的なソリューションよりも単純なソリューションが必要でした。元のコメントを編集するのではなく、まったく別のアプローチであるため、新しいコメントを作成したいと思います。

最初に興味深い変数を定義します。

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

次に、次の式を使用して e を直接計算できます (言語を指定しなかったため、Python を使用しています)。

e = int(math.ceil(math.log(minimumPixelsBetweenTicks * axisRange / axisWidthPixels, 10)))
于 2009-11-29T11:58:12.017 に答える
1

これは少し面倒ですが、シンプルでうまく機能します。

最初に、ティック間に許容される間隔を決定します。時間システム (10 進法? 60 進法? 1 か月の長さ?) の狂気のために、このリストを生成するための特に優れたアルゴリズムはありません。人々がよく知っている自然な間隔を選んで、それをプログラムにハードコードするだけです:

...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...

次に、特定の軸幅と表示する特定の時間間隔を指定して、リストを反復処理し、生成される目盛りの数と、そのスケールを使用した場合の目盛りがピクセル単位でどれだけ近いかを計算します。この計算は、単純な除算を使用して行われます。目盛りが近づきすぎないという条件で、目盛りの数が最大のスケールを選択します。この素朴なアルゴリズムは完全に適切なパフォーマンスを提供するはずですが、最適化したい場合は、リスト全体を反復するのではなく、バイナリ検索を使用できます (おそらく努力する価値はありません)。

少し面倒ですが、これを行うライブラリが見つからない限り、より良い方法はわかりません。私はこの機能を提供するライブラリを知りませんが、自分でこれを書きたくない場合は、そこからコードを取得できる同様のことを行うオープン ソース プロジェクトがたくさんあるはずです。

于 2009-11-26T23:47:38.387 に答える