1

我正在尝试构建一个函数绘图器,

用户输入 xmin, xmax, ymin, ymax, 函数。我得到了所有点的x,y。

现在我想将此初始引用翻译为从 0,0 到 250,250 的画布。

有没有捷径,或者我应该检查一下

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

ETC ..

此外,这种基本方法不会优化采样。例如,如果我的函数 f(x) = 5 我不需要在 500 个点中对 xrange 进行采样,我只需要两个点。我可以做一些启发式检查。

但是对于像 sin(2/x) 这样的函数,我需要围绕 x (-1,1) 进行更多采样,你将如何处理这样的事情?

谢谢

4

3 回答 3

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)
}

这为画布的每一列提供了一个函数评估。

于 2008-12-05T17:39:29.613 回答
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是一个很好的例子,但你可以保证不会采样超过你可以显示的。

于 2008-12-05T13:08:25.373 回答
0
  1. 您可以估计导数(如果有的话)。
  2. 您可以使用双向(二分法)方法:估计差异并在必要时拆分段。
于 2008-12-05T12:40:15.583 回答