2014-10-20 689 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