我正在尝试构建一个函数grapher,
用户输入xmin,xmax,ymin,ymax,function。 我得到了所有积分的x,y。
现在我想将这个初始引用转换为从0,0开始的Canvas 250250。
是否有一个简短的方法或我应该检查
if x < 0
new x = (x - xmin) * (250 / (xmax - xmin)) ?
等..
此基本方法也不优化采样。 例如,如果我的函数f(x)= 5,我不需要在500点中对xrange进行采样, 我只需要两分。我可以做一些启发式检查。
但是对于像sin(2 / x)这样的函数,我需要在x(-1,1)周围进行更多的采样,你会如何处理这样的事情?
由于
答案 0 :(得分: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)
}
这为画布的每一列提供了一个功能评估。
答案 1 :(得分:0)
答案 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
的例子就是一个很好的例子,但你可以保证不会有超出你可以显示的样本。