2014-10-20 218 views
0

所以我有這樣的代碼來獲得徑向引力在地球上的緯度的功能:如何在MATLAB中製作帶有虛線邊框的圓形圖?

G=6.6e-11; 

M=5.976e24; 

N=1000; 

r=6371000; 

w=2*pi/(24*3600); 

for i=1:1:360 
    Theta=i*pi/180; 
    x(i)=i; 
    Vi(i)=-G*M/(r*r); 
    Phii(i)=r*w*w*sin(Theta)*sin(Theta); 
    gr(i)=Vi(i)+Phii(i); 
end 

plot(x,gr) 

,它運行良好。我想根據gr的值(我想要設置gr的值範圍,使得如果獲得的值落入a的點的邊界(代表角度(i))的邊界構成的圓的圖形特定的類別,該點將具有特定的顏色)。 我真的很陌生。有沒有任何可能的方法來做到這一點?

在此先感謝。

回答

3

下面是基本的算法,我會做:

  1. 確定要多少種顏色在你的情節來表示。
  2. 創建一個彩色地圖,其中包含您想要計算的許多點。
  3. 確定線性增加的矢量作爲已在步驟#2
  4. 對於每個點在gr確定從gr最小值變化到的gr與儘可能多的點的最大值:

    一個。確定哪一點產生該點與步驟#3中的向量的最近距離

    b。使用它來索引你想要的顏色。

    c。將角度轉換爲笛卡爾座標,然後用步驟4b中找到的顏色繪製該點。

讓我們解決了詳細的每個點。


第1步 - 確定你有多少顏色要

這是非常簡單的。只需確定你想要的顏色。現在,讓我們假設你想20種顏色,所以:

num_colours = 20; 

第2步 - 創建一個彩色地圖

我們所能做的就是創建一個20×3矩陣,其中每行確定RGB元組表示每種顏色將佔據的紅色,綠色和藍色的量。 MATLAB有內置的彩色貼圖,可以幫助你方便這一點。這裏是所有MATLAB有可用的顏色映射:

每種顏色地圖都有一個特殊的變量,你可以提供它的整數倍,它會返回儘可能多的行,這個二維矩陣您提供的號碼。每行給你一個RGB三元組,分別表示紅色,綠色和藍色的比例。這個矩陣從顏色貼圖的開頭(頂行)到結尾(底行)不等。你所要做的就是使用上面給出的圖中的任何名稱來創建該類型的顏色映射。例如,如果你想獲得的15分bones彩色地圖,簡單地做:

colour_map = bones(15); 

如果你想獲得的25分jet彩色地圖,簡單地做:

colour_map = jet(25); 

。 ...你明白了嗎?我喜歡hsv,所以讓我們使用HSV彩色地圖。你可以使用任何你想要的顏色地圖,但爲了這個例子,我們只需要堅持使用HSV。

這樣:

colour_map = hsv(num_colours); 

第3步 - 獲取通過線性增加向量

你想某些顏色映射到一定範圍內,這就是爲什麼這一步是很重要的。給定gr中的一個值,我們想要弄清楚我們想要選擇哪種顏色,並且您所要做的就是確定gr中的哪個值與步驟#3中此矢量中的值最接近。因此,你可以使用linspace爲你這樣做:

bin_vector = linspace(min(gr), max(gr), num_colours); 

,其中該陣列的開頭開始在gr最小值和變化高達gr和每個最大值這將創建一個num_colours維數組值是等間隔的,因此我們生成一個num_colours數組。

第4步 - 把它所有的家庭

現在,每個點gr,我們需要弄清楚這點是最接近第3步是矢量,我們就用它來計算出我們想要的顏色,那麼我們需要將我們的角度轉換成笛卡爾座標,然後繪製這個點。

爲了便於說明,我會假設你的半徑爲1。你能弄清楚如何通過簡單地做cos(theta)sin(theta),其中theta是要檢查的角度,以獲得xy座標。由於你的gr陣列有360個插槽,我將假設每個插槽的分辨率爲1度。因此,您可以在for循環中輕鬆完成此操作。請確保您使用hold on,因爲我們打算多次撥打plot,並且我們不希望每次撥打plot時都覆蓋此圖。你想要所有的點都留在情節中。

事不宜遲:

figure; %// Create blank figure 
hold on; %// Remember all points 

%// For each point in our array... 
for idx = 1 : 360 

    %// Find the closest slot between gr and our vector in Step #3 
    [~,min_idx] = min(abs(gr(idx) - bin_vector)); 

    %// Grab this colour 
    clr = colour_map(min_idx,:); 

    %// Plot the point with this colour 
    plot(cosd(idx), sind(idx), '.', 'Color', clr, 'MarkerSize', 10); 
end 

採取通知,cosdsind拿在作爲輸入參數,而cossin拿在弧度。另外,請注意,我也改變了點的大小,使它更大。有了上面的邏輯,和你在gr陣列,這是我得到:

enter image description here

如果你想在半徑變大,所有你需要做的就是乘每個cosdsind長期與RADIUS 。因此,你可以做這樣的事情:

radius = 2; 

for idx = 1 : 360 
    ... %// Insert colour code here 
    ... 
    ... 

    %// Now plot 
    plot(radius*cosd(idx), radius*sind(idx), '.', 'Color', clr, 'MarkerSize', 10); 
end 

剛剛離開的代碼是相同的,但對於plot命令,只要乘以半徑每xy值。在效率

你計算你gr陣列的方式


小筆記使用低效率for循環。有一些情況(比如我的上面)需要使用for循環,但是對於簡單的計算就沒有必要。它更好,如果你矢量化它的創作。因此,你可以擺脫for循環的計算,像這樣你gr陣列:

x = 1 : 360; 
Theta = x*pi/180; 
Phii = r*w*w*sin(Theta).*sin(Theta); 
Vi = -G*M/(r*r); 
gr = Vi + Phii; 

x只不過想從1到360的載體,而這在第一線做。此外,Vi只是一個包含單個值的數組,並且如果您知道標量和數組之間的操作是如何工作的,則可以使用此單個值進行添加,並且它將通過這麼多來爲您的數組添加每個值。因此,不需要爲Vi創建數組。另外,看看我如何計算Phii。我正在使用逐個元素的操作,因爲Theta現在是一個數組。您要創建一個數組Phii,該數組取值爲Theta,並將該公式應用於Theta中的每個值以生成Phii


希望這會有所幫助。祝你好運!

+0

太棒了!非常感謝! – 2014-10-20 20:13:39

+0

有沒有什麼方法可以幫助您獲得積分和東西? – 2014-10-20 20:14:05

+0

@DanielaOsorio - 不客氣:)你可以接受我的答案!在哪裏可以看到向上和向下投票按鈕,點擊這些按鈕下方的複選標記圖標。它向社區表明你不需要任何幫助。祝你好運! – rayryeng 2014-10-20 20:43:13

相關問題