【问题标题】:Incorrect plots using OpenGL renderer in MATLAB在 MATLAB 中使用 OpenGL 渲染器的绘图不正确
【发布时间】:2015-04-01 22:04:48
【问题描述】:

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

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

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');

【问题讨论】:

  • 如果您能提供重现问题的代码将会很有帮助。否则我们只是在黑暗中蹒跚而行。
  • @knedlsepp - 完成,请参阅相关示例。
  • 这很奇怪。我的 R2014a 也有同样的问题。似乎有一个涉及双/单精度的错误。我想与此同时,您可以通过从 x 值中减去 735480 来解决...

标签: matlab opengl render floating-point-precision


【解决方案1】:

我在 MATLAB Answers 上找到了 similar questionMathWorks 支持团队 对此做出了回应:

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

您提供的数据比单精度浮点数表示的精度更高。因此它不会正确显示。

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

LSD = @(x) x-single(x(1));
plot(LSD(t), LSD(d), '.-');

【讨论】:

  • 这是渲染器之间的一个有趣的区别。必须解决不是一件好事......但至少有一个解决方法!感谢您的帮助。
  • @b3.: 是的,绝对不是一件好事。最奇怪的是,这些点被绘制在正确的位置,但线条却不是。
猜你喜欢
  • 1970-01-01
  • 2016-02-14
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多