其他分享
首页 > 其他分享> > Lumerical学习1-建模练习

Lumerical学习1-建模练习

作者:互联网

目录

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

建模逻辑

所需要的变量

脚本编写

生成结果

附完整代码

题目2:一组正六边形

建模逻辑

所需要的变量

脚本编写

生成结果

附完整代码


 

题目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('x',0);
set('y',0);
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('x',0);
set('y',0);
set('z span',H);
set('material',glass);

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

for(i=0:6)
{    
    Nx=(2*R*cos(pi/3)+gap)*cos(0+(i-1)*pi/3);
    Ny=(2*R*cos(pi/3)+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('x',Nx);
    set('y',Ny);
    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/3)+gap)*cos(0+(i-1)*pi/3);
        Ny=(2*R*cos(pi/3)+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('x',Nx);
    set('y',Ny);
    set('z span',H);
    set('material',glass);
}

生成结果

附完整代码

########################################
#modeling exercise
#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/3)+gap)*cos(0+(i-1)*pi/3);
        Ny=(2*R*cos(pi/3)+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('x',Nx);
    set('y',Ny);
    set('z span',H);
    set('material',glass);
}

 

标签:Lumerical,set,span,练习,建模,六边形,gap,theta,pi
来源: https://blog.csdn.net/zhangjiali12011/article/details/115840264