myślę, że można zrobić coś takiego (uwaga - mózg skompilowany kod ...)
figure;
patch('faces', edges, 'vertices', points, 'edgecolor', 'b');
axis equal;
Gdzie edges
powinna być macierzą indeksów Nx2
i points
powinna być macierzą współrzędnych Mx3
(transpozycja macierzy points
).
Z mojego doświadczenia wynika, że dzwonienie pod numer patch
może być znacznie szybsze niż wielokrotne połączenia z numerem plot
.
Aby dać pewne wyobrażenie, czasy wygenerować 1000 losowo wygenerowanych segmenty linii, wykorzystując mój MATLAB 7.1 przedstawiają się następująco (co prawda stary!):
- Wywołanie
patch
: 0.03 sekund.
- Wywołanie
plot
: 0,5 sekundy.
EDIT: Jednym ze sposobów, aby uzyskać zachowuje kolor krawędzi, jak chcesz (określenia pojedynczego koloru na krawędzi) jest wprowadzenie zduplikowane wierzchołki następująco:
Działa wokół problemu, który krawędzi kolor może być określony pośrednio poprzez dane koloru wierzchołków. Gdybyśmy polegali tylko na kolorach wierzchołków, wówczas wszystkie krawędzie dzielące wspólny wierzchołek mogą kończyć się kolorem przypisanym do tego wierzchołka - sprawdź "płaski" edgecolour opis:.
%% 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
Byłoby ładniej jeśli MATLAB pozwalał bezpośrednio podać dane koloru krawędzi - ale to nie wydają się potwierdzać, że ...
nadzieję, że to pomaga.
Dzięki! Czy jest szansa, że możesz mi pokazać, w jaki sposób mogę wysłać tablicę kolorów, aby każda krawędź była zabarwiona innym kolorem? – olamundo
@ nnoam: Istnieje kilka różnych opcji kolorowania, w zależności od tego, co chcesz. Możesz użyć parametru ''facevertexcdata'', aby ustawić interpolowane kolory z wierzchołków - wpisz' edit trimesh', aby uzyskać pomysł wzdłuż tych linii. Jeśli chciałeś tylko kilku płaskich kolorów ("b", "k", "r", itp.), To możesz podzielić krawędzie na kilka różnych grup i wybrać jeden kolor dla każdej grupy - zakładam tutaj masz o wiele więcej krawędzi niż kolorów. Mogą istnieć inne opcje - sprawdź dokumentację ... –
Rzeczywiście muszę pokolorować każdą krawędź innym kolorem, z wielu kolorów (Powiedz, że pokazuję naprężenie wywierane na wszystkie belki wsporcze jakiejś struktury). Więc muszę określić kolor po krawędzi, a nie po wierzchołku, i nie mogę podzielić krawędzi na kilka różnych grup, ponieważ jest wiele kolorów ... – olamundo