11/16/2006

1.1.2畫圓程式之應用

在MATLAB中繪線,可用line的功能,這個繪線指令係根據座標點矩陣逐點連線繪製。但是連線時係以直線表示,因此必須在適當的點數下所繪製的圖才能近似圓形,故點數也相當重要。在circle之函數當中,其輸入之變數分別如下:

  •  r::圓之半徑,可為列矩陣,若為列矩陣時,代表可同時繪製許多圓。
  •  x0, y0: 圓心之座標,可為矩陣,若為矩陣時,代表可同時繪製許多不同圓心位置之圓。
  •  C:圓之顏色
  •  Nb: 繪圓時所用之點數,其預設值為300點。

函數circle1()除可繪圖外,可以繪製多種型式的圓,並附上顏色。程式內容看來較為複雜,實際執行僅是其中之下半部,其餘均在核對輸入參數之正確性,使程式更能處理不同的需求。這個程式即使僅打入circle1亦可運作,如:

>> circle1
ans =
152.0021




圖2所示即為其繪圖之結果,由於輸入參數均未設定,故程式僅採用預設值,即半徑為1,圓心為原點。指令窗中所顯示之ans=152.0021為此圖之握把值,該值可以作為程式中指定該圖之參考指標。 

實例:

>> circle1([1:10],0,0)
ans =
Columns 1 through 8
152.0050 156.0038 157.0037 158.0033 159.0033 160.0032 161.0032 162.0032
Columns 9 through 10
163.0032 164.0032



圖3為同心圓,只要半徑為列矩陣,即可繪出不同的同心圓,而其顏色則依預設之順序分配,若欲固定顏色,則可在最後一參數中輸入其RGB值。

同心圓之方式也可稍作改變,這是將半徑10分成1,2,3,…,10之同心圓。若將中心點之位置移動,而半徑值固定,其程式如下:

實例:

>> clf;circle1(20,1:2:10,1:2:10)
ans =
152.0054
156.0042
157.0040
158.0035
159.0035



在此實例中,開始下clf是先將前圖洗淨的意思,若不下此指令,則後圖會與前面的圖重疊,不然就要先以configure(h)設定另一個圖窗。若要不同半徑之圓處於不相干之位置,亦可利用下述之方法求得:

實例:

>clf;circle1([1 2 3],[2 3 5],[1 2 1],20);



在此指令下,可以看到半徑r=[1 2 3]的列向量,而圓心x,y也是同元素之列向量,故繪出其對應的圓。其顏色則依內定的排列方式自動顯出。在此每圖之點數均為20點。這種變化有時可以應用在其他有規則之圓心軌跡上,如下面之實例:
實例:

>> the=linspace(0,pi,200);
>> r=cos(5*the);
>> circle1(0.1,r.*sin(the),r.*cos(the),20,hsv(40));
>> circle1(0.1,r.*sin(the),r.*cos(the),20,hsv(40));




在第一行指令中,有一個新指令linspace(),它是分點的函數,亦即在一數列上自開始點至終點間分成若干線段點,其最後之參數即為段數。請注意它不是linespace()。

在這個例子中,另外加顏色碼,使其變化依繪圓的過程而轉變顏色。hsv(40)是一個色彩度之顏色值,分成40個點,但每點有3項RGB值,故其形成之資料大小應為40x3。顏色亦可用文字代表,即'r'(紅色);'y'(黃色); 'k'(黑色);'b'(藍色)等,但必須以行矩陣表示。

若半徑與圓心座標之元素個數不同,則會在不同的圓心上作同心圓,如下實例:

實例:

%test1
clf;
axis equal;
[x,y]=meshgrid(1:5,1:5);
circle1([0.5,0.3,0.1],x,y,['r';'b']);




網格之製作可利用meshgrid()函數,其參數包含X軸與Y軸部份,以方格進行切割,得到不同之座標位置。利用circle1()函數即可以網格點為圓心,繪製不同之同心圓。

除此以外,亦可利用圓周之點繪製多邊形,其實例如下:

實例:

>> circle1(1:10,0,0,3:12)
ans =
Columns 1 through 8
152.0056 156.0044 157.0043 158.0038 159.0038 160.0034 161.0034 162.0034
Columns 9 through 10
163.0034 164.0034



比較複雜之運用則是除點數外,可以運用參數之可變特性繪製特殊之圓形圖形。

實例:

%test2
%
clf;
x=zeros(1,200);
y=cos(linspace(0,1,200)*4*pi);
rad=linspace(1,0,200);
cmap=hot(50);
circle1(rad,x,y,300,[flipud(cmap);cmap]);




此程式中,所用之函數大部份均已用過,其中zeros()函數較為特殊,通常一個矩陣中各元素要令其為零時,可用此函數,其括號內為矩陣之大小。此函數亦可作為某一矩陣大小之宣告,事先預約空間,使電腦在執行時加快速度。其相對應之函數為ones(),其功能相同,只是此函數將所有元素均設定為一。

在顏色之參數中,有一flipud()函數,這是將矩陣上下鏡射交換,使色調成為對稱狀態。

沒有留言: