2017-06-20 1002 views
2

我試圖在Matlab上繪製一個正方形,特別是使用line命令,在點(0,0),(0,rho),(rho,0 )和(RHO,RHO)用Matlab的'line'命令繪製一個正方形

% create axes 
x = linspace(0,10,100); 
y = linspace(0,20,100); 
rho = 2*pi; 
% plot 
figure; 
A = line([0 0],[0 rho]); 
B = line([0 0],[rho 0]); 
C = line([0 rho],[rho rho]); 
D = line([rho 0],[rho rho]); 
fill(A,B,C,D,'b'); 

然而,線D沒有出現在我的身影,此外,該fill命令不工作,雖然這部分是真的挺可選。我的主要問題是爲什麼上述行不會出現在圖中

回答

4

那是因爲你沒有爲框中指定座標正確。請記住,line需要兩個向量,其中第一個向量是一列x座標,第二個向量是一列y座標。除了第一點外,每一個對(x, y)都將具有從其先前(i-1)點直到第點繪製的線。由AB繪製的線是相同的線。 CD也是如此。這只是修改語句的問題,因此您正在繪製線條。

在繪製可愛的ASCII圖形框圖示:

(0, rho)  (rho, rho) 
------------------------ 
|      | 
|      | 
|      | 
|      | 
------------------------ 
(0, 0)   (rho, 0) 

您需要繪製四條線。讓我們逆時針遍歷:

  1. (0, 0)(0, rho)
  2. (0, rho)(rho, rho)
  3. (rho, rho)(rho, 0)
  4. (rho, 0)(0, 0)

因此,修改你的代碼是:

rho = 2*pi; 
A = line([0 0],[0 rho]); 
B = line([0 rho],[rho rho]); 
C = line([rho rho],[rho 0]); 
D = line([rho 0],[0 0]); 

順便說一句,上面的代碼可能以後不能移植。你會得到線條句柄,因爲你不用這個作爲fill的輸入。

我們終於得到:

enter image description here

這可能是更清潔,只是把所有的座標,在短短兩個向量,並呼籲line。這也將使得這個戲很好地與fill

rho = 2*pi; 
x = [0, 0, rho rho, 0]; 
y = [0, rho, rho, 0, 0]; 
line(x, y); 
hold on; 
fill(x, y, 'b'); 

請注意,我們使用正確的約定line,然後繪製它,然後我們填充它。如果您遵循前面指定的邏輯,我們畫一條從(0, 0)(0, rho),然後從(0, rho)(rho, rho),然後從(rho, rho)(rho, 0)然後最後從(rho, 0)回到(0, 0)。請注意,我們必須在開始和結束時使用原點(0, 0),以確保我們在正方形的底部邊緣繪製線條。我們還使用hold on將填充框添加到您在圖上繪製的方形邊界之後。 fill需要座標向量,就像line一樣。我們得到:

enter image description here

3

您在輸入參數linefill時犯了一些錯誤。首先,line的輸入是線點的x座標,後面跟着線點的y座標,不是連續的(x,y)對的點。下面將正確打印您的廣場,在(0,0)啓動和畫線順時針:

A = line([0 0], [0 rho]);  % Left edge 
B = line([0 rho], [rho rho]); % Top edge 
C = line([rho rho], [rho 0]); % Right edge 
D = line([rho 0], [0 0]);  % Bottom edge 

返回的值是handles to the line graphics objects。這些可用於修改線路屬性,但不能將這些傳遞給fill。您應該改爲傳遞多邊形頂點數據。

雖然有一個更簡單的方法來處理所有這些。您可以代替定義X和您的正方形的頂點y座標的載體,使其更容易繪製線條和填充多邊形:

X = [0 0 rho rho 0]; 
Y = [0 rho rho 0 0]; 
hLine = line(X, Y); 
hold on; % Needed to add to existing plot instead of erasing 
fill(X, Y, 'b');