Creo que se puede hacer algo como esto (precaución - código compilado cerebro ...)
figure;
patch('faces', edges, 'vertices', points, 'edgecolor', 'b');
axis equal;
Dónde edges
debe ser una matriz de índices Nx2
y points
debe ser una matriz de coordenadas Mx3
(la transposición de su matriz points
).
Desde mi experiencia, llamar directamente al patch
puede ser significativamente más rápido que las llamadas repetidas al plot
.
Para dar una idea, los tiempos para generar 1.000 segmentos de línea generados al azar, usando mi MATLAB 7.1 son los siguientes (la verdad de edad!):
- Calling
patch
: 0,03 segundos.
- Llamando
plot
: 0.5 segundos.
EDITAR: Una forma de obtener el comportarse color del borde que desee (la especificación de un solo color por filo) es introducir vértices duplicados de la siguiente manera:
Esto funciona-en torno a la cuestión de que el borde el color solo puede especificarse indirectamente a través de datos de color de vértices. Si tuviéramos que confiar únicamente en los colores de los vértices, entonces todos los bordes que comparten un vértice común podrían terminar con el color asignado a ese vértice: consulte 'plano' edgecolour descripción 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
Sería mejor si MATLAB permite especificar directamente los datos de color de borde - pero no parecen apoyar que ...
Espero que esto ayude.
Gracias! ¿Existe la posibilidad de que también me muestres cómo puedo enviar una matriz de colores para que cada borde tenga un color diferente? – olamundo
@noam: hay algunas opciones de color diferentes, dependiendo de lo que desee. Puede usar el parámetro ''facevertexcdata'' para establecer colores interpolados a partir de los vértices, escriba' edit trimesh' para obtener una idea en esta línea. Si solo quieres unos pocos colores planos (''b ',' k ','r', etc.') supongo que podrías dividir los bordes en unos pocos grupos diferentes y elegir un solo color para cada grupo, supongo Aquí tienes muchos más bordes que colores. Puede haber otras opciones - verifique la documentación ... –
De hecho necesito colorear cada borde con un color diferente, de muchos colores (digamos que estoy mostrando la tensión ejercida sobre todos los haces de soporte de alguna estructura). Por lo tanto, debo especificar el color por el borde, no por el vértice, y no puedo dividir los bordes en varios grupos diferentes, ya que hay muchos colores ... – olamundo