绘制非常大的2d图的问题

时间:2017-03-21 18:16:49

标签: c++ graph floating-point precision floating-accuracy

需要绘制一个由10^3组成的二维图形(实际上可以达到5*10^6个),这些点在一个具有非常高精度的文件中给出

样本点:

          x               y = f(x)
-----------------------------------------
0.0000000000000e+000 9.9453146383711e+006
1.0107375000000e-002 1.0053545400632e+007
2.0211374000000e-002 9.9475746573179e+006
3.0315250000000e-002 1.0051184341654e+007
4.0418752000000e-002 9.9500284997072e+006
5.0525375000000e-002 1.0048588691478e+007
6.0629874000000e-002 9.9527328766918e+006
7.0733748000000e-002 1.0045819834233e+007
8.0837503000000e-002 9.9556071710602e+006
...

因为可以注意到x, and f(x)处于一个非常不舒适的范围内,因此,

我编写了一个函数,将它们从一个范围[a, b]转换为另一个[c, d],以便在具有特定维度(w=780和{{1}的矩形区域中绘制整个图形})

h=550

但是在转换之后,失去了巨大的准确性......我得到了这种值,在绘图后产生了一条直线水平线(而不是曲线)..

// mapping x from [a, b] to [c, d]
qreal Graph::mapTo(qreal x, qreal a, qreal b, qreal c, qreal d)
{
    qreal denom = b - a;

    if (denom != 0.0f)
    {
        return (x - a)*(d - c)/denom + c;
    }

    return 0.0f;
}
//...
qreal x1 = mapTo(points[i].x(), 0, maxX, 0, w);
qreal y1 = mapTo(points[i].y(), minY, maxY, 0, h);

qreal x2 = mapTo(points[i+1].x(), 0, maxX, 0, w);
qreal y2 = mapTo(points[i+1].y(), minY, maxY, 0, h);

我知道有些实数不能用计算机中的x = 0 y = 549.453 x = 0.762673 y = 549.447 x = 1.52509 y = 549.453 x = 2.2875 y = 549.447 x = 3.04988 y = 549.453 x = 3.8125 y = 549.447 x = 4.57496 y = 549.453 x = 5.33736 y = 549.447 x = 6.09976 y = 549.452 算术表示,但在这种情况下,似乎floating point值丢失了太多精确度不是吗?

我做错了什么导致了这些价值观?

在这种情况下,我应该使用哪些算法来保存数学运算之间的准确度?

1 个答案:

答案 0 :(得分:0)

至少找到了为y

提供这种无效结果的原因

需要为minY找到maxYy以正确地将它们映射到范围[0, h] - 修复此图形后看起来更像是2D图形一些功能。

现在又出现了另一个问题:如果点数很高(100万)渲染速度很慢......