2008-12-05 40 views
2

我正在嘗試構建函數繪圖器,算法2D引用傳遞

用戶輸入xmin,xmax,ymin,ymax函數。 我得到了所有點的x,y。

現在我想把這個初始參考翻譯成畫布,從0,0開始到 250,250。

有一小段路或者我應該檢查

if x < 0 
new x = (x - xmin) * (250/(xmax - xmin)) ? 

等。

而且這種基本的方法不優化採樣。 例如,如果我的函數f(x)= 5我不需要在500點中採樣xrange, 我只需要兩點。我可以做一些啓發式檢查。

但是對於像sin(2/x)這樣的函數,我需要在x(-1,1)附近更多的採樣,你會怎麼做到這樣的事情?

感謝

回答

0
  1. 可以估算出衍生物(如果有的話)。
  2. 您可以使用雙向(二分法)方法:估計差異並在必要時分割段。
0

我想我會從畫布到數學上下文的轉換開始。

(canvas_x, canvas_y) -> (maths_x, maths_y) 
(maths_x, maths_y) -> (canvas_x, canvas_y) 

maths_x -> maths_y 

您遍歷canvas_x上循環顯示的點。

這將轉化爲一些簡單的功能:

maths_x = maths_x_from_canvas_x(canvas_x, min_maths_x, max_maths_x) 
maths_y = maths_y_from_maths_x(maths_x) # this is the function to be plotted. 
canvas_y = canvas_y_from_maths_y(maths_y, min_maths_y, max_maths_y) 

if (canvas_y not out of bounds) plot(canvas_x, canvas_y) 

一旦你來到這裏,這是比較簡單的寫這些簡單的功能轉換成代碼。

從這裏進行優化。

我認爲對於這種方法,您不需要知道太多關於採樣頻率的信息,因爲您以適合顯示的速率進行採樣。這不會是最佳的 - 你的y = 5的例子是一個很好的例子,但你可以保證不會比你能顯示的更多。

1

相反遍歷原座標x的,迭代畫布,然後變換回原座標:

for (int xcanvas = 0; xcanvas <= 250; i++) { 
    double x = ((xmax - xmin) * xcanvas/250.0) + xmin; 
    double y = f(x); 

    int ycanvas = 250 * (y - ymin)/(ymax - ymin) + .5; 

    // Plot (xcanvas, ycanvas) 
} 

這給你一個準確的評價功能在畫布的每個列。

+0

採樣部分怎麼樣? – Shashwat 2012-07-17 06:29:53