2008-12-06 68 views
2

我想弄清楚下面的問題。 我正在建設另一個數學函數grapher,該函數繪製在其預定義的x,y範圍內,這一切都很好。滴答功能繪圖儀

現在我正在處理X,Y軸的背景和滴答聲(如果顯示任何軸)。

我制定了以下內容。 我的固定寬度爲250 p 刻度線間隔應在12.5至50p之間。

蜱應表明單位或半單位範圍,我的意思是以下幾點。

x量程(-5,5):一個刻度= 1個

x量程(-1,1):一個刻度= 0.5或0.1,具體取決於各該選項將產生的間隙。

X系列(0.1 0.3):0.05

給出一個XRANGE 你將如何得到完全或半單位範圍之間的刻度數?

或者也許還有其他方法來解決這類問題。

回答

4

做到這一點的一種方法是「標準化」最小值和最大值之間的差異,並對該值進行區分。在python中:

delta = maximum - minimum 
factor = 10**math.ceil(math.log(delta,10)) # smallest power of 10 greater than delta 
normalised_delta = delta/factor   # 0.1 <= normalised_delta < 1 
if normalised_delta/5 >= 0.1: 
    step_size = 0.1 
elif normalised_delta/5 >= 0.05: 
    step_size = 0.05 
elif normalised_delta/20 <= 0.01: 
    step_size = 0.01 
step_size = step_size * factor 

上面的代碼假設你想要儘可能大的差距。對於最小的,你可以使用以下,如果:

if normalised_delta/20 == 0.005: 
    step_size = 0.005 
elif normalised_delta/20 <= 0.01: 
    step_size = 0.01 
elif normalised_delta/5 >= 0.05: 
    step_size = 0.05 

除了可能有不止一個合適的值,也有點令人擔憂的可能性,有沒有。以範圍[0,24]爲例,其中12.5p的間隔將給出1.2的步長,而50p的間隙將給出步長4.8。中間沒有「單位」或「半個單位」。問題在於12.5p和50p之間的差距是因子4,而0.01和0.05之間的差異是因子5.因此,您必須稍微擴大可允許的間隔範圍並相應地調整代碼。

澄清一些幻數:20和5的分別對應分別具有最小和最大間隙大小的段數(即250/12.5和250/50)。由於標準化差值在[0.1,1)範圍內,因此可以將它除以20和5分別給出[0.005,0.05)和[0.02,0.2)。這些範圍導致第一範圍可能的(標準化)步長爲0.005和0.01,第二範圍爲0.05和0.1。

+0

謝謝!因子= 10 ** math.ceil(math.log(delta,10))做了tric! – coulix 2008-12-07 09:36:48

0

使用DELTAX

如果DELTAX和 之間2 10個半增量如果要是小於2 20 DELTAX之間10和單位增量 我們乘以10再測試 如果大於20我們把 然後我們得到第一個單位或半個增量的位置在寬度上使用xmin。

我仍然需要測試這個解決方案。

0

你可能想看看Jgraph,它解決了一個互補的問題:它是一個數據繪圖器而不是函數繪圖器。但是有很多共同點,例如處理主要和次要的刻度線,軸標籤等等。我發現輸入語言對我來說有點冗長,但Jgraph生成非常好的技術圖。網站上有很多例子,可能有些好主意可以偷取。

你知道他們在說什麼:人才模仿,但天才偷:-)

0

這似乎做什麼我期待。

進口數學

高清的main(): getTickGap(-1,1.5)

高清next_multiple(X,Y): 回報math.ceil(X/Y)* Y

DEF getTickGap(XMIN,XMAX): xdelta = XMAX -xmin 寬度= 250 #最小的10大於δ 因子= 10 ** math.ceil(math.log(xdelta,10)) #0.1更大的功率< =正常化d_delta normalised_delta = xdelta /因子 打印( 「normalised_delta」,normalised_delta)

# we want largest gap 
if normalised_delta/4 >= 0.1: 
    step_size = 0.1 
elif normalised_delta/4 >= 0.05: 
    step_size = 0.05 
elif normalised_delta/20 <= 0.01: 
    step_size = 0.01 
step_size = step_size * factor 


## if normalised_delta/20 == 0.005: 
##  step_size = 0.005 
## elif normalised_delta/20 <= 0.01: 
##  step_size = 0.01 
## elif normalised_delta/4 >= 0.05: 
##  step_size = 0.05 
## step_size = step_size * factor 
print("step_size", step_size) 
totalsteps = xdelta/step_size 
print("Total steps", totalsteps) 
print("Range [", xmin, ",", xmax, "]") 

firstInc = next_multiple(xmin, step_size) 
count = (250/xdelta)*(firstInc - xmin) 
print("firstInc ", firstInc, 'tick at ', count) 
print("start at ", firstInc - xmin, (width/totalsteps)*(firstInc - xmin)) 
inc = firstInc 

while (inc <xmax): 
    inc += step_size 
    count += (width/totalsteps) 
    print(" inc", inc, "tick at ", count) 

如果名稱 == 「」: 主()

0

在範圍-1, 0

我得到

normalised_delta 1.0 
step_size 0.1 
Total steps 10.0 
Range [ -1 , 0 ] 
firstInc -1.0 tick at 0.0 
start at 0.0 0.0 
inc -0.9 tick at 25.0 
inc -0.8 tick at 50.0 
inc -0.7 tick at 75.0 
inc -0.6 tick at 100.0 
inc -0.5 tick at 125.0 
inc -0.4 tick at 150.0 
inc -0.3 tick at 175.0 
inc -0.2 tick at 200.0 
inc -0.1 tick at 225.0 
inc -1.38777878078e-16 tick at 250.0 
inc 0.1 tick at 275.0 

底部的第二行怎麼會得到這個數字?

+0

這是由於計算機上浮點數和操作的不準確性。具體而言,0.1沒有精確的表示,並且+您繼續添加錯誤。如果您使用-1.0 + 9 * 0.1,則誤差要小得多。 (見http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems) – mweerden 2008-12-15 17:39:54