捌、如何畫圓

馮丁樹

 


圓形是畫圖之重要元素,但在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指令。

 

  • clf

  • circle(1,0,0)

  •  

    結果:

    1. 繪製一圓

      

    上述之指令clf,是將前一圖先清除的意思,否則會重疊繪在前一圖上。若半徑為一代表長度L之矩陣向量,而(x0,y0)為常數,則會繪製許多同心圓。

    例二:同心圓僅需將半徑作成列矩陣即可。

  •  circle([1:10],0,0)

  •  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座標作變換可作成筒型之結構。

  • clf;

  •  x=zeros(1,5);

  •  y=1:5;

  •  rad=20;

  • circle(rad,x,y);

  •  

    3. 不同圓心之圓

     

     

    注意圖2及圖3因標示顏色,故其顏色是由MATLAB自行依序設定。若要指定顏色,則可在中心座標後加上顏色之變數,例如”r”代表紅色;”b”代表籃色;”k”代表黑色。

     

    例四: 利用指令可以將半徑由1至0分成200個細分段,X座標維持在原點,但y座標作週期性之變化,配合顏色的來回轉換,可以造就一個相當立體的圖案。

     

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

  • 4.同圓心位置變化y方向及半徑

     

     

    例五:由外部參數資料先變換圓心座標之位置,亦可達到三度空間之迴轉效果。

  • clf;

  • theta=linspace(0,pi,200);

  • r=cos(5*theta);

  • circle(0.1,r.*sin(theta),r.*cos(theta),hsv(40));

  •  

    5. 變化中心點及其顏色

     

     

    例六: 採用meshgrid指令,可以自然造成方型同心圓圖案,注意圓的顏色是照原內定的序列排定,若要自行設定也可以。本例是限定藍色與紅色輪流派置。

  • clf

  • axis equal;

  • [x,y]=meshgrid(1:5,1:5);

  • circle([0.5,0.3,0.1],x,y,['r';'b']);

  • 6. 矩陣座標中心繪製同心圓

     

    例七:

    這是一個利用最後之點數繪製多角形的例子。每次將Nb增加一,即會增加一個等邊。當Nb增為預設值300點時,即可獲得一個圓滑的圓形。但是利用這一個指令所做成之多邊形其初始頂角均在x方向上,若要獲得其他不同方向,則可採用?圓指令(ellipse),獲得不?的旋轉角度。

  • clf

  • circle(1:10,0,0,[],3:12);

  •  

    7. 不同畫線點數

     

    例八: 同心圓僅需將半徑作多段等等分分割即可達成,而改變其圓心位置,亦可獲得相疊而成的同心圓。

  •  clf;

  •  circle((1:10),[0,0,20,20],[0,20,20,0]);

  •  

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