我试图制作一个由环形环组成的图案,其半径与自然数的平方根成比例。此外,我希望最内圈为白色,然后是黑色圆圈,后跟白色等等。
c = [0 0; 0 0];
r = [5.2494 9.0922];
viscircles(c, r)
r1 = [7.4328 10.4988];
viscircles(c, r1)
我已经生成了上面的代码来形成环形环结构,但我也希望填充颜色。我该怎么办?
答案 0 :(得分:7)
你可以走数学路线并绘制函数ceil(sin(pi*(X.^2 + Y.^2)))
:
zoomlevel = 50;
for n = 1:zoomlevel
[X,Y] = ndgrid(linspace(-n,n,500));
I = ceil(sin(pi*(X.^2 + Y.^2)));
imshow(mat2gray(I));
drawnow;
pause(0.03);
end
当然这只是一个光栅图形而不是矢量图,所以不要放大太多。 ;-)(虽然如果你缩放 out ,混叠文物看起来会很酷。请自行承担风险。)
答案 1 :(得分:4)
我的Matlab版本没有viscircles
,所以这里的方法是用交替的颜色绘制每个单独的圆圈。它使用rectangle
函数,它允许您定义角的曲率,使矩形/正方形变为椭圆/圆。应首先绘制更大的圆圈,以便它们不会完全覆盖较小的圆圈。
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
答案 2 :(得分:3)
您还可以为所有1
半径创建值为r
的“曲面”,为0
创建r1
。然后绘制为从顶部看到的表面,或直接使用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)
)的句柄,则只能处理一个图形对象。答案 3 :(得分:2)
viscircles
会返回hggroup
个对象。这种对象的一个属性是它的Children
,它是它创建的图形对象的句柄数组。例如,你可以写
h1 = viscircles(c, r)
c1 = h1.Children
这里的孩子应该只是viscircles
定义的圆形补丁的句柄。现在,要设置i
圆形补丁的颜色,您可以设置句柄FaceColor
的{{1}}属性。