Lumerical练习1 您所在的位置:网站首页 六边形如何画圆 Lumerical练习1

Lumerical练习1

2024-06-29 23:55| 来源: 网络整理| 查看: 265

目录

题目1:画一个十字叉+四个扇形

建模逻辑

所需要的变量

脚本编写

生成结果

附完整代码

题目2:一组正六边形

建模逻辑

所需要的变量

脚本编写

生成结果

附完整代码

程序:zhangjiali1201/Lumerical_demo (github.com)

本文程序为exercise1_model_cross和exercise2_model_hex

题目1:画一个十字叉+四个扇形

建模逻辑

中心的十字叉由交叠的两个矩形组成,使用两次addrect即可。周围的四个扇形可以用addring命令,内径为0,外径为R。

所需要的变量

扇形半径R,十字叉宽度w,十字叉与扇形的间隙gap,整个模型的厚度H,以上参数均为Length类型。

材料为了便于区分,十字叉和扇形选择不同的材料,十字叉为硅,扇形为金。

脚本编写

开始前先删除所有模型。

deleteall;

然后建立两个矩形,构成十字叉。

addrect; set('name','cross1'); set('x',0); set('y',0); set('z span',H); set('x span',2*R+2*gap+w); set('y span',w); set('material',silicon); addrect; set('name','cross2'); set('x',0); set('y',0); set('z span',H); set('x span',w); set('y span',2*R+2*gap+w); set('material',silicon);

然后用for循环构建四个扇形。这里扇形的起止角度比较简单,可以直接用90度的倍数,也可以给角度全部列到矩阵里。

#create sector V=[gap+w/2,gap+w/2; -(gap+w/2),gap+w/2; -(gap+w/2),-(gap+w/2); gap+w/2,-(gap+w/2)]; #the=[0,90,180,270,360]; for(i=1:4) { addring; set('name','sector'+num2str(i)); set('x',V(i,1)); set('y',V(i,2)); set('z span',H); # set('theta start',the(i)); # set('theta stop',the(i+1)); set('theta start',(90*(i-1))); set('theta stop',(90*i)); set('inner radius',0); set('outer radius',R); set('material',gold); } 生成结果

附完整代码 ################# #edited by jializhang, 20210418 deleteall; #create the cross addrect; set('name','cross1'); set('x',0); set('y',0); set('z span',H); set('x span',2*R+2*gap+w); set('y span',w); set('material',silicon); addrect; set('name','cross2'); set('x',0); set('y',0); set('z span',H); set('x span',w); set('y span',2*R+2*gap+w); set('material',silicon); #create sector V=[gap+w/2,gap+w/2; -(gap+w/2),gap+w/2; -(gap+w/2),-(gap+w/2); gap+w/2,-(gap+w/2)]; #the=[0,90,180,270,360]; for(i=1:4) { addring; set('name','sector'+num2str(i)); set('x',V(i,1)); set('y',V(i,2)); set('z span',H); # set('theta start',the(i)); # set('theta stop',the(i+1)); set('theta start',(90*(i-1))); set('theta stop',(90*i)); set('inner radius',0); set('outer radius',R); set('material',gold); } 题目2:一组正六边形

建模逻辑

首先构建最中心的六边形,然后用循环构建周围的六个六边形。

lumerical中的addpoly指令是依次连接多边形的端点来构建多边形。例如下图,就会依次连接这五个点来构建一个五边形。

那对于中间的六边形而言,只要列出六个端点的坐标就可以绘制出来。

周围的六个六边形的中心可以通过一个循环列出来,如果将最右侧的六边形记为1,逆时针排序,外侧多边形和中心多边形的连线与x轴的夹角记为theta,那么theta角依次为0°,60°,120°,180°,240°,300°,360°。外侧多边形和中心多边形的连线的长度恒为2*R*cos(pi/3)+gap,所以外围多边形的中心点可以求出。再根据端点绘制出六边形就可以完成整个建模。

所需要的变量

六边形半径R,整个模型的厚度H,六边形之间的间隙gap。

材料选择玻璃。

脚本编写

首先尝试根据六边形端点坐标生成中心的六边形。

deleteall; #create the hexagon in the center theta=pi/6; vtx=[R*cos(theta),R*sin(theta); 0,R; -R*cos(theta),R*sin(theta); -R*cos(theta),-R*sin(theta); 0,-R; R*cos(theta),-R*sin(theta)]; addpoly; set('name','hexagon'); set('vertices',vtx); set('z span',H); set('material',glass);

可以看到成功生成了一个六边形,但这样的写法不具有普遍性,可以将其简化。

deleteall; vtx=zeros(6,2); for(i=1:6) { vtx(i,1)=R*cos(pi/6+(i-1)*pi/3); vtx(i,2)=R*sin(pi/6+(i-1)*pi/3); } addpoly; set('name','hexagon'); set('vertices',vtx); set('z span',H); set('material',glass);

加下来可以构建周围的六个六边形。六边形的中心点坐标可以通过一个循环得出,而端点的坐标计算与中心六边形的计算方法相同,只要在坐标上加上中心点的x,y值变化即可。

for(i=0:6) { Nx=(2*R*cos(pi/6)+gap)*cos(0+(i-1)*pi/3); Ny=(2*R*cos(pi/6)+gap)*sin(0+(i-1)*pi/3); vtx=zeros(6,2); for(j=1:6) { vtx(j,1)=R*cos(pi/6+(j-1)*pi/3)+Nx; vtx(j,2)=R*sin(pi/6+(j-1)*pi/3)+Ny; } addpoly; set('name','hexagon'+num2str(i)); set('vertices',vtx); set('z span',H); set('material',glass); }

可以看出,绘制中心六边形的代码和绘制周围六边形的代码重合度非常高,其不同点就在于周围六边形的端点坐标加上了中心点的平移,因此可以将他们整合到一起。设定一个判断条件,在绘制中心六边形的时候将中心点的平移置为0即可满足要求。

deleteall; #create the hexagon for(i=0:6) { if (i==0) { Nx=0; Ny=0; } else { Nx=(2*R*cos(pi/6)+gap)*cos(0+(i-1)*pi/3); Ny=(2*R*cos(pi/6)+gap)*sin(0+(i-1)*pi/3); } vtx=zeros(6,2); for(j=1:6) { vtx(j,1)=R*cos(pi/6+(j-1)*pi/3)+Nx; vtx(j,2)=R*sin(pi/6+(j-1)*pi/3)+Ny; } addpoly; set('name','hexagon'+num2str(i)); set('vertices',vtx); set('z span',H); set('material',glass); } 生成结果

附完整代码 ######################################## #modeling exercise #draw a couple of hexagons #edited by jializhang,20210417 deleteall; #create the hexagon for(i=0:6) { if (i==0) { Nx=0; Ny=0; } else { Nx=(2*R*cos(pi/6)+gap)*cos((i-1)*pi/3); Ny=(2*R*cos(pi/6)+gap)*sin((i-1)*pi/3); } vtx=zeros(6,2); for(j=1:6) { vtx(j,1)=R*cos(pi/6+(j-1)*pi/3)+Nx; vtx(j,2)=R*sin(pi/6+(j-1)*pi/3)+Ny; } addpoly; set('name','hexagon'+num2str(i)); set('vertices',vtx); set('z span',H); set('material',glass); }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有