主程序
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