以下に示す実装は python です。両方の言語に熟練していれば、ほとんどの要素は簡単に直接 C# に変換できます。いくつかのステートメントでは、一連のif
ステートメントまたは別のアプローチが必要になる場合があります。
プログラムでは、最後の 4 行がメイン プログラムです。示されているように、main には 80 個のテスト ケースを生成するループがあり、サイズは 0.04 から約 200 まで幾何学的に増加します。より粗くテストする場合は、40 (サイズの数) をより小さい数に変更し、1.24 (幾何学的比率) をより大きな数。テストされたサイズごとに、メインはstepShow
2 回呼び出されます。最初は の 10% からsize
最大 110% までsize
のテスト範囲で、次に -28% から 82% までのテスト範囲で行われます。stepShow
は、 を呼び出すテスト ルーチンです。これは、左端の目盛りの位置と目盛り間の間隔である とをstepCalc
計算するアルゴリズムを具体化したルーチンです。leftTick
tickSize
stepCalc
span = max(hiVal,0) - min(loVal,0)
x=0 が目盛りの範囲に収まるようにします。次にdecade = 10**(math.log(span/6.0)//math.log(10))
、スパンの 1/6 を超えない 10 の最大累乗を計算します。(Python の//
演算子は整数の結果を返し、**
べき乗を表します。) ティック サイズが 1 から 10 の間である可能性が高い場合multis = (1,1.5,2,3,5,10) if decade==1 else (1,2,5,10)
はタプルを (1,1.5,2,3,5,10) に設定しますが、それ以外の場合は (1,2 multis
,5,10)。ループ内のコードはfor m in multis:
計算tickSize
とleftTick
値を計算します。それらが十分に大きくなると、ループから抜け出し、それらを返します。
このプログラムの出力では、各サイズの 2 つのテスト ケースの は通常同じtickSize
ですが、もちろん leftTick
最初のケースはゼロで、2 番目のケースは負です。いくつかの行の例を次に示します。(完全な出力はプログラムの後に表示されます。) 各 5 つの数値グループには の値が含まれますleftTick, loVal, hiVal, rightTick, tickSize
。
0.000 0.101 1.109 1.200 0.200 -0.500 -0.282 0.826 2.500 0.500
0.000 0.238 2.621 3.000 0.500 -1.000 -0.667 1.954 2.000 0.500
0.000 0.295 3.250 6.000 1.000 -1.000 -0.827 2.423 5.000 1.000
0.000 0.563 6.197 9.000 1.500 -3.000 -1.577 4.619 6.000 1.500
0.000 0.866 9.528 12.000 2.000 -4.000 -2.425 7.103 8.000 2.000
0.000 1.074 11.815 12.000 2.000 -6.000 -3.007 8.807 12.000 3.000
上記の例の行の最初と最後の行のように、サイズtickSize
によっては 2 つのケースで異なります。両方のテスト ケースで全体のスパンは同じですが、 の 110% ですが、0 ティックが範囲の最後にない場合は、より大きな値が必要size
です。タプルに 10 を含めると、このケースが処理されます。tickSize
loVal
hiVal
tickSize
multis
def stepCalc(loVal, hiVal):
import math
span = max(hiVal,0) - min(loVal,0) # have to have 0 in span
decade = 10**(math.log(span/6.0)//math.log(10))
multis = (1,1.5,2,3,5,10) if decade==1 else (1,2,5,10)
for m in multis:
tickSize = m * decade
cover = 6.0 * tickSize;
leftTick = 0 if loVal >= 0 else -cover if hiVal <= 0 else (loVal//tickSize)*tickSize
if leftTick+cover >= hiVal: break
return (leftTick, tickSize)
def stepShow(loVal, hiVal):
(leftTick, tickSize) = stepCalc(loVal, hiVal)
return ' {:7.3f} {:7.3f} {:7.3f} {:7.3f} {:7.3f} '.format(leftTick, loVal, hiVal, leftTick+6*tickSize, tickSize)
size = 0.04
for i in range(40):
print stepShow(0.1*size, 1.1*size), stepShow(-0.28*size, 0.82*size)
size *= 1.24
上記のコードは、目盛りの位置を対称化しようとはしていません。それをしたい場合は、コードを前に追加して、の倍数でreturn (leftTick, tickSize)
減らすことができますが、上記の倍数は下よりも多くなります。leftTick
tickSize
tickSize
hiVal
loVal
プログラム出力:
0.000 0.004 0.044 0.060 0.010 -0.020 -0.011 0.033 0.040 0.010
0.000 0.005 0.055 0.060 0.010 -0.020 -0.014 0.041 0.040 0.010
0.000 0.006 0.068 0.120 0.020 -0.020 -0.017 0.050 0.100 0.020
0.000 0.008 0.084 0.120 0.020 -0.040 -0.021 0.063 0.080 0.020
0.000 0.009 0.104 0.120 0.020 -0.040 -0.026 0.078 0.080 0.020
0.000 0.012 0.129 0.300 0.050 -0.050 -0.033 0.096 0.250 0.050
0.000 0.015 0.160 0.300 0.050 -0.050 -0.041 0.119 0.250 0.050
0.000 0.018 0.198 0.300 0.050 -0.100 -0.050 0.148 0.200 0.050
0.000 0.022 0.246 0.300 0.050 -0.100 -0.063 0.183 0.200 0.050
0.000 0.028 0.305 0.600 0.100 -0.100 -0.078 0.227 0.500 0.100
0.000 0.034 0.378 0.600 0.100 -0.100 -0.096 0.282 0.500 0.100
0.000 0.043 0.469 0.600 0.100 -0.200 -0.119 0.350 0.400 0.100
0.000 0.053 0.581 0.600 0.100 -0.200 -0.148 0.433 0.400 0.100
0.000 0.066 0.721 1.200 0.200 -0.200 -0.184 0.537 1.000 0.200
0.000 0.081 0.894 1.200 0.200 -0.400 -0.228 0.666 0.800 0.200
0.000 0.101 1.109 1.200 0.200 -0.500 -0.282 0.826 2.500 0.500
0.000 0.125 1.375 3.000 0.500 -0.500 -0.350 1.025 2.500 0.500
0.000 0.155 1.705 3.000 0.500 -0.500 -0.434 1.271 2.500 0.500
0.000 0.192 2.114 3.000 0.500 -1.000 -0.538 1.576 2.000 0.500
0.000 0.238 2.621 3.000 0.500 -1.000 -0.667 1.954 2.000 0.500
0.000 0.295 3.250 6.000 1.000 -1.000 -0.827 2.423 5.000 1.000
0.000 0.366 4.030 6.000 1.000 -2.000 -1.026 3.004 4.000 1.000
0.000 0.454 4.997 6.000 1.000 -2.000 -1.272 3.725 4.000 1.000
0.000 0.563 6.197 9.000 1.500 -3.000 -1.577 4.619 6.000 1.500
0.000 0.699 7.684 9.000 1.500 -3.000 -1.956 5.728 6.000 1.500
0.000 0.866 9.528 12.000 2.000 -4.000 -2.425 7.103 8.000 2.000
0.000 1.074 11.815 12.000 2.000 -6.000 -3.007 8.807 12.000 3.000
0.000 1.332 14.650 18.000 3.000 -6.000 -3.729 10.921 12.000 3.000
0.000 1.651 18.166 30.000 5.000 -5.000 -4.624 13.542 25.000 5.000
0.000 2.048 22.526 30.000 5.000 -10.000 -5.734 16.792 20.000 5.000
0.000 2.539 27.932 30.000 5.000 -10.000 -7.110 20.822 50.000 10.000
0.000 3.149 34.636 60.000 10.000 -10.000 -8.816 25.819 50.000 10.000
0.000 3.904 42.948 60.000 10.000 -20.000 -10.932 32.016 40.000 10.000
0.000 4.841 53.256 60.000 10.000 -20.000 -13.556 39.700 40.000 10.000
0.000 6.003 66.037 120.000 20.000 -20.000 -16.810 49.228 100.000 20.000
0.000 7.444 81.886 120.000 20.000 -40.000 -20.844 61.043 80.000 20.000
0.000 9.231 101.539 120.000 20.000 -40.000 -25.846 75.693 80.000 20.000
0.000 11.446 125.908 300.000 50.000 -50.000 -32.049 93.859 250.000 50.000
0.000 14.193 156.127 300.000 50.000 -50.000 -39.741 116.385 250.000 50.000
0.000 17.600 193.597 300.000 50.000 -50.000 -49.279 144.318 250.000 50.000