【问题标题】:How to avoid curved corners in rectangular patch element in matlab figure?如何避免matlab图中矩形补丁元素中的弯角?
【发布时间】:2013-08-05 20:39:16
【问题描述】:

当我在 matlab 图形中生成一组矩形补丁时,一些矩形边缘被渲染为弯曲或剪裁而不是锐利,这是不需要的。这取决于比例,放大图像往往会消除效果。我认为这可能与混叠/压缩效果有关。奇怪的是,使用rectangle 问题似乎消失了。

这是一个中间放大问题的示例(其他问题,例如不应该存在的虚线边框也很明显):

代码来自另一个question的答案:

H=Hadamard(48); %# now to row-double the matrix 
A=(1+H)/2;
B=(1-H)/2;
C=[A; B]; %# the code below randomly permutes elements within the rows of the matrix 
[nRows,nCols] = size(C); 
[junk,idx] = sort(rand(nRows,nCols),2); %# convert column indices into linear indices 
idx = (idx-1)*nRows + ndgrid(1:nRows,1:nCols); %# rearrange whatever matrix 
E = C; 
E(:) = E(idx);
[X Y] = find(logical(E));
xl = length(X);
yl = length(Y);
figure, hold on
for ii=1:xl
     patch(X(ii) + [0 0 1 1],Y(ii) + [0.15 0.9 0.9 0.1],[1 1 1],'Edgecolor',[1 1 1])
end
axis([0 max(X)+1 0 max(Y)+1])
axis('square')
set(gca,'color',[0 0 0])
set(gca,'XTickLabel',[],'YTickLabel',[],'XTick',[],'YTick',[])

我的问题是: (1) 在用于在屏幕上显示整个图形的低到中等放大倍率下,是否有可能(以及如何)消除所示示例中看到的补丁对象的弯曲角和其他故障。 (2) 最重要的是能够生成缺少弯角的图像文件(jpg、png、pdf...)。我研究过的所有格式似乎都可以保留不需要的效果。回答 2 使回答 (1) 本质上不重要,回答 (1) 大概解决了 (2)。

编辑

既然使用rectangle后问题就消失了,这似乎是matlab渲染引擎的问题?注意:该示例是使用 R14 生成的,但链接到的问题的 OP 存在类似问题(matlab 版本未知)。

我查看了可用于补丁对象的各种照明和边缘表示选项,但没有观察到任何改进。

【问题讨论】:

  • 根据经验,我可以告诉您,使用基于 patch 的 3-D 对象解决方案而不是简单地构建具有整数像素的新图像会遇到烦人的问题。你会发现有各种各样的舍入问题,一些本应相同的尺寸最终却不是这样,而且你的补丁在不同的大小和放大时看起来不同。矢量图形很难。
  • @horchler 没有过多关注 3D 图形,我后来才意识到补丁对象专门用于 3D 渲染。同样,这可能是 matlab 版本限制,但是查看文档似乎没有很多用于绘制 2D 多边形的选择,并且补丁的 2D 应用程序遍布文档。我错过了什么(还是因为我的旧 matlab 版本)?
  • 而且 mathworks 不是一家小公司。补丁样式的图形在最近的版本中有很大改进吗?
  • 这些东西的核心都是 OpenGL(或类似的)。问题不是真正的 2-D vs。这里是 3-D(虽然那里有很多错误/问题),但是矢量与光栅。
  • 事后我应该补充一点,除了rectangle,还有fill,它创建了一个patch 对象。

标签: matlab graphics rendering


【解决方案1】:

这个问题很可能是重复的,例如,here 提出了类似的问题。

答案似乎是在绘制矩形时避免显式使用patch。请改用fill 或仅使用rectangle。据我所知,以下生成图形的方法提供了几乎相同的结果:

load had.mat % <-- load the data containing the matrix of interest in array E
[X Y] = find(logical(E));
xl = length(X);
yl = length(Y);
figure, hold on
for ii=1:xl
      rectangle('Position',[X(ii) Y(ii)+.2 1 0.8],'facecolor',[1 1 1],'edgecolor',[1 1 1])
%     fill([X(ii) X(ii) X(ii)+1 X(ii)+1], [Y(ii)+0.2 Y(ii)+0.8 Y(ii)+0.8 Y(ii)+0.2],[1 1 1],'edgecolor',[1 1 1],'marker','.','markersize',1)
end
set(gca,'color',[0 0 0])
set(gca,'XTickLabel',[],'YTickLabel',[],'XTick',[],'YTick',[])
set(gcf,'Renderer','zbuffer')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多