在MATLAB中使用OpenGL渲染器的错误图

时间:2015-04-01 22:04:48

标签: matlab opengl render floating-point-precision

我试图使用OpenGL在图表上绘制大量数据。我想使用这个渲染器,因为它是唯一支持透明度的渲染器。数据正在精确绘制,但是一旦放大连接数据点的线条就不能正确排列,如下所示:enter image description here 我已经测试过使用Painters和Zbuffer绘制数据,并且当放大相同数量时,这些线正确连接数据。这是Zbuffer生成的(Painters看起来完全相同,但网格线较重):enter image description here

您可以使用以下代码重新创建问题。请注意,这并未创建与所示完全相同的绘图,但仍清楚地说明了问题。

t = [735480.784722222 735480.826388889 735480.868055556 735480.909722222 735480.951388889 735481 735481.034722222 735481.076388889 735481.118055556 735481.159722222 735481.201388889 735481.243055556 735481.284722222 735481.326388889 735481.368055556 735481.409722222 735481.451388889 735481.493055556 735481.5 735481.534722222 735481.576388889];
d = [10.0799999237061 10.0799999237061 10.0799999237061 10.0699996948242 10.0699996948242 10.0799999237061 10.0699996948242 10.0699996948242 10.0699996948242 10.0699996948242 10.0699996948242 10.0600004196167 10.0600004196167 10.0600004196167 10.0699996948242 10.0699996948242 10.0600004196167 10.0600004196167 10.0600004196167 10.0600004196167 10.0500001907349];
figure;
plot(t, d, '.-');
set(gcf, 'renderer', 'opengl');

1 个答案:

答案 0 :(得分:1)

我在 MathWorks支持团队响应的 MATLAB Answers 上找到了similar question

  

OpenGL渲染器仅使用单精度。结果,和   正在绘制的数字无法使用   OpenGL的。 Painters和ZBuffer渲染器使用双精度[...]

您提供的数据精度高于单精度浮点数所表示的精度。因此它无法正常显示。

解决方法可能是真正只绘制数据的最低有效数字(例如通过减去前导数字)并使用XTick / YTickXTickLabel / { {1}}绘图的属性以获取正确的轴刻度标签。在你的情况下,这样的事情就足够了:

YTickLabel