下面是基本的算法,我會做:
- 確定要多少種顏色在你的情節來表示。
- 創建一個彩色地圖,其中包含您想要計算的許多點。
- 確定線性增加的矢量作爲已在步驟#2
對於每個點在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
是要檢查的角度,以獲得x
和y
座標。由於你的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
採取通知,cosd
和sind
拿在度作爲輸入參數,而cos
和sin
拿在弧度。另外,請注意,我也改變了點的大小,使它更大。有了上面的邏輯,和你在gr
陣列,這是我得到:
如果你想在半徑變大,所有你需要做的就是乘每個cosd
和sind
長期與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
命令,只要乘以半徑每x
和y
值。在效率
你計算你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
。
希望這會有所幫助。祝你好運!
太棒了!非常感謝! – 2014-10-20 20:13:39
有沒有什麼方法可以幫助您獲得積分和東西? – 2014-10-20 20:14:05
@DanielaOsorio - 不客氣:)你可以接受我的答案!在哪裏可以看到向上和向下投票按鈕,點擊這些按鈕下方的複選標記圖標。它向社區表明你不需要任何幫助。祝你好運! – rayryeng 2014-10-20 20:43:13