IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 晶界研究程序 -> 正文阅读

[数据结构与算法]晶界研究程序

matlab获得蜂窝六边形程序

clear
clc
%%
%下面得到六边形的蜂窝形状。
%这里需要输出一个文件,data=zeros(n,8),其数据格式如下;
%n代表晶界的数量。
%第一到二列:表示晶界第一个端点的横纵坐标,即初始点。
%第三到四列:表示晶界第二个端点的横纵坐标,即被扩展点。
%第五到六列:表示晶界的平移向量。
%第七列:表示晶界的方向。
%第八到九列:表示晶界的旋转正余弦值。
%以三角形的方式向外扩展。
%输入六边形边长;
num=7;
a=10^(-8);
center=[0,0];
point={};
%首先初始化三角形的三条边坐标;
point{1}(1,:)=[a,0,-a/2,a*3^(0.5)/2];
point{1}(2,:)=[-a/2,a*3^(0.5)/2,-a/2,-a*3^(0.5)/2];
point{1}(3,:)=[-a/2,-a*3^(0.5)/2,a,0];
dir1=zeros(3,2);
for i=1:3
    dir1(i,:)=((point{1}(i,1:2)-point{1}(i,3:4)))/norm(point{1}(i,1:2)-point{1}(i,3:4));
end
dir2=zeros(3,2);
dir2(1,:)=([a/2,a*3^(0.5)/2]-[-a/2,-a*3^(0.5)/2])/norm([a/2,a*3^(0.5)/2]-[-a/2,-a*3^(0.5)/2]);
dir2(2,:)=[1,0];
dir2(3,:)=([a/2,-a*3^(0.5)/2]-[-a/2,a*3^(0.5)/2])/norm([a/2,-a*3^(0.5)/2]-[-a/2,a*3^(0.5)/2]);
compare=1;
%下面开始扩展,num表示扩展的次数
while(compare<num)
    [m,~]=size(point{compare});
    point_sum=0;
    leng=3*a/2;
  for i=1:m
      direc=(point{compare}(i,1:2)-point{compare}(i,3:4))/norm((point{compare}(i,1:2)-point{compare}(i,3:4)));
      center=(point{compare}(i,1:2)+point{compare}(i,3:4))/2;
      %%
      judge=zeros(1,3);
        for t=1:3
            temp1=abs(sum(direc-dir1(t,:)));
            temp2=abs(sum(direc+dir1(t,:)));
            if(temp1<=1*10^(-15)||temp2<=1*10^(-15))
                judge(t)=1;
            end
        end
       if(judge(1)==0&&judge(2)==0&&judge(3)==0)
            tt=[direc];
       end
      %%
      if(judge(1))
          point_direct=dir2(1,:);
          tem_point1=leng*point_direct+center;
          tem_point2=-leng*point_direct+center;
          %将这两个点的坐标存入point{compare}之中。
          point_sum=point_sum+1;
          point{compare+1}(point_sum,1:2)=tem_point1;  
          point{compare+1}(point_sum,3:4)=point{compare}(i,1:2);
          point_sum=point_sum+1;
          point{compare+1}(point_sum,1:2)=tem_point1;  
          point{compare+1}(point_sum,3:4)=point{compare}(i,3:4);
          point_sum=point_sum+1;
          point{compare+1}(point_sum,1:2)=tem_point2;  
          point{compare+1}(point_sum,3:4)=point{compare}(i,1:2);
          point_sum=point_sum+1;
          point{compare+1}(point_sum,1:2)=tem_point2;  
          point{compare+1}(point_sum,3:4)=point{compare}(i,3:4);
      end
      if(judge(2))
          point_direct=dir2(2,:);
          tem_point1=leng*point_direct+center;
          tem_point2=-leng*point_direct+center;
          %将这两个点的坐标存入point{compare}之中。
          point_sum=point_sum+1;
          point{compare+1}(point_sum,1:2)=tem_point1;  
          point{compare+1}(point_sum,3:4)=point{compare}(i,1:2);
          point_sum=point_sum+1;
          point{compare+1}(point_sum,1:2)=tem_point1;  
          point{compare+1}(point_sum,3:4)=point{compare}(i,3:4);
          point_sum=point_sum+1;
          point{compare+1}(point_sum,1:2)=tem_point2;  
          point{compare+1}(point_sum,3:4)=point{compare}(i,1:2);
          point_sum=point_sum+1;
          point{compare+1}(point_sum,1:2)=tem_point2;  
          point{compare+1}(point_sum,3:4)=point{compare}(i,3:4);
      end
      if(judge(3))
          point_direct=dir2(3,:);
          tem_point1=leng*point_direct+center;
          tem_point2=-leng*point_direct+center;
          %将这两个点的坐标存入point{compare}之中。
          point_sum=point_sum+1;
          point{compare+1}(point_sum,1:2)=tem_point1;  
          point{compare+1}(point_sum,3:4)=point{compare}(i,1:2);
          point_sum=point_sum+1;
          point{compare+1}(point_sum,1:2)=tem_point1;  
          point{compare+1}(point_sum,3:4)=point{compare}(i,3:4);
          point_sum=point_sum+1;
          point{compare+1}(point_sum,1:2)=tem_point2;  
          point{compare+1}(point_sum,3:4)=point{compare}(i,1:2);
          point_sum=point_sum+1;
          point{compare+1}(point_sum,1:2)=tem_point2;  
          point{compare+1}(point_sum,3:4)=point{compare}(i,3:4);
      end
  end
  compare=compare+1;
end
%上面获得了所需点的坐标。
%下面整合该点,并且选出不重复的坐标点
%%
tem1=[];
for i=1:compare
    tem1=[tem1;point{i}(:,1:2);point{i}(:,3:4)];
end
tem1=unique(tem1,"rows");
tt=tem1;
[m,~]=size(tem1);
for i=1:m-1
    for j=(i+1):m
        distance=norm(tem1(i,:)-tem1(j,:));
        if(distance<10^(-13))
            tem1(j,:)=[10^20,10^20];
        end
    end
end
pp=0;
points_end=[];
for i=1:m
    if(tem1(i,:)~=[10^20,10^20])
        pp=pp+1;
        points_end(pp,:)=tem1(i,:);
    end
end
[m,n]=size(points_end);
for i=1:m
    for j=1:n
        if(abs(points_end(i,j)-0)<10^(-14))
            points_end(i,j)=0;
        end        
    end
end
plot(points_end(:,1),points_end(:,2),"*");
%%
%下面开始将points_end这些点扩展为边;
data=zeros(3*m,9);
%按照顺时针的方向扩展,角度依次为0120240度,使用123来区分。
dir1=[1,0];
dir2=([-a/2,a*3^(0.5)/2])/norm([-a/2,a*3^(0.5)/2]);
dir3=([-a/2,-a*3^(0.5)/2])/norm([-a/2,-a*3^(0.5)/2]);
dir=[dir1;dir2;dir3];
for i=1:m
    for j=1:3
      data(3*(i-1)+j,7)=j;
      data(3*(i-1)+j,1:2)=points_end(i,:);
      %接下来扩展下一个点。
      data(3*(i-1)+j,3:4)=a*dir(j,:)+points_end(i,:);
    end
end
tem1=[data(:,1:2);data(:,3:4)];
plot(tem1(:,1),tem1(:,2),"*");
%%
%下面求得坐标变换规则。
center1=([0,0]+[a,0])/2;
center2=([0,0]+[-a/2,a*3^(0.5)/2])/2;
center3=([0,0]+[-a/2,-a*3^(0.5)/2])/2;
center_point=[center1;center2;center3];
T=[1,0;-1/2,3^(0.5)/2;-1/2,-3^(0.5)/2];%旋转矩阵的正弦和余弦值。
for i=1:m
    for j=1:3
       center=(data(3*(i-1)+j,1:2)+data(3*(i-1)+j,3:4))/2;
       data(3*(i-1)+j,5:6)=center-center_point(j,:);
       data(3*(i-1)+j,8:9)=T(j,:);
    end
end
for i=1:3*m
    for j=1:4
        if(abs(data(i,j))<10^(-15))
           data(i,j)=0;
        end
    end
end
%下面我们将其写入到txt文件中
fid=fopen("grain_boundary_message_data.txt","w");
for i=1:3*m
    for j=1:9
      fprintf(fid,"%g",data(i,j));
      fprintf(fid,"%s","        ");
    end
      fprintf(fid,"%s\n","              ");
end
%%
for i=1:3*m
    plot([data(i,1),data(i,3)],[data(i,2),data(i,4)]);
    hold on
end
a1=max(max(data(:,1:4)));
a2=min(min(data(:,1:4)));
%%
%这里验证一下坐标变换规则
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 01:25:35  更:2022-02-19 01:26:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:43:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码