Ansi C重新评估Y坐标

时间:2014-01-04 18:53:31

标签: c graph coordinates ansi

我试图从评估的数学函数做一个图表,这是我认为我需要做的。我的图表的极限坐标为-250:-250,向上为250:250。我有Y-limit函数,定义为-10:10,但它可以是用户重新定义的,如果重新定义,我需要计算新的坐标。

我现在有了200个值的y坐标字段,每个值乘以: ratioY = 25 / (fabs( up-limit - down-limit ) / 20)这将使坐标适应新的Y限制(如果限制为-5:5,图形看起来大2倍),这效果很好,但现在不是图形确切的位置(见图片)。简单地将25乘以postscript坐标,(up-limit - down-limit) / 20是“缩放”Y坐标的比率。这很好。

现在我试图“移动坐标”,它将从重新评估的值中减去: ycoor = (ycoor * ratioY) - move-coorY ;

现在我有这样的事情: move-coorY = 25 *((上限 - 下限)/ 2); 它无法正常工作。我需要犯罪(0)从0开始。

这是一个正确的图表,即-10:10

correct one -10:10 http://forum.matematika.cz/upload3/img/2014-01/59348_Screenshot_1.png

这是一个错误的图表,为-5:10

moved one -5:10 http://forum.matematika.cz/upload3/img/2014-01/59372_Screenshot_2.png

2 个答案:

答案 0 :(得分:2)

使用固定数字(例如ratioY)但使用两个不同的坐标系可能更容易不这样做。 物理坐标位于您的问题域中,即它们是您的正弦曲线的实际值。 逻辑坐标是指设备,在您的情况下它们是Postscript中的点值,但它们可能是HTML画布上的像素或其他任何内容。

我用小x表示第一轴的物理坐标,用大写X表示相应的逻辑坐标。在每个坐标系中我们都有:

Lower bound:    x_min, X_max
Upper bound:    x_max, X_max
Range:          dx = x_max - x_min
                dX = X_max - X_min

然后你可以从物理坐标计算你的逻辑坐标:

X(x) = X_min + (x - x_min) * dX / dx

这反过来也是如此,这对于Postscript文件来说不是问题,但是对于虚拟画布来说,max最有用,其中鼠标点击应该产生物理坐标。

x(X) = x_min + (X - X_min) * dx / dX

在您的情况下,比率或比例因子为dX / dx,您可以为每个轴计算一次。让我们在第一张图中用y == 0绘制第一个点:

y_min = -10
y_max = 10
   dy = 20

Y_min = -250
Y_max = 250
   dX = 500

 Y(0) = -250 + (0 - (-10)) * 500 / 20
      = -250 + 10 * 500 / 20
      = 0

在第二张图中,逻辑坐标相同,但是:

y_min = -5
y_max = 10
   dy = 15

 Y(0) = -250 + (0 - (-5)) * 500 / 15
      = -250 + 5 * 500 / 15
      = -83.3333

如果您更改图表的范围,例如从(-10,10)到(-5,10),只需调整物理坐标即可。如果调整图形大小,请更改逻辑坐标。 (另外,计算图中的点与计算轴的刻度线的位置相同。奇怪的是,你得到了刻度线,但不是你的图。我认为你的问题是要考虑到非零值图形和曲线数据的下限。)

此外,在打印时重新评估逻辑坐标可能更好,而不是从之前的图中转换它们。您可以动态执行此操作,这样您只需将物理数据保存在数组中即可。

(最后,我承认我并不完全确定这两种穹顶被称为物理逻辑。我知道这些使用的是术语,但它可能是相反的,或者它们甚至可能意味着完全不同。)

答案 1 :(得分:0)

我的朋友为我做了一个好的yob并编程了这个......

    double zeroPosition(double startY, double endY){ 
        double range = endY - startY; 
        double topSize = endY / range; 
        return 250.0 - 500 * topSize; 
    }

这将计算零的位置,我只是按比例添加到我的Y位置,它正是我需要的工作方式!

但是,谢谢M Oehm;)