捌、如何畫圓
馮丁樹
圓形是畫圖之重要元素,但在MATLAB並無直接指令可進行畫圓。畫一個圓需要指定圓心、半徑及需要之顏色參數,另外亦需決定畫圓所需之點數。而在繪製之先,亦必須清礎座標的比例,否則會造成?圓或比例不對稱的圓,此點可以在畫圓前先作等軸的宣告,至於終端機本身之軸向若有不等比例,則必須由終端機之控制鈕調整。即:
>> axis equal;
一旦宣告之後,兩軸之比例亦會相等,若不宣告,則必須自行調整視窗之長與寬,使其近似等比的情況。畫圓之指令(circle.m)
係瑞士Neuchatel 大學Peter Blattner教授所發展的shareware,並經筆者改寫而成,其功能更為完整,茲就其應用說明如下:
繪圖參數
在MATLAB中繪線,其主要可用line的功能,逐點連線繪製。但是連線時係以直線表示,因此必須給予適當點數,使其繪製近似圓形,故點數也相當重要,但也可以利用點數的功能繪製正多邊形。在circle之函數當中,其輸入之變數分別如下:
-r 圓之半徑,可為列矩陣,代表可同時繪製許多同心或同性質的圓。
-x0,y0 圓心之座標,可為矩陣,代表可同時繪製許多不同圓心位置之圓。
-C 圓之顏色,不說明時,由指令依序指定,亦可作向量指定。
-Nb 繪圓時所用之點數,可用向量,若不指定,則以300點為預設值。
基本上圓周之構成可用三角函數計算:
x
= r cosθ;
y
= r sinθ;
2π>θ≧0
其中角度θ則應自零至360度。而其區間應為θ/ Nb。
例一:繪製半徑為1中心點為(0,0)之圓。若要加格線,可用grid
on指令。
結果:
圖1.
繪製一圓
上述之指令clf,是將前一圖先清除的意思,否則會重疊繪在前一圖上。若半徑為一代表長度L之矩陣向量,而(x0,y0)為常數,則會繪製許多同心圓。
例二:同心圓僅需將半徑作成列矩陣即可。
ans
=
Columns 1 through 6
73.001
74.001 75.001
76.001
77.001
121
Columns 7 through 10
122
123 124
125
圖2
繪製同心圓
這是將半徑10分成1,2,3,…,10之同心圓。若將中心點之位置移動,而半徑值固定,其程式如下:
例三:
令y座標作變換可作成筒型之結構。
圖3. 不同圓心之圓
注意圖2及圖3因標示顏色,故其顏色是由MATLAB自行依序設定。若要指定顏色,則可在中心座標後加上顏色之變數,例如”r”代表紅色;”b”代表籃色;”k”代表黑色。
例四:
利用指令可以將半徑由1至0分成200個細分段,X座標維持在原點,但y座標作週期性之變化,配合顏色的來回轉換,可以造就一個相當立體的圖案。
圖4.同圓心位置變化y方向及半徑
例五:由外部參數資料先變換圓心座標之位置,亦可達到三度空間之迴轉效果。
圖5.
變化中心點及其顏色
例六:
採用meshgrid指令,可以自然造成方型同心圓圖案,注意圓的顏色是照原內定的序列排定,若要自行設定也可以。本例是限定藍色與紅色輪流派置。
圖6. 矩陣座標中心繪製同心圓
例七:
這是一個利用最後之點數繪製多角形的例子。每次將Nb增加一,即會增加一個等邊。當Nb增為預設值300點時,即可獲得一個圓滑的圓形。但是利用這一個指令所做成之多邊形其初始頂角均在x方向上,若要獲得其他不同方向,則可採用?圓指令(ellipse),獲得不?的旋轉角度。
圖7. 不同畫線點數
例八:
同心圓僅需將半徑作多段等等分分割即可達成,而改變其圓心位置,亦可獲得相疊而成的同心圓。
圖7.
同心圓及不同中心點之另一種畫法
function
h=circle(r,x0,y0,C,Nb)
-
% CIRCLE adds circles to the current plot
-
%
-
% CIRCLE(r,x0,y0) adds a circle of radius r centered at point x0,y0.
-
% If r is a vector of length L and x0,y0 scalars, L circles with radii r
-
% are added at point x0,y0.
-
% If r is a scalar and x0,y0 vectors of length M, M circles are with the
same
-
% radius r are added at the points x0,y0.
-
% If r, x0,y0 are vector of the same length L=M, M circles are added. (At
each
-
% point one circle).
-
% if r is a vector of length L and x0,y0 vectors of length M~=L, L*M
circles are
-
% added, at each point x0,y0, L circles of radius r.
-
%
-
% CIRCLE(r,x0,y0,C)
-
% adds circles of color C. C may be a string ('r','b',...) or the RGB
value.
-
% If no color is specified, it makes automatic use of the colors
specified by
-
% the axes ColorOrder property. For several circles C may be a vector.
-
%
-
% CIRCLE(r,x0,y0,C,Nb), Nb specifies the number of points used to draw
the
-
% circle. The default value is 300. Nb may be used for each circle
individually.
-
%
-
% h=CIRCLE(...) returns the handles to the circles.
-
%
-
% Try out the following (nice) examples:
-
%
-
%% Example 1
-
%
-
% clf;
-
% x=zeros(1,200);
-
% y=cos(linspace(0,1,200)*4*pi);
-
% rad=linspace(1,0,200);
-
% cmap=hot(50);
-
% circle(rad,x,y,[flipud(cmap);cmap]);
-
%
-
%% Example 2
-
%
-
% clf;
-
% the=linspace(0,pi,200);
-
% r=cos(5*the);
-
% circle(0.1,r.*sin(the),r.*cos(the),hsv(40));
-
%
-
%
-
%% Example 3
-
%
-
% clf
-
% [x,y]=meshdom(1:10,1:10);
-
% circle([0.5,0.3,0.1],x,y,['r';'y']);
-
%
-
%% Example 4
-
%
-
% clf
-
% circle(1:10,0,0,[],3:12);
-
%
-
%% Example 5
-
%
-
% clf;
-
% circle((1:10),[0,0,20,20],[0,20,20,0]);
-
% rewritten by Din-sue Fon. Dept. of Bio-Industrial Mechatronics
Engineering,
-
% National Taiwan University March 10,2001
-
% dsfong@ccms.ntu.edu.tw
-
% written by Peter Blattner, Institute of Microtechnology, University of
-
% Neuchatel, Switzerland, blattner@imt.unine.ch
-
-
% Check the number of input arguments
-
switch
nargin
-
case
0
-
r=[];x0=[];y0=[];C=[];Nb=[];
-
case
1
-
x0=[];y0=[];C=[];Nb=[];
-
case
2
-
y0=zeros(1,length(x0));C=[];Nb=[];
-
case
3
-
C=[];Nb=[];
-
case
4
-
Nb=[];
-
end
-
-
if
length(x0)~=length(y0),
-
if length(y0)==1,
-
y0=ones(1,length(x0))*y0;
-
elseif length(x0)==1,
-
x0=ones(1,length(y0))*x0;
-
else
-
error('The
lengths of x0 and y0 must be identical');
-
end;
-
end;
-
-
% set up the default values
-
-
if
isempty(r),r=1;end;
-
if
isempty(x0),x0=0;end;
-
if
isempty(y0),y0=0;end;
-
if
isempty(Nb),Nb=300;end;
-
if
isempty(C),C=get(gca,'colororder');end;
-
if
isstr(C),C=C(:);end;
-
-
% work on the variable sizes
-
-
x0=x0(:);
-
y0=y0(:);
-
r=r(:);
-
Nb=Nb(:);
-
-
-
% how many rings are plottet
-
-
if
length(r)~=length(x0)
-
maxk=length(r)*length(x0);
-
else
-
maxk=length(r);
-
end;
-
route=0;
-
if
length(x0)==1,
route=1; end
-
if
length(r)==1,
route=2; end
-
if
length(x0)==length(r),
route=3; end
-
-
% drawing loop
-
-
for
k=1:maxk
-
switch route
-
case 1
-
xpos=x0;
-
ypos=y0;
-
rad=r(k);
-
case 2
-
xpos=x0(k);
-
ypos=y0(k);
-
rad=r;
-
case 3
-
xpos=x0(k);
-
ypos=y0(k);
-
rad=r(k);
-
otherwise
-
rad=r(fix((k-1)/size(x0,1))+1);
-
xpos=x0(rem(k-1,size(x0,1))+1);
-
ypos=y0(rem(k-1,size(y0,1))+1);
-
end; %
for switch
-
-
theta=linspace(0,2*pi,Nb(rem(k-1,size(Nb,1))+1,:)+1);
-
h(k)=line(rad*cos(theta)+xpos,rad*sin(theta)+ypos);
-
set(h(k),'color',C(rem(k-1,size(C,1))+1,:));
-
-
end;
|
|