MATLAB Language
Tekening
Zoeken…
cirkels
De eenvoudigste optie om een cirkel te tekenen, is uiteraard de rectangle
.
%// radius
r = 2;
%// center
c = [3 3];
pos = [c-r 2*r 2*r];
rectangle('Position',pos,'Curvature',[1 1])
axis equal
maar de kromming van de rechthoek moet worden ingesteld op 1!
De position
definieert de rechthoek, de eerste twee waarden x
en y
zijn de linkeronderhoek van de rechthoek. De laatste twee waarden definiëren de breedte en hoogte van de rechthoek.
pos = [ [x y] width height ]
De linkerbenedenhoek van de cirkel - ja, deze cirkel heeft hoeken, denkbeeldig - is het middelpunt c = [3 3]
minus de straal r = 2
die [xy] = [1 1]
. Breedte en hoogte zijn gelijk aan de diameter van de cirkel, dus width = 2*r; height = width;
In het geval dat de gladheid van de bovenstaande oplossing niet voldoende is, is er geen mogelijkheid om de voor de hand liggende manier te gebruiken om een werkelijke cirkel te tekenen met behulp van trigonometrische functies .
%// number of points
n = 1000;
%// running variable
t = linspace(0,2*pi,n);
x = c(1) + r*sin(t);
y = c(2) + r*cos(t);
%// draw line
line(x,y)
%// or draw polygon if you want to fill it with color
%// fill(x,y,[1,1,1])
axis equal
pijlen
Ten eerste kan men quiver
, waarbij men niet te maken heeft met onhandige genormaliseerde cijfereenheden door middel van annotation
drawArrow = @(x,y) quiver( x(1),y(1),x(2)-x(1),y(2)-y(1),0 )
x1 = [10 30];
y1 = [10 30];
drawArrow(x1,y1); hold on
x2 = [25 15];
y2 = [15 25];
drawArrow(x2,y2)
Belangrijk is het 5e argument van quiver
: 0 dat een anders standaard schaling uitschakelt, omdat deze functie meestal wordt gebruikt om vectorvelden te plotten. (of gebruik het eigenschapwaardepaar 'AutoScale','off'
)
Men kan ook extra functies toevoegen:
drawArrow = @(x,y,varargin) quiver( x(1),y(1),x(2)-x(1),y(2)-y(1),0, varargin{:} )
drawArrow(x1,y1); hold on
drawArrow(x2,y2,'linewidth',3,'color','r')
Als verschillende pijlpunten gewenst zijn, moet men annotaties gebruiken (dit antwoord kan nuttig zijn. Hoe verander ik de pijlpuntstijl in pijlkokerplot? ).
De grootte van de pijlpunt kan worden aangepast met de eigenschap 'MaxHeadSize'
. Het is helaas niet consistent. De aslimieten moeten achteraf worden ingesteld.
x1 = [10 30];
y1 = [10 30];
drawArrow(x1,y1,{'MaxHeadSize',0.8,'Color','b','LineWidth',3}); hold on
x2 = [25 15];
y2 = [15 25];
drawArrow(x2,y2,{'MaxHeadSize',10,'Color','r','LineWidth',3}); hold on
xlim([1, 100])
ylim([1, 100])
Er is nog een tweak voor verstelbare pijlpunten:
function [ h ] = drawArrow( x,y,xlimits,ylimits,props )
xlim(xlimits)
ylim(ylimits)
h = annotation('arrow');
set(h,'parent', gca, ...
'position', [x(1),y(1),x(2)-x(1),y(2)-y(1)], ...
'HeadLength', 10, 'HeadWidth', 10, 'HeadStyle', 'cback1', ...
props{:} );
end
die je vanuit je script als volgt kunt oproepen:
drawArrow(x1,y1,[1, 100],[1, 100],{'Color','b','LineWidth',3}); hold on
drawArrow(x2,y2,[1, 100],[1, 100],{'Color','r','LineWidth',3}); hold on
Ovaal
Om een ellips te plotten, kun je de vergelijking gebruiken . Een ellips heeft een hoofd- en een onderas. Ook willen we de ellips op verschillende middelpunten kunnen plotten. Daarom schrijven we een functie waarvan de ingangen en uitgangen zijn:
Inputs:
r1,r2: major and minor axis respectively
C: center of the ellipse (cx,cy)
Output:
[x,y]: points on the circumference of the ellipse
U kunt de volgende functie gebruiken om de punten op een ellips te krijgen en vervolgens die punten te plotten.
function [x,y] = getEllipse(r1,r2,C)
beta = linspace(0,2*pi,100);
x = r1*cos(beta) - r2*sin(beta);
y = r1*cos(beta) + r2*sin(beta);
x = x + C(1,1);
y = y + C(1,2);
end
exmaple:
[x,y] = getEllipse(1,0.3,[2 3]);
plot(x,y);
Veelhoek (en)
Maak vectoren om de x- en y-locaties van hoekpunten vast te houden, voer deze in patch
.
Enkele veelhoek
X=rand(1,4); Y=rand(1,4);
h=patch(X,Y,'red');
Meerdere polygonen
De hoekpunten van elke veelhoek bezetten één kolom van elk van X
, Y
X=rand(4,3); Y=rand(4,3);
for i=2:3
X(:,i)=X(:,i)+(i-1); % create horizontal offsets for visibility
end
h=patch(X,Y,'red');
Pseudo 4D plot
Een (mxn)
matrix kan worden weergegeven door een oppervlak met behulp van surf ;
De kleur van het oppervlak wordt automatisch ingesteld als functie van de waarden in de (mxn)
-matrix. Als de kleurenkaart niet is opgegeven, wordt de standaard toegepast.
Een kleurenbalk kan worden toegevoegd om de huidige kleurenkaart weer te geven en de toewijzing van gegevenswaarden in de kleurenkaart aan te geven.
In het volgende voorbeeld wordt de z (mxn)
-matrix gegenereerd door de functie:
z=x.*y.*sin(x).*cos(y);
over het interval [-pi,pi]
. De x
en y
waarden kunnen worden gegenereerd met behulp van de meshgrid- functie en het oppervlak wordt als volgt weergegeven:
% Create a Figure
figure
% Generate the `x` and `y` values in the interval `[-pi,pi]`
[x,y] = meshgrid([-pi:.2:pi],[-pi:.2:pi]);
% Evaluate the function over the selected interval
z=x.*y.*sin(x).*cos(y);
% Use surf to plot the surface
S=surf(x,y,z);
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar
Figuur 1
Nu kan het zijn dat aanvullende informatie is gekoppeld aan de waarden van de z
matrix en deze worden opgeslagen in een andere (mxn)
-matrix
Het is mogelijk om deze aanvullende informatie aan de plot toe te voegen door de manier te wijzigen waarop het oppervlak wordt gekleurd.
Dit maakt een soort 4D-plot mogelijk: voor de 3D-weergave van het oppervlak dat wordt gegenereerd door de eerste (mxn)
-matrix, wordt de vierde dimensie weergegeven door de gegevens in de tweede (mxn)
-matrix.
Het is mogelijk om een dergelijke plot te maken door surf
met 4 input te bellen:
surf(x,y,z,C)
waarbij de parameter C
de tweede matrix is (die even groot moet zijn als z
) en wordt gebruikt om de kleur van het oppervlak te definiëren.
In het volgende voorbeeld wordt de C
matrix gegenereerd door de functie:
C=10*sin(0.5*(x.^2.+y.^2))*33;
over het interval [-pi,pi]
Het oppervlak gegenereerd door C
is
Figuur 2
Nu kunnen we surf
met vier invoer oproepen:
figure
surf(x,y,z,C)
% shading interp
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar
figuur 3
Als we figuur 1 en figuur 3 vergelijken, kunnen we opmerken dat:
- de vorm van het oppervlak komt overeen met de
z
waarden (de eerste(mxn)
matrix) - de kleur van het oppervlak (en het bereik, gegeven door de kleurenbalk) komt overeen met de
C
waarden (de eerste(mxn)
matrix)
Figuur 4
Natuurlijk is het mogelijk om z
en C
in de plot te verwisselen om de vorm van het oppervlak te krijgen die wordt gegeven door de C
matrix en de kleur die wordt gegeven door de z
matrix:
figure
surf(x,y,C,z)
% shading interp
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar
en om figuur 2 te vergelijken met figuur 4
Snelle tekening
Er zijn drie manieren om opeenvolgende plot of animaties uit te voeren: plot(x,y)
, set(h , 'XData' , y, 'YData' , y)
en animatedline
. Als u wilt dat uw animatie soepel verloopt, moet u efficiënt tekenen en de drie methoden zijn niet gelijkwaardig.
% Plot a sin with increasing phase shift in 500 steps
x = linspace(0 , 2*pi , 100);
figure
tic
for thetha = linspace(0 , 10*pi , 500)
y = sin(x + thetha);
plot(x,y)
drawnow
end
toc
Ik krijg 5.278172 seconds
. De plotfunctie verwijdert in principe elke keer het lijnobject. Een efficiëntere manier om een plot bij te werken, is door de eigenschappen XData
en YData
van het Line
object te gebruiken.
tic
h = []; % Handle of line object
for thetha = linspace(0 , 10*pi , 500)
y = sin(x + thetha);
if isempty(h)
% If Line still does not exist, create it
h = plot(x,y);
else
% If Line exists, update it
set(h , 'YData' , y)
end
drawnow
end
toc
Nu krijg ik 2.741996 seconds
, veel beter!
animatedline
is een relatief nieuwe functie, geïntroduceerd in 2014b. Laten we eens kijken hoe het gaat:
tic
h = animatedline;
for thetha = linspace(0 , 10*pi , 500)
y = sin(x + thetha);
clearpoints(h)
addpoints(h , x , y)
drawnow
end
toc
3.360569 seconds
, niet zo goed als het bijwerken van een bestaande plot, maar nog steeds beter dan plot(x,y)
.
Natuurlijk, als je een enkele lijn moet plotten, zoals in dit voorbeeld, zijn de drie methoden bijna equivalent en geven ze vloeiende animaties. Maar als u meer complexe plots hebt, zal het bijwerken van bestaande Line
objecten een verschil maken.