# CH08 二維圖形
## 課程重點
### 基本繪圖:
```matlab
plot(x陣列,y陣列)
plot(x1,y1,x2,y2) %也可以同時畫兩條
```
### 繪圖選項
`'LineSpec'` : 改變線條內容的字串
顏色:Color
|顏色|紅|綠|藍|
|---|---|---|---|
|符號|r|g|b
線條形狀:LineStyle
|形狀|實線|虛線|點線|
|---|---|---|---|
|符號|-|-\-|:
標記:Marker
|圖案|圓點|星號|叉號|
|---|---|---|---|
|符號|o|\*|x
屬性:(PropertyName, PropertyValue)
|指令|'LineWidth'|'MarkerSize'|'MarkerFaceColor'|
|---|---|---|---|
|說明|改變線寬|改變標記大小|改變標記顏色
範例
綠色+星號標記+點線+寬度為二的線:
```matlab!
plot(x,y,'g*:','LineWidth',2)
```
### 多重繪圖/相關指令
- hold on
如有多個plot指令的情況下,matlab只會顯示出最後的那一個圖形。
若想要同時繪製多個圖形,就必須使用hold on:
若要結束重疊,就用hold off
```matlab
plot(x1,y1)
hold on
plot(x2,y2)
hold off
```
- legend('圖表名稱')
legend可以用於套用圖例在圖表上:
若要關閉,用legend off
```matlab!
legend('圖表一','圖表二')
```
- subplot(列,行,順位)
subplot可以在同一視窗中顯示多個圖表
```matlab!
subplot(2,2,1) %第一格
plot(x1,y1)
subplot(2,2,2) %第二格
plot(x2,y2)
subplot(2,2,3) %第三格
plot(x3,y3)
subplot(2,2,4) %第四格
plot(x4,y4)
```
- figure(視窗)
figure用來控制圖表顯示在第幾個視窗
```matlab!
figure(1) %第一個視窗
plot(x1,y1)
figure(2) %第二個視窗
plot(x2,y2)
```
### 特殊繪圖
有關對數刻度的繪圖:
```matlab!
semilogx(x, y) % x 軸採對數刻度,y 軸採線性刻度
semilogy(x, y) % y 軸採對數刻度,x 軸採線性刻度
loglog(x, y) % x 軸與 y 軸皆採對數刻度
```
```matlab!
plotyy(x1,y1,x2,y2) %在同一張圖上繪製兩條曲線,同時使用左y軸與右y軸
```
### 簡易繪圖
ezplot可以用來做簡單的繪圖
只要將函數以字串的形式放入即可
也可以指定x,y範圍:
```matlab!
ezplot('sin(x)')
ezplot('sin(x)',[-10,10,-2,2]) % x=-10~10,y=-2~2
```
也可以用ezplot來繪出簡單幾何圖形
```matlab!
ezplot('(x-0)^2+(y-0)^2-25',[-5,5]) %半徑為五的圓形
```
## 程式練習
### `plotSinc.m`
利用plot語法繪製函數
𝑦=𝑠𝑖𝑛(𝑥)𝑥,−15≤𝑥≤15
```matlab=
x = -15:0.1:15
plot(x,sin(x)./x)
```

### `parabola.m`
已知一物體以初速度70𝑚/𝑠,仰角 60拋出,重力加速度為10𝑚/𝑠^2,利用plot語法繪製其拋物線,並顯示標題、格線、標註x與y座標。
```matlab=
% 0 = 70*sind(60).*t - 10/2.*t.^2
% t = 14*sind(60)
t = 0:0.1:14*sind(60);
x = 70*cosd(60).*t;
y = 70*sind(60).*t - 5.*t.*t;
plot(x,y);
grid on
title('初速度 70𝑚/𝑠,仰角60度')
xlabel('水平距離x(m)')
ylabel('高度y(m)')
```

### `axisTest.m`
繪製函數 𝑦=𝑐𝑜𝑠(𝑥)∗𝑥,−15≤𝑥≤15,顯示標題、格線、標註x與y座標,並限制顯示範圍如下圖。
```matlab=
x = -15:0.1:15;
plot(x,cos(x).*x);
title('cos(x)*x');
xlabel('x');
ylabel('y');
grid on;
axis([-20 20 -15 15]);
```

### `subParabola.m`
以第二題為基礎,繪製物體以初速度70𝑚/𝑠,重力加速為10𝑚/𝑠^2,仰角分別為0、10、20、…、90拋出的結果,利用subplot語法繪製子圖,並顯示標題、格線、標註x與y座標。
補充:num2str()可將括號內數字轉為字串。
```matlab=
clf
for i=0:9
ang = i*10
t = 0:0.1:14*sind(ang);
x = 70*cosd(ang).*t;
y = 70*sind(ang).*t - 5.*t.^2;
subplot(5, 2, i+1);
plot(x,y);
title(num2str(ang));
xlabel('水平距離');
ylabel('高度');
hold on
end
hold off;
```

### `earthquake.m`
常用地震大小的震度為芮氏規模,其與能量的關係為𝑙𝑜𝑔10(𝐸)=1.5𝑀+4.8,E為釋放能量 (焦耳),M為芮氏地震規模,利用此等式與semilogy繪製能量與規模的關係圖。
```matlab=
%log_{10}(E)=1.5M+4.8
x = 0:9
semilogy(x,10.^(1.5*x + 4.8))
title('芮氏地震規模與能量的關係')
xlabel('芮氏地震規模M');
ylabel('釋放能量E(焦耳,J)');
```

### `oval.m`
參考圓形的範例程式,繪製圓心在原點,𝑎=8、𝑏=6的橢圓,顯示範圍 -10<=x, y<=10。
```matlab=
% 橢圓 ((x-xc).^2)./a^2 + ((y-yc).^2)./b^2 = 1
% (x^2)/64 + (y^2)/36 = 1
% y = ((1-(x^2)/64)*36)^1/2
clf
a = 8;
b = 6;
xc = 0; % 圓心x
yc = 0; % 圓心y
checkno = 0;
for x = -10:0.05:10
if ((1-(x.^2)./a^2).*36).^1/2 >= 0 %y>=0
y1 = yc + sqrt(((1-(x.^2)./a^2).*b^2));
y2 = yc - sqrt(((1-(x.^2)./a^2).*b^2));
if checkno == 0 % 第一點
plot(x, y1, x, y2);
checkno = 1;
else % 其餘點 : 連線
X = [x, xx];
Y1 = [y1, yy1];
line(X, Y1);
Y2 = [y2, yy2];
line(X, Y2);
end
xx = x; % 前一點座標 設定
yy1 = y1;
yy2 = y2;
hold on;
end
end
xlabel('x'); ylabel('y'); grid on;
axis equal; axis([-10 10 -10 10]);
```

## 章節統整/心得
本章主要內容是透過不同的圖形函式來正確的表達圖形內容,每一個函式的表達方式並不會有太大的差異,通常而言更需要注意的是xy陣列是否宣告正確
解題遇到的問題:
初始條件難以訂定-在需要判斷斜拋運動的題目裡,需要依初始條件來定正確時間軸已取得正確的x,y陣列