python蜂窝状六边形_画多层六边形(小区),蜂窝状,matlab
作者:zfy,转载请注明
画多层六边形,蜂窝状,第一个和第二个参数为最中心小区的横纵坐标,第三个参数为小区半径,第四个为所需画的层数(如果只画第一个六边形拿出程序中底下部分cirliu即可,只一个六边形视为第0层,该参数>=1)。我们通常需要它在一个矩形界面中显示,那么将蜂窝中心放在矩形中心,然后试着运行一个程序,看在半径为r的情况下几层能布满即可。
%%%%%%%%%%%%%%%%%%%%%by
zfy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function qunliu( xx,yy,r,ceng )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
hang=linspace(0,2*pi,7);
for
i=1:1:ceng
for j=1:1:length(hang) theta(i,i*j-i+1) = hang(j);
cx(i,i*j-i+1)=sqrt(3)*i*r*cos(theta(i,i*j-i+1)); %这是每层上角度为pi/3,2*pi/3...小区中心
cy(i,i*j-i+1)=sqrt(3)*i*r*sin(theta(i,i*j-i+1));
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if(ceng>=2)
for i=2:1:ceng
for
j=1:1:length(hang)-1 for
k=1:1:i-1 %求那些非pi/3整数倍角度上的中心,依据第n层的是n分点
cx(i,i*j-i+1+k)=((i-k)*cx(i,i*j-i+1)+k*cx(i,i*j+1))/i;
cy(i,i*j-i+1+k)=((i-k)*cy(i,i*j-i+1)+k*cy(i,i*j+1))/i;
end
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
zx=cx+xx;
zy=cy+yy;
for i=1:1:ceng
for
j=1:1:6*i
cirliu(zx(i,j),zy(i,j),r);
hold
on;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function cirliu(xx,yy,r);
theta = linspace(pi/6,13*pi/6,7);
plot(r*cos(theta)+xx,r*sin(theta)+yy,'g-');
hold on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
效果展示:比如qunliu(40,50,10,10)
再例如:qunliu(50,50,10,4)
写作过程:
在网上查到了theta = linspace(pi/6,13*pi/6,7);
plot(r*cos(theta)+xx,r*sin(theta)+yy,'g-');
两句画单个六边形的方法,非常巧妙,但却不能画多层,所以我就开始思考怎么画多层。
我想如果知道了一个六边形,那么围绕着它就可以画很多层,所以我需要一个中心(就是中心六边形的中心),还有六边形半径。
之前因为考虑是显示在矩形中,如下:
开始想的时候想按从上到下得到第一排中心,然后第二排,依次下去,但这样如果各个中心的联系性不强,r不同时排数也会不同,从第一排左数第一个不完整的六边形显然不符合要求,它有多少在里面都是不确定的,因为它实在是不够特殊。
我更希望能知道一个中心就知道其他中心,所以我采用了中心小区,然后我就开始找规律。马上我发现围绕着中心小区的第一层:1*6个;第二层:2*6个;第三层:3*6个。
我以中心小区中心为圆心,sqrt(3)*r为半径画圆,
然后很显然第一层小区中心:sqrt(3)*r*cos(pi/3),sqrt(3)*r*cos(2*pi/3),sqrt(3)*r*cos(3*pi/3),...
很容易,但从第二层开始就有新麻烦了。
我再以中心小区中心为圆心,2*sqrt(3)*r为半径画圆,第二层小区只有一部分在此圆上,也就是说我可以得到第1,3,5...11,(13与11的角度相当于2*pi和0,用在算法中可求第12个中心)
第二层小区第1,3,5...个中心:2*sqrt(3)*r*cos(pi/3),2*sqrt(3)*r*cos(2*pi/3),2*sqrt(3)*r*cos(3*pi/3),...
再之后第三层小区只能知道第1,4,7...16个中心,于是我又找规律,
很容易发现,第2层夹的一个中心为夹住它的两个六边形中心连线的2等分点,第3层夹的一个中心为夹住它的两个六边形中心连线的3等分点,第4层夹的一个中心为夹住它的两个六边形中心连线的4等分点...而夹着它们的两个六边形中心就是处在pi/3整数倍的中心,这个之前已经算出来了。
以第三层举例:x1,x2,x3,x4中x1,x4已知,x2=2/3*x1+1/3*x4;x3=1/3*x1+2/3*x4
好啦,这样算法就有啦,然后将它写成程序就好啦,当然细节上还是需要费些功夫的,最后弄完啦,很开心~