2008-12-05 51 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