Algorithm 二维参考转换算法

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

我正在尝试建立一个函数图示器

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

现在我想将这个初始引用转换为画布,从0,0开始直到 250250

有近路吗?还是我去看看

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)采样部分如何?这只对每个像素进行一次采样,对于大多数函数来说应该足够了。您可以动态检查画布相邻列中的相邻像素,看看它们是否相距很远,如果需要,可以添加更多采样。