Я думаю, что вы можете сделать что-то вроде этого (осторожно - скомпилированный мозгом код ...)
figure;
patch('faces', edges, 'vertices', points, 'edgecolor', 'b');
axis equal;
Где edges
должно быть Nx2
матрицей индексов, а points
должно бытьMx3
матрица координат (транспонирование вашего points
массива).
По моему опыту, прямой вызов patch
может быть значительно быстрее, чем повторные вызовы plot
.
Чтобы дать некоторое представление, время для генерации 1000 случайно сгенерированных отрезков линии с использованием моего (по общему признанию старого) MATLAB 7.1 выглядит следующим образом:
- Вызов
patch
: 0,03 секунды. - Вызов
plot
: 0,5 секунды.
РЕДАКТИРОВАНИЕ : Один из способов заставить цвет ребра вести себя так, как вы хотите (указав один цвет для ребра), - ввести дубликаты вершинследующим образом:
Это обходит проблему, заключающуюся в том, что цвет края может быть задан только косвенно через данные цвета вершины.Если бы мы полагались только на цвета вершин, то все ребра, разделяющие общую вершину, могли бы в конечном итоге получить цвет, назначенный этой вершине - посмотрите 'flat' edgecolour description here .
%% a "star" shape, so that we can really see what's going on
%% with the edge colours!!
pp = [0,0,0; 1,-1,0; 1,1,0; -1,1,0; -1,-1,0];
ee = [1,2; 1,3; 1,4; 1,5];
%% important - only 1 colour known per edge, not per vertex!!
cc = (1:size(ee,1))';
%% setup a new set of vertices/edges/colours with duplicate vertices
%% so that each edge gets it's correct colour
nnum = 0;
pnew = zeros(2 * size(ee, 1), 3); %% new vertices
enew = zeros(1 * size(ee, 1), 2); %% new edge indices
cnew = zeros(2 * size(ee, 1), 1); %% new edge colours - via vertices
for j = 1 : size(ee, 1)
n1 = ee(j, 1); %% old edge indices
n2 = ee(j, 2);
enew(j, 1) = nnum + 1; %% new edge indicies into pnew
enew(j, 2) = nnum + 2;
pnew(nnum + 1, :) = pp(n1, :); %% create duplicate vertices
pnew(nnum + 2, :) = pp(n2, :);
cnew(nnum + 1) = cc(j); %% map single edge colour onto both vertices
cnew(nnum + 2) = cc(j);
nnum = nnum + 2;
end
%% Draw the set efficiently via patch
tic
figure;
hold on;
patch('faces', enew, 'vertices', pnew, 'facevertexcdata', cnew, ...
'edgecolor', 'flat', 'facecolor', 'none');
plot(pnew(:,1), pnew(:,2), 'b.');
axis equal;
toc
Было бы лучше, если бы MATLAB позволял вам напрямую указывать данные о цвете кромки - но, похоже, это не поддерживает ...
Надеюсь, это поможет.