簡體   English   中英

在MATLAB中繪制3D

[英]Plotting 3D in MATLAB

嗨,大家好,如果這個問題看起來真的很蠢,對不起。 我是編程新手,需要使用MATLAB繪制以下圖像。
我已經嘗試了一遍又一遍,似乎無法理解MATLAB的工作原理。
有沒有人可以幫助編寫代碼來繪制這樣的圖片並向我解釋編程的工作原理?

我通常不會回答我給Coodz的問題,但是繪制這張圖太誘人了。 此圖將幾種繪圖方法結合在一起:

  1. 使用patch創建三角形。

  2. 設置軸屬性以反轉軸順序,並設置顏色屬性以使三角形透明。 這是使用set

  3. 使用meshgrid生成點的網格。

  4. 使用plot3繪制點。

  5. 使用text使文本可見。

  6. 使用line繪制黑色垂直線並設置軸標簽。

步驟#1-繪制三角形

創建該三角形的最好的辦法是使用patch功能。 patch會獲取一組頂點以及遍歷這些頂點的順序,還可以選擇獲取臉部顏色。 這樣,代碼的第一位是這樣的:

vert = [0 1 0; 1 0 0; 0 0 1];
patch('Vertices', vert, 'Faces', 1:3, 'FaceColor', 'cyan');

vert是一個頂點列表。 每行都包含一個形狀所包含的控制點。 每一列都是一個坐標。 第一列為R ,第二列為P ,第三列為S 因為三角形中有三個點,所以有三排點。 每行由每個三角形的一個角點組成。 注意我特別訂購積分的方式。 您需要按順時針(或逆時針...由您決定)順序定義點,因為稍后將使用它。

現在看看我如何稱呼patch 我們需要關注三個屬性:

  1. Vertices由定義我們形狀的點組成
  2. Faces要求您指定要按正確順序繪制的 通過指定Faces = 1:3 --> [1 2 3] ,我按此順序繪制了第一,第二和第三點。 這將以順時針方向遍歷這些點,然后為我們填充了三角形。
  3. FaceColor允許您指定三角形的顏色。 我做了cyan

因此,我們首先得到以下內容:

在此處輸入圖片說明

...真的不那么令人印象深刻吧?

步驟#2-無所事事

輸出將為實心形狀,但最初將以2D形式可視化...。 我們需要做的下一件事是旋轉相機,以便正確顯示三角形。 而且,軸是反向的 ,與常規軸不同。 我們也必須扭轉這些。 另外,我們可能希望制作一個grid並使面部顏色透明。

您可以通過以下代碼執行此操作:

view(3)
set(gca, 'xdir', 'reverse')
set(gca, 'ydir', 'reverse')
grid;
alpha('color')

view(3)移動相機,使其成為3D圖的默認MATLAB方向。 我們還使xy方向像圖一樣反轉。 我們還使用set和使用該gcaG ETTING在情節的焦點與c urrent XES,並設置xxdir )和y方向( ydir中) reverse 我還制作了一個grid並設置alpha屬性以使FaceColor透明。

這是我們得到的:

在此處輸入圖片說明

...好吧...還不錯。

步驟#3-生成三角形中的點

我們需要提出自己的觀點。 您可以像上面一樣使用meshgrid 該平面遵循z = 1 - x - y的方程,但是我們需要確保過濾掉小於0的那些值,並且不應該可視化這些值。 你可以首先生成您meshgrid點,然后設置值小於0到NaN ,所以你不告訴他們。 為了絕對確定並避免浮點錯誤,我將檢查小於-0.1的值:

[X,Y] = meshgrid(0:(1/6):1);
Z = 1 - X - Y;
Z(Z < -0.01) = NaN;

上面將生成一個2D的點網格,其分辨率為您的圖形所需的1/6

步驟#4-繪制點

確保hold on以便我們可以在同一圖形上放置更多內容,然后使用plot3放置以下幾點:

hold on;
plot3(X, Y, Z, 'b.', 'MarkerSize', 32);

這將繪制我們的點並使它們變藍。 這也使標記大小的直徑為32像素,因此我們可以更好地看到事物。

我們現在得到這個:

在此處輸入圖片說明

...還不錯,還不錯。

步驟#5和#6-添加文本框,畫線並添加一些軸標簽

現在,我們將NE文本添加到繪圖的中間。 我們還將要從圖的下底到中間畫一條線:

text(0.3,0.3,0.4, 'NE');
line([1/2 1/3], [1/2 1/3], [0 1/3], 'color', 'black');

text通過接受(x,y,z)坐標起作用,您可以將文本放置在該位置。 從技術上講,圖表的中間是(1/3,1/3,1/3) ,但是如果我將其放在此處,您不會真正看到該文本。 我決定將其設置為(0.3,0.3,0.4) 最后,我們將從基點到點畫一條線。 line接受xyz點的向量。 每列代表一個點,因此我在(1/2,1/2,0)的底部到(1/3,1/3,1/3)的中間畫一條線。 我還把線弄黑了。

最后,我要為軸添加一些標題:

xlabel('R');
ylabel('P');
zlabel('S');

現在我們得到:

在此處輸入圖片說明

... 我喜歡!


為了給您復制和粘貼的樂趣,以下是可用於運行並獲得上圖的完整代碼:

vert = [0 1 0; 1 0 0; 0 0 1];
patch('Vertices', vert, 'Faces', 1:3, 'FaceColor', 'cyan')
view(3)
set(gca, 'xdir', 'reverse')
set(gca, 'ydir', 'reverse')
grid
alpha('color')
[X,Y] = meshgrid(0:(1/6):1);
Z = 1 - X - Y;
Z(Z < -0.01) = NaN;
hold on;
plot3(X, Y, Z, 'b.', 'MarkerSize', 32);
text(0.3,0.3,0.4, 'NE');
line([1/2 1/3], [1/2 1/3], [0 1/3], 'color', 'black');
xlabel('R'); ylabel('P'); zlabel('S');

您可以使用fill3(X,Y,Z,C)函數。 X,Y和Z三元組指定多邊形頂點。 C指定顏色,其中C是當前顏色圖的向量或索引矩陣, 在這里您可以看到如何創建此顏色向量。

如果要顯示軸網格線,則應使用grid on。

這里是一個例子:

x = [0 1 1];                      
y = [0 1 0];
z = [0 1 0];
c = [0 0 1];
figure(1) % open a new figure
subplot(1,1,1) % create a subplot with 1 row and 1 column and select first
fill(x,y,z,c)
grid on
hold on
PointXYZ = 0;
plot3(PointXYZ,PointXYZ,PointXYZ,'*m')

plot3函數顯示一組數據點的三維圖,在這種情況下為(0,0,0)。 '* m'定義圖表線屬性。

這是一個例子。 要顯示所有點,必須創建坐標矢量,並在plot3中使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM