MATLAB Language
चित्रकारी
खोज…
मंडलियां
सर्कल खींचने के लिए सबसे आसान विकल्प है, स्पष्ट रूप से - rectangle
फ़ंक्शन।
%// radius
r = 2;
%// center
c = [3 3];
pos = [c-r 2*r 2*r];
rectangle('Position',pos,'Curvature',[1 1])
axis equal
लेकिन आयत की वक्रता को 1 पर सेट करना होगा!
position
वेक्टर आयत को परिभाषित करता है, पहले दो मान x
और y
आयत के निचले बाएँ कोने हैं। अंतिम दो मान आयत की चौड़ाई और ऊँचाई को परिभाषित करते हैं।
pos = [ [x y] width height ]
सर्कल के निचले बाएं कोने - हाँ, इस सर्कल में कोने हैं, काल्पनिक हैं - हालांकि केंद्र c = [3 3]
का त्रिज्या r = 2
जो कि [xy] = [1 1]
। चौड़ाई और ऊंचाई सर्कल के व्यास के बराबर है, इसलिए width = 2*r; height = width;
यदि उपरोक्त समाधान की चिकनाई पर्याप्त नहीं है, तो त्रिकोणमितीय कार्यों के उपयोग द्वारा वास्तविक सर्कल को चित्रित करने के स्पष्ट तरीके का उपयोग करने का कोई तरीका नहीं है।
%// 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
तीर
सबसे पहले, एक quiver
उपयोग कर सकता है, जहां किसी को 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)
महत्वपूर्ण quiver
का 5 वां तर्क है: 0 जो अन्यथा डिफ़ॉल्ट स्केलिंग को अक्षम करता है, क्योंकि यह फ़ंक्शन आमतौर पर वेक्टर फ़ील्ड्स को प्लॉट करने के लिए उपयोग किया जाता है। (या संपत्ति मूल्य जोड़ी 'AutoScale','off'
)
अतिरिक्त सुविधाएँ भी जोड़ सकते हैं:
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')
यदि अलग-अलग तीरंदाज़ वांछित हैं, तो किसी को एनोटेशन का उपयोग करने की आवश्यकता है (यह उत्तर उपयोगी हो सकता है कि मैं कैसे तरकश की साजिश में तीर के सिर शैली को बदल सकता हूं? )।
तीर के सिर का आकार 'MaxHeadSize'
संपत्ति के साथ समायोजित किया जा सकता है। यह दुर्भाग्य से सुसंगत नहीं है। कुल्हाड़ियों की सीमा को बाद में सेट करने की आवश्यकता है।
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])
समायोज्य तीर प्रमुखों के लिए एक और ट्वीक है:
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
जिसे आप अपनी स्क्रिप्ट से निम्नानुसार कॉल कर सकते हैं:
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
अंडाकार
एक दीर्घवृत्त की साजिश करने के लिए आप इसके समीकरण का उपयोग कर सकते हैं। एक दीर्घवृत्त में एक प्रमुख और एक छोटी धुरी होती है। इसके अलावा, हम विभिन्न केंद्र बिंदुओं पर दीर्घवृत्त की साजिश करने में सक्षम होना चाहते हैं। इसलिए हम एक फ़ंक्शन लिखते हैं जिसके इनपुट और आउटपुट हैं:
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
आप एक दीर्घवृत्त पर अंक प्राप्त करने के लिए निम्नलिखित फ़ंक्शन का उपयोग कर सकते हैं और फिर उन बिंदुओं को प्लॉट कर सकते हैं।
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
उदाहरण के:
[x,y] = getEllipse(1,0.3,[2 3]);
plot(x,y);
बहुभुज (रों)
वेक्स के x- और y- स्थानों को पकड़ने के लिए वैक्टर बनाएं, इन्हें patch
में फीड करें।
एकल बहुभुज
X=rand(1,4); Y=rand(1,4);
h=patch(X,Y,'red');
एकाधिक बहुभुज
प्रत्येक बहुभुज के कोने 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');
छद्म 4D प्लॉट
ए (mxn)
मैट्रिक्स सर्फ का उपयोग करके एक सतह द्वारा दर्शाया जा सकता है;
सतह का रंग स्वचालित रूप से (mxn)
मैट्रिक्स में मानों के कार्य के रूप में सेट किया गया है। यदि कॉलॉर्मैप निर्दिष्ट नहीं है, तो डिफ़ॉल्ट एक लागू होता है।
वर्तमान कॉलॉर्मैप प्रदर्शित करने के लिए एक कलरबार जोड़ा जा सकता है और कॉलमैप में डेटा मानों की मैपिंग का संकेत दे सकता है।
निम्न उदाहरण में, z (mxn)
मैट्रिक्स फ़ंक्शन द्वारा उत्पन्न होता है:
z=x.*y.*sin(x).*cos(y);
अंतराल के ऊपर [-pi,pi]
। x
और y
मानों को ट्रेग्रिड फ़ंक्शन का उपयोग करके उत्पन्न किया जा सकता है और सतह निम्नानुसार प्रदान की जाती है:
% 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
आकृति 1
अब यह मामला हो सकता है कि अतिरिक्त जानकारी z
मैट्रिक्स के मूल्यों से जुड़ी हुई है और वे दूसरे (mxn)
मैट्रिक्स में संग्रहित हैं
जिस तरह से सतह पर रंग है, उसे संशोधित करके साजिश पर इन अतिरिक्त जानकारी को जोड़ना संभव है।
यह 4 डी प्लॉट के थोड़े को अनुमति देता है: पहले (mxn)
मैट्रिक्स द्वारा उत्पन्न सतह के 3 डी प्रतिनिधित्व के लिए, चौथे आयाम को दूसरे (mxn)
मैट्रिक्स में निहित डेटा द्वारा दर्शाया जाएगा।
4 इनपुट के साथ surf
कॉल करके इस तरह के प्लॉट को बनाना संभव है:
surf(x,y,z,C)
जहाँ C
पैरामीटर दूसरा मैट्रिक्स है (जिसका आकार z
के समान है) और इसका उपयोग सतह के रंग को परिभाषित करने के लिए किया जाता है।
निम्नलिखित उदाहरण में, C
मैट्रिक्स फ़ंक्शन द्वारा उत्पन्न होता है:
C=10*sin(0.5*(x.^2.+y.^2))*33;
अंतराल पर [-pi,pi]
C
द्वारा निर्मित सतह है
चित्र 2
अब हम चार इनपुट के साथ surf
कॉल कर सकते हैं:
figure
surf(x,y,z,C)
% shading interp
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar
चित्र तीन
चित्र 1 और चित्र 3 की तुलना करने पर, हम यह देख सकते हैं कि:
- सतह का आकार
z
मानों से मेल खाता है (पहला(mxn)
मैट्रिक्स) - सतह का रंग (और उसकी सीमा, रंगकर्मी द्वारा दी गई)
C
मानों से मेल खाती है (पहला(mxn)
मैट्रिक्स)
चित्र 4
बेशक, प्लॉट में z
और C
को स्वैप करना संभव है, C
मैट्रिक्स द्वारा दी गई सतह का आकार और z
मैट्रिक्स द्वारा दिया गया रंग:
figure
surf(x,y,C,z)
% shading interp
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar
और चित्रा 4 के साथ चित्रा 2 की तुलना करने के लिए
तेजी से ड्राइंग
: वहाँ अनुक्रमिक भूखंड या एनिमेशन करने के लिए तीन तरीके हैं plot(x,y)
, set(h , 'XData' , y, 'YData' , y)
और animatedline
। यदि आप चाहते हैं कि आपका एनीमेशन सुचारू हो, तो आपको कुशल ड्राइंग की आवश्यकता है, और तीनों विधियाँ समतुल्य नहीं हैं।
% 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
मुझे 5.278172 seconds
। प्लॉट फ़ंक्शन मूल रूप से प्रत्येक बार लाइन ऑब्जेक्ट को हटाता है और पुन: बनाता है। प्लॉट को अपडेट करने का एक अधिक कुशल तरीका Line
ऑब्जेक्ट के XData
और YData
गुणों का उपयोग करना है।
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
अब मुझे 2.741996 seconds
, बहुत बेहतर!
animatedline
एक अपेक्षाकृत नया समारोह, 2014b में शुरू की गई है। आइए देखें कि यह किराया कैसे है:
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
, मौजूदा प्लॉट को अपडेट करने जितना अच्छा नहीं है, लेकिन फिर भी plot(x,y)
से बेहतर है।
बेशक, अगर आपको एक ही लाइन को प्लॉट करना है, तो इस उदाहरण की तरह, तीन तरीके लगभग बराबर हैं और चिकनी एनिमेशन देते हैं। लेकिन अगर आपके पास अधिक जटिल भूखंड हैं, तो मौजूदा Line
ऑब्जेक्ट को अपडेट करने से फर्क पड़ेगा।