2012-01-26 11 views
1

データ視覚化プログラムのための可変解像度のルーラーコントロールを構築しています。ズームレベルに応じて軸目盛のラベルを表示します。数字を非対称の解像度に丸める(床)

例えば、非常に広いズームでは、[100,200,300]の目盛りラベルだけが描画されます。ズームを閉じると、[10,15,20,25]というラベルが表示されます。

数値は常に5または10の倍数になります。したがって、部分的な丸めグリッドは[1,5,10,50,100,500,1000,5000]になりますが、両方とも無限大になります10進数を含む側面(

質問です:?任意の正の浮動小数点数を考えると、どのように私は、グリッド内の最初の数が少ないと「床」それをできた

(これは私が設定することができるようになりますプロッタのズームレベル/スケールに応じて目盛りラベルの細かさ)。

  • グリッドは「無限大」です(そのため、ソートやその他のリストメソッドは使用しませんでした)。
  • 浮動小数点数には常に正の値とゼロ以外の値が固定されていますが、固定値のセットはありません。

  • (EDIT)解像度はSYMMETRICではなく、ティック間隔は[1,5,10,50,100,500、...]で、増分乗数は2と5です!

答えて

1

を読み取るためのおかげで、最上位桁が< 5の場合は、1と(K-1)を使用し、kは数の長さゼロ、他の使用1及び(K-1)ゼロ。以下の機能が働きます。

import numpy as np 
def truncate(x): 
    length = 0 
    if x>=1: 
     while x>=10: 
      length+=1 
      x/=10 
    else: 
     while x<1: 
      length-=1 
      x*=10 
    r = max(0,-length) 
    if x<5: 
     return round(np.power(10.0,length),r) 
    else: 
     return round(5*np.power(10.0,length),r) 
+0

I:

newValue = value - value % tick 

はダニがフロート(または偶数)を使用している場合'truncate(320)'を試み、永遠にループしています...編集:私はPythonを使用しているので、 '^'は '**'でなければなりません。しかし、そうであっても、それは希望よりも小さなグリッドを与えます(数字320の場合は100ではなく50) – heltonbiker

+0

@heltonbikerは1ステップを逃しました:x/= 10。今すぐ仕事しなければならない! – ElKamina

+0

新しい行 'x/= 10'はどこに置かれますか? – heltonbiker

0

モジュロ演算子を使用します。
それは多くの言語^%では、電力を意味

ティックは整数、使用された場合:

tickDecimals = decimalsOf(tick)  // pseudo function to know how much decimals tick has 
newValue = (value * 10^tickDecimals - ((value * 10^tickDecimals) % (tick * 10^tickDecimals)))/10^tickDecimals // some parentheses are redundant 
+0

これは5の倍数でも機能するはずですので、[1,5,10,50,100,500、...] – heltonbiker

+0

これは5の倍数、または他の任意の数 –

関連する問題