Проблемы фигуры Matlab: точки полуразброса, черные линии внутри красной области - PullRequest
1 голос
/ 25 октября 2019

Рассмотрим следующую цифру в Matlab (матрицы здесь )

load matrices
%Rb, vertices_deg, vertices_comp

close all
patch([0 0 1],[0 1 0],[1 0 0],[0.8 0.8 0.8]);
axis equal 
axis([0 1 0 1 0 1])
view(120,30)
hold on

T = delaunayTriangulation(Rb.');
K = convexHull(T);
patch('Faces',K,'Vertices',T.Points,'FaceColor','k','edgecolor','k');
hold on

scatter3(vertices_deg(:,1), vertices_deg(:,2) , vertices_deg(:,3),100,'o','filled','b')
hold on

patch(vertices_comp(:,1), vertices_comp(:,2) , vertices_comp(:,3),'red')
hold off

xlim([0 1])
ylim([0 1])
zlim([0,1])
box on
set(gca, 'ytick',0:0.2:1,'xtick',0:0.2:1,'ztick',0:0.2:1,'FontSize',13)

Я хотел бы сохранить эту фигуру таким образом, чтобы:

  • внутри красной области, я не вижу черных линий, которые я вижу в выводе Matlab

  • точка рассеяния blu - это полный круг (а не полукруг, каконо появляется в выходных данных Matlab)

Я пробовал два способа сохранения рисунка

saveas(gcf,'3.jpg')
print(gcf, '3.jpg', '-dpng', '-r300', '-painters') 

Ни один из этих двух способов не дает мне то, что я хочу. Не могли бы вы помочь?

Это то, что я получаю с PRINT enter image description here

Это то, что я получаю с SAVEAS enter image description here

А вот и скриншот окна Matlab enter image description here

1 Ответ

4 голосов
/ 25 октября 2019

Проблема, которую вы видите, заключается в том, что патчи наносятся на одну и ту же плоскость, что вызывает эффект рендеринга. Это называется Z-fight .

Простое решение - добавить небольшое смещение к некоторым плоскостям, нарисованным перед остальными. Вы можете изменять это значение до тех пор, пока эффект не исчезнет, ​​а ошибка с отступом будет минимальной.

load matrices

close all
patch([0 0 1],[0 1 0],[1 0 0],[0.8 0.8 0.8]);
axis equal 
axis([0 1 0 1 0 1])
view(120,30)
hold on

T = delaunayTriangulation(Rb.');
K = convexHull(T);

d_patch = 0.001;
d_z = 0.01;

patch('Faces',K,'Vertices',T.Points + d_patch,'FaceColor','k','edgecolor','k');
patch(vertices_comp(:,1), vertices_comp(:,2) , vertices_comp(:,3)+d_z,'red')

scatter3(vertices_deg(:,1), vertices_deg(:,2) , vertices_deg(:,3),100,'o','filled','r')
scatter3(vertices_deg(:,1), vertices_deg(:,2) , vertices_deg(:,3)+2*d_z,100,'o','filled','b')

xlim([0 1])
ylim([0 1])
zlim([0,1])
box on
set(gca, 'ytick',0:0.2:1,'xtick',0:0.2:1,'ztick',0:0.2:1,'FontSize',13)

saveas(gcf,'3saveas.png')
print(gcf, '3print.png', '-dpng', '-r300', '-painters') 

Вы можете сделать то же самое для синей точки, которая частично нарисована на плоскости. Просто дайте ему небольшое смещение, и оно снова появится в виде полной точки. Я нарисовал точку красным и синим, чтобы вы могли видеть смещение по местоположению.

enter image description here

...