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;

voer hier de afbeeldingsbeschrijving in


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

voer hier de afbeeldingsbeschrijving in

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)

voer hier de afbeeldingsbeschrijving in

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')

voer hier de afbeeldingsbeschrijving in

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])

voer hier de afbeeldingsbeschrijving in

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

voer hier de afbeeldingsbeschrijving in

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);

voer hier de afbeeldingsbeschrijving in

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');

enkele veelhoek

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');

drie veelhoeken

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

voer hier de afbeeldingsbeschrijving in

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

voer hier de afbeeldingsbeschrijving in

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

voer hier de afbeeldingsbeschrijving in

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)

voer hier de afbeeldingsbeschrijving in

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

voer hier de afbeeldingsbeschrijving in

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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow