gpt4 book ai didi

matlab - 在 MATLAB 2014b 及更高版本中使用画家渲染器的三角形分割补丁

转载 作者:太空宇宙 更新时间:2023-11-03 19:36:54 25 4
gpt4 key购买 nike

MATLAB 的新图形引擎 HG2 无法使用 painters 渲染器正确打印补丁:

hist(randn(1,1000)); 
colorbar('Location','SouthOutside');
print('test.pdf','-dpdf');

生成的补丁,无论是由 hist 还是 colorbar 生成的,都有三角形分割:

Triangular splits in patches

该问题已在 MATLAB Central here 上讨论过和 here ,建议禁用 pdf-viewer 中的“平滑线条艺术”选项应该解决它。这在某些阅读器中隐藏了问题(例如,在 Adob​​e Reader 中,但在 Apple Preview 中没有),但是要求协作者和读者使用具有非默认设置的特定 pdf 查看器来正确显示图形几乎不是解决方案。在 Inkscape 中查看生成的文件,很明显分割存在于输出矢量图形中。在这里,我移动了一半的颜色条,证明它实际上被分成两半,而不仅仅是被 pdf-viewer 误解:

enter image description here

使用 OpenGL 渲染器时不存在问题(print('test.pdf','-opengl'),但输出未矢量化)。该问题在 MATLAB 2015a 中仍然存在。

有没有办法在 MATLAB 2014b 或更高版本中导出无伪影矢量图形?

最佳答案

在解决实际问题之前,这是一个有问题的解决方法:

对角线只是三角形之间的空白空间,所以我们看到的是可以透过的补丁后面的空白空间。 愚蠢的想法:让我们用匹配的颜色而不是白色填充该空间。

为此,我们将复制所有对象并将新对象偏移一点点。

代码:

hist(randn(1,1000));
colorbar('Location','SouthOutside');
print('test.pdf','-dpdf'); %// print original for comparison

f1 = gcf;
g = get(f1,'children');
n = length(g);
copyobj(g,f1); %// copy all figure children

复制的对象现在是 2*n f1.Children 数组中的前 n 个元素。它们正好位于旧对象的之上

g=get(f1,'children');
for i=1:n;
if strcmpi(g(i).Type,'axes');
set(g(i),'color','none','position',g(i).Position+[0.0001 0 0 0]);
set(g(i+n),'position',g(i+n).Position); %// important!
end;
end;
print('test2.pdf','-dpdf');

解释:

g = get(f1,'children'); 获取当前图形中的所有轴、颜色条等。

colorbar 对象链接到一个轴,这就是为什么我们只需要移动 axes 类型的 child 。

color 设置为 none 使新轴的背景透明(因为它们位于旧轴之上)。

g(i).Position+[0.0001 0 0 0] 将新轴向右移动 0.0001 个标准化单位。

set(g(i+n),'position',g(i+n).Position); 这一行似乎是不必要的,但下面的最后一张图片显示了如果你打印时会发生什么不要包含它。

根据您绘制的图形对象的类型,您可能需要调整它以满足您自己的需要,但如果您只有颜色条和轴对象,则此代码应该有效。

原文:

original

黑客攻击:

enter image description here

没有 %//important! 行:

enter image description here

关于matlab - 在 MATLAB 2014b 及更高版本中使用画家渲染器的三角形分割补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30870613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com