Algorithm 二维参考转换算法
我正在尝试建立一个函数图示器 用户输入xmin、xmax、ymin、ymax和function。 我得到了所有点的x,y 现在我想将这个初始引用转换为画布,从0,0开始直到 250250 有近路吗?还是我去看看Algorithm 二维参考转换算法,algorithm,math,referential,Algorithm,Math,Referential,我正在尝试建立一个函数图示器 用户输入xmin、xmax、ymin、ymax和function。 我得到了所有点的x,y 现在我想将这个初始引用转换为画布,从0,0开始直到 250250 有近路吗?还是我去看看 if x < 0 new x = (x - xmin) * (250 / (xmax - xmin)) ? 如果x
if x < 0
new x = (x - xmin) * (250 / (xmax - xmin)) ?
如果x<0
新x=(x-xmin)*(250/(xmax-xmin))?
等等
此外,这种基本方法不能优化采样。
例如,如果我的函数f(x)=5,我不需要在500点内对xrange进行采样,
我只需要两点。我可以做一些启发式检查
但是对于像sin(2/x)这样的函数,我需要在x(-1,1)附近进行更多的采样,您如何处理这样的事情
谢谢
我想我会从从画布到数学上下文的转换开始对此进行推理
(canvas_x, canvas_y) -> (maths_x, maths_y)
(maths_x, maths_y) -> (canvas_x, canvas_y)
maths_x -> maths_y
在画布上循环显示的点上迭代
这将转化为一些简单的功能:
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
示例是一个很好的示例,但可以保证您不会采样到超出显示范围的内容。与其在原始坐标中迭代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)
}
for(int xcanvas=0;xcanvas)采样部分如何?这只对每个像素进行一次采样,对于大多数函数来说应该足够了。您可以动态检查画布相邻列中的相邻像素,看看它们是否相距很远,如果需要,可以添加更多采样。