2010-10-27 38 views
2

我有一個圖形,由函數生成,它根據函數的值自動放大和縮小。我已經有了繪圖工具,我可以在高分辨率下顯示任何x,y,寬度和高度。我應該使用什麼算法來平滑放大圖形或地圖?

我試着只是捕捉到正確的位置:

x = target_x 
y = target_y 
width = target_width 
height = target_height 

但它太緊張。很難說哪部分放大/縮小。

我也試着這樣做:

orig_x = x //ditto for y, width, height, etc 
for i=1 to 10 
    x = i/10*new_x + i/10*orig_x 
    wait 25ms 

這是平滑的,但第一步還是太緊張。如果orig_x是10,new_x是100萬,那麼第一個跳躍太大,接近1,000,000%。然而,最後的跳躍只有10%。幾何級數甚至更好,但如果我必須在中間縮放時切換方向,則步驟會變得很麻煩。

什麼是最好的使用效果?

回答

0

我可能會嘗試

xDiff = new_x - orig_x 
stepCount = 10 

for i=1 to stepCount 
    x = orig_x + i/stepCount * xDiff 
    wait 25ms 
+0

此算法創建的縮放將在不同的環境中運行不同的時間量。 – 2010-10-27 16:17:58

+0

@NickLarsen,請問爲什麼? – tafa 2010-10-27 16:29:21

+0

這與我寫的相同。 – Eyal 2010-10-27 16:48:24

2

你想縮放/移位最後一個窗口的一個固定百分比的每一個步驟。這意味着你的變焦將是一個指數曲線,你的變化將與你的變焦相關聯。類似以下內容應該是一個改進:

width_ratio = new_width/old_width 
width_ratio_log = log(width_ratio) 

x_diff = new_x - old_x 
x_factor = x_diff/(width_ratio - 1) 
-- warning: need to handle width_ratio near 1 the old way! 

for i=1 to steps 
    width_factor = exp(width_ratio_log * i/steps) 
    width = old_width * width_factor 
    x = old_x + x_factor * (width_factor - 1) 

    -- similarly for y and height... 
相關問題