双层魔角石墨烯的坐标生成

主程序

theta = 9.43/180*pi;
[pos1,pos2] = make_BDG_graphene(theta);             % 生成一大片魔角石墨烯
KeyPoint = find_same_Point(pos1, pos2);             % 找到重合点
[L1,L2] = find_lattice_vector(KeyPoint);            % 找到晶格矢量
[xv,yv] = get_polygon(L1,L2);                       % 找到晶格矢量构成平行四边
% plot(xv,yv,'color','red','LineWidth',2);
[pos1_,pos2_]=get_aim_lattice(pos1,pos2,xv,yv);     % 获取原胞内格点
a = 0.246;                                          % 实际的晶格常数
d0=0.335;                                           % z方向的高度
pos1_(:,1:2)=pos1_(:,1:2)*a;                        % 将晶格大小处理为实际大小
pos2_(:,1:2)=pos2_(:,1:2)*a;
pos2_(:,3) = pos2_(:,3)*10*d0;
xv = xv*a;
yv = yv*a;
plot(pos1_(:,1),pos1_(:,2),'.','markersize',15)
hold on
plot(pos2_(:,1),pos2_(:,2),'.','markersize',15)
plot(xv,yv,'color','red','LineWidth',2);

生成一大块魔角石墨烯函数

function [pos,pos2] = make_BDG_graphene(theta)
nx=100;
ny=100;
[x,y]=zigzag_graphene(nx,ny);               %生成大块石墨烯
%%%%%%%%% 排序找中点 %%%%%%%%%%%%%%%%%%%%%%
tempX = sort(x);
tempY = sort(y);                            
%将中间坐标平移到原点
xMid = tempX(length(tempX)/2);
yMid = tempY(length(tempY)/2);
x = x - xMid*ones(length(x),1);
y = y - yMid*ones(length(y),1);
z = zeros(length(x),1);
pos = [x,y];
pos2 = zeros(length(x),2);                         % 第二层坐标 
% theta = 1.47/180*pi;                               % 旋转角度由文献给出
for i=1:length(x)
    pos2(i,:) = (rotate_matirx(theta)*pos(i,:)')'; % 旋转矩阵      
end
pos=[pos,z];
z2 = z + 0.1*ones(length(x),1);
pos2=[pos2,z2];

找到重合点函数

function KeyPoint = find_same_Point(pos1, pos2)
eps = 0.001;
% 找到上下两层重合的点
KeyPoint = [];
for i=1:length(pos1)
    for j=1:length(pos1)
        if abs(pos1(i,1)-pos2(j,1))<eps && abs(pos1(i,2)-pos2(j,2))<eps
            KeyPoint = [KeyPoint;pos1(i,:)];
        end
    end
end

找晶格矢量函数

function [L1,L2] = find_lattice_vector(KeyPoint)
G = sortrows(KeyPoint,1);
% plot(G(:,1),G(:,2),'.','markersize',14);
L1 = G(1,:)-G(2,:);
L1 = L1(:,1:2);                         % L1 是超晶格常数
L2 = (rotate_matirx(-pi/3)*L1')';       % L2 是另一个超晶格常数

生成晶格矢量构成的平行四边形

function [xv,yv] = get_polygon(L1,L2)
P=[0,0];
P = [P;L1];
P = [P;L1+L2];
P = [P;L2];
xv=P(:,1);
yv=P(:,2);
xv=[xv;0];
yv=[yv;0];

找出平行四边形内部格点

function [pos1_,pos2_]=get_aim_lattice(pos1,pos2,xv,yv)
pos1_ = [];
pos2_ = [];
for i=1:length(pos1)
    if inpolygon(pos1(i,1),pos1(i,2),xv,yv)>0
        pos1_=[pos1_;pos1(i,:)];
    end
    if inpolygon(pos2(i,1),pos2(i,2),xv,yv)>0
        pos2_=[pos2_;pos2(i,:)];
    end
end

 

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值