交替亮环和暗环的环形图案:使用matlab

交替亮环和暗环的环形图案:使用matlab,matlab,Matlab,我试图制作一个由环形环组成的图案,环形环的半径与自然数的平方根成正比。我还希望最里面的圆圈是白色的,后面是黑色的,后面是白色的,依此类推 c = [0 0; 0 0]; r = [5.2494 9.0922]; viscircles(c, r) r1 = [7.4328 10.4988]; viscircles(c, r1) 我已经生成了上面的代码来形成环形结构,但是我也想填充颜色。我该怎么办?viscircles返回一个hggroup对象。这样一个对象的属性之一是它的子对象,它是它创建的图形

我试图制作一个由环形环组成的图案,环形环的半径与自然数的平方根成正比。我还希望最里面的圆圈是白色的,后面是黑色的,后面是白色的,依此类推

c = [0 0; 0 0];
r = [5.2494 9.0922];
viscircles(c, r)
r1 = [7.4328 10.4988];
viscircles(c, r1)

我已经生成了上面的代码来形成环形结构,但是我也想填充颜色。我该怎么办?

viscircles
返回一个
hggroup
对象。这样一个对象的属性之一是它的
子对象
,它是它创建的图形对象的句柄数组。比如你可以写

h1 = viscircles(c, r)
c1 = h1.Children

这里的子对象应该只是
viscircles
定义的圆形面片的句柄。现在,要设置
i
th圆形面片的颜色,可以设置手柄
c1(i)

FaceColor
属性,因为我的Matlab版本没有
viscircles
,所以这里有一种方法可以用交替颜色绘制每个单独的圆。它使用函数,该函数允许您定义角的曲率,以便矩形/正方形成为椭圆/圆。应该先画较大的圆,这样它们就不会完全覆盖较小的圆

colors = [.9 .9 .9; 0 0 0]; %// light gray and black
N = 16; %// maximum number
hold on
for n = N:-1:1; %// bigger circles first
    s = sqrt(n);
    rectangle('curvature', [1 1], 'position', [-s/2 -s/2 s s], ...
        'edgecolor', 'none', 'facecolor', colors(mod(n-1,2)+1,:));
end
axis square

您可以按照数学路线绘制函数
ceil(sin(pi*(X.^2+Y.^2))

当然,这将只是一个光栅图形而不是矢量图形,所以不要放大太多(虽然如果你缩小,假像看起来会很酷,但绘制的风险由你自己承担。) 您还可以为所有
r
半径创建一个值为
1
的“曲面”,为
r1
创建一个值为
0
。然后,要么打印为从顶部看到的曲面,要么直接使用
pcolor

r = [0 5.2494 7.4328 9.0922 10.4988] ;  %// define all your radiuses
bw = mod( 1:numel(r) , 2 ) ;            %// create an alternance of 0 and 1 (same size as "r")
ntt = 50 ;                              %// define how many angular division for the plot
theta = linspace(0,2*pi,ntt) ;          %// create all the angular divisions
[rr,tt]=meshgrid(r,theta) ;             %// generate a grid 

z = repmat( bw , ntt , 1 ) ;            %// replicate our [0 1 0 ...] vector to match the grid

[xx,yy,zz] = pol2cart(tt,rr,z) ;        %// convert everything to cartesian coordinates

pcolor(xx,yy,zz)                        %// plot everything
colormap(gray(2))                       %// make sure we use only 2 colors (black and white)
shading flat ; axis equal               %// refine the view (axis ratio and "spokes" not visible)
您可以在原始
r
中发送任意数量的半径。 这将导致:

这种方法一开始看起来比其他解决方案要长一点,但您可以通过合并一些行来删除许多中间步骤,如果以后要重用图形,它可能会带来两个好处:

  • 如果获得图形对象的句柄(
    hp=pcolor(xx,yy,zz)
    ),则只有一个图形对象要处理
  • 如果需要更改颜色,不需要在每个圆之间循环,只需将颜色贴图更改为所需的两种颜色(例如,如果需要“红色”和“绿色”,只需调用颜色贴图
    colormap([1 0;0 1 0])
    ,即可

Matlab可能会让人困惑。如何绘制大量的圆?那么
rectangle
函数呢!…是的…绝对是最直观的绘制圆的方法。+1可以很好地扭转Matlab的手臂。@Hoki@Ander完全同意。谁会想到使用
rectangle
来绘制圆呢?天哪****!那个别名人工制品哦,太棒了!@knedlsepp好吧,R2014b应该有。但是,和安德一样,我看不出在这方面有什么明显的区别R2014b@knedlsepp您的意思是反走样仅应用于矢量图形(如线)而不应用于“基于位图”的图形(图像)吗?但如果图像大小与屏幕大小不匹配,则必须进行一些插值,对吗?我已经盯着这个动画.gif看了大概5分钟。+1。呵呵,是的,我知道。我会给你+10作为futurama参考。我想这比我的答案更有用。
r = [0 5.2494 7.4328 9.0922 10.4988] ;  %// define all your radiuses
bw = mod( 1:numel(r) , 2 ) ;            %// create an alternance of 0 and 1 (same size as "r")
ntt = 50 ;                              %// define how many angular division for the plot
theta = linspace(0,2*pi,ntt) ;          %// create all the angular divisions
[rr,tt]=meshgrid(r,theta) ;             %// generate a grid 

z = repmat( bw , ntt , 1 ) ;            %// replicate our [0 1 0 ...] vector to match the grid

[xx,yy,zz] = pol2cart(tt,rr,z) ;        %// convert everything to cartesian coordinates

pcolor(xx,yy,zz)                        %// plot everything
colormap(gray(2))                       %// make sure we use only 2 colors (black and white)
shading flat ; axis equal               %// refine the view (axis ratio and "spokes" not visible)