2017-06-20 1006 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');