% 清除命令窗口中的所有内容
clc
% 清除工作区中的所有变量
clear all

% 从 '1Z_Ture.xlsx' 文件中导入数据，并将其存储在变量 Z_ALL 中
Z_ALL = importdata('1Z_Ture.xlsx');
% 对 Z_ALL 中的每个元素进行转换：(6000 - 元素值) * 0.001
Z_ALL = (6000 - Z_ALL) * 0.001;

% 从 Z_ALL 中提取每一列的数据，分别存储在不同的变量中
zz0 = Z_ALL(:, 1);   
zz1 = Z_ALL(:, 2);   
zz2 = Z_ALL(:, 3);   
zz3 = Z_ALL(:, 4);   
zz4 = Z_ALL(:, 5);   
zz5 = Z_ALL(:, 6);   
zz6 = Z_ALL(:, 7);   
zz7 = Z_ALL(:, 8);   
zz8 = Z_ALL(:, 9);   
zz9 = Z_ALL(:, 10);   
zz10 = Z_ALL(:, 11);   
zz11 = Z_ALL(:, 12);   

% 从 '1y0.xlsx' 文件中导入数据，并将其存储在变量 original_data1 中
original_data1 = importdata('1y0.xlsx'); 
% 从 '1z0.xlsx' 文件中导入数据，并将其存储在变量 original_data2 中
original_data2 = importdata('1z0.xlsx'); 

% 获取 original_data1 的行数和列数，分别存储在 length1 和 width1 中
[length1, width1] = size(original_data1);
% 获取 original_data2 的行数和列数，分别存储在 length2 和 width2 中
[length2, width2] = size(original_data2);

% 提取每一道的厚度信息，分别存储在不同的变量中
hou0 = original_data1(:, 2);
hou1 = original_data1(:, 4);
hou2 = original_data1(:, 6);
hou3 = original_data1(:, 8);
hou4 = original_data1(:, 10);
hou5 = original_data2(:, 2);
hou6 = original_data2(:, 4);
hou7 = original_data2(:, 6);
hou8 = original_data2(:, 8);
hou9 = original_data2(:, 10);
hou10 = original_data2(:, 12);
hou11 = original_data2(:, 14);

% 找出 zz0 中所有有限值的索引
z0_0 = isfinite(zz0(:));
% 根据索引提取 zz0 中的有限值，存储在 z0_1 中
z0_1 = zz0(z0_0);  
% 找出 z0_1 中的最小值，乘以 100 后四舍五入，存储在 MinZ0 中
MinZ0 = round(min(z0_1) * 100); 
% 生成一个从 1 到 MinZ0 - 10 的序列，每个元素除以 100 后存储在 MIZ0 中
for i = 1:1:MinZ0 - 10    
    MIZ0(i) = i / 100; 
end

% 找出 zz1 中所有有限值的索引
z1_0 = isfinite(zz1(:));
% 根据索引提取 zz1 中的有限值，存储在 z1_1 中
z1_1 = zz1(z1_0); 
% 找出 z1_1 中的最小值，乘以 100 后四舍五入，存储在 MinZ1 中
MinZ1 = round(min(z1_1) * 100); 
% 生成一个从 1 到 MinZ1 的序列，每个元素除以 100 后存储在 MIZ1 中
for i = 1:1:MinZ1    
    MIZ1(i) = i / 100; 
end

% 计算 zz2 的最小值相关
z2_0 = isfinite(zz2(:));
z2_1 = zz2(z2_0);  
MinZ1 = round(min(z1_1) * 100); 
for i = 1:1:MinZ1    
    MIZ1(i) = i / 100; 
end


z3_0 = isfinite(zz3(:));
z3_1 = zz3(z3_0); 
MinZ1 = round(min(z1_1) * 100); 
for i = 1:1:MinZ1    
    MIZ1(i) = i / 100; 
end


z4_0 = isfinite(zz4(:));
z4_1 = zz4(z4_0); 
MinZ1 = round(min(z1_1) * 100); 
for i = 1:1:MinZ1    
    MIZ1(i) = i / 100; 
end

% 找出 zz5 中所有有限值的索引，并提取有限值存储在 z5_1 中，提取有效值去除NAN和INF
z5_0 = isfinite(zz5(:));
z5_1 = zz5(z5_0);  

% 找出 zz6 中所有有限值的索引
z6_0 = isfinite(zz6(:));
z6_1 = zz6(z6_0);
% 找出 zz7 中所有有限值的索引
z7_0 = isfinite(zz7(:));
z7_1 = zz7(z7_0);
% 找出 zz8 中所有有限值的索引
z8_0 = isfinite(zz8(:));
z8_1 = zz8(z8_0);

% 找出 zz9 中所有有限值的索引
z9_0 = isfinite(zz9(:));
z9_1 = zz9(z9_0);
% 找出 zz10 中所有有限值的索引
z10_0 = isfinite(zz10(:));
z10_1 = zz10(z10_0);
% 找出 zz11 中所有有限值的索引
z11_0 = isfinite(zz11(:));
z11_1 = zz11(z11_0);

% 找出 hou0 中所有有限值的索引
hou0_0 = isfinite(hou0(:));
hou0_1 = hou0(hou0_0);
% 找出 hou1 中所有有限值的索引
hou1_0 = isfinite(hou1(:));
hou1_1 = hou1(hou1_0);
% 找出 hou2 中所有有限值的索引
hou2_0 = isfinite(hou2(:));
hou2_1 = hou2(hou2_0);

% 找出 hou3 中所有有限值的索引
hou3_0 = isfinite(hou3(:));
hou3_1 = hou3(hou3_0);
% 找出 hou4 中所有有限值的索引
hou4_0 = isfinite(hou4(:));
hou4_1 = hou4(hou4_0);
% 找出 hou5 中所有有限值的索引
hou5_0 = isfinite(hou5(:));
hou5_1 = hou5(hou5_0);

% 找出 hou6 中所有有限值的索引
hou6_0 = isfinite(hou6(:));
hou6_1 = hou6(hou6_0);
% 找出 hou7 中所有有限值的索引
hou7_0 = isfinite(hou7(:));
hou7_1 = hou7(hou7_0);
% 找出 hou8 中所有有限值的索引
hou8_0 = isfinite(hou8(:));
hou8_1 = hou8(hou8_0);

% 找出 hou9 中所有有限值的索引
hou9_0 = isfinite(hou9(:));
hou9_1 = hou9(hou9_0);
% 找出 hou10 中所有有限值的索引
hou10_0 = isfinite(hou10(:));
hou10_1 = hou10(hou10_0);
% 找出 hou11 中所有有限值的索引
hou11_0 = isfinite(hou11(:));
hou11_1 = hou11(hou11_0);

% 定义筒壁半径为 6
r = 6;
% 初始化索引变量 v 为 1
v = 1;

% 以 0.5 为起始值，步长为 2，到 8.5 结束进行循环
for u01 = 0.5:2:8.5
    % 计算角度 u1
    u1 = u01 * 360 / (2 * 3.14 * r);
    % 计算 x 坐标，存储在 x1 的第 v 个位置
    x1(v) = r * cos(pi / (180 / u1));
    % 计算 y 坐标，存储在 y1 的第 v 个位置
    y1(v) = r * sin(pi / (180 / u1));
    % 索引变量 v 加 1
    v = v + 1;
end

% 初始化索引变量 v2 为 1
v2 = 1;
% 以 0.5 为起始值，步长为 2，到 12.5 结束进行循环
for u02 = 0.5:2:12.5
    % 计算角度 u2
    u2 = u02 * 360 / (2 * 3.14 * r);
    % 如果 u2 小于等于 90 度
    if u2 <= 90
        % 计算 x 坐标，存储在 x2 的第 v2 个位置
        x2(v2) = -r * cos(pi / (180 / u2));
        % 计算 y 坐标，存储在 y2 的第 v2 个位置
        y2(v2) = r * sin(pi / (180 / u2));
    end
    % 如果 u2 大于 90 度
    if u2 > 90
        % 计算 x 坐标，存储在 x2 的第 v2 个位置
        x2(v2) = -r * cos(pi / (180 / (u2 - 90)));
        % 计算 y 坐标，存储在 y2 的第 v2 个位置
        y2(v2) = -r * sin(pi / (180 / (u2 - 90)));
    end
    % 索引变量 v2 加 1
    v2 = v2 + 1;
end

% 将 x1 和 x2 合并成一个矩阵 X_ALL
X_ALL = [x1 x2];
% 将 y1 和 y2 合并成一个矩阵 Y_ALL
Y_ALL = [y1 y2];

% 计算每个高度数据列的有效数据长度，存储在 Z_NUM 中
Z_NUM = [max(size(z0_1)) max(size(z1_1)) max(size(z2_1)) max(size(z3_1)) max(size(z4_1)) max(size(z5_1)) max(size(z6_1)) max(size(z7_1)) max(size(z8_1)) max(size(z9_1)) max(size(z10_1)) max(size(z11_1))];

% 将第一道的相关数据（x、y、高度、厚度）存储到 Data_all 矩阵中
for i = 1:1:Z_NUM(1)
    Data_all(i, :) = [X_ALL(1) Y_ALL(1) zz0(i)  hou0(i)];
end

% 将 MIZ0 相关的数据（x、y、高度、厚度为 0）存储到 Data_all_1 矩阵中
for i = 1:1:max(size(MIZ0))
    Data_all_1(i, :) = [X_ALL(1) Y_ALL(1) MIZ0(i)  0];
end

% 初始化 NUM_ILL 为第一道的有效数据长度
NUM_ILL = Z_NUM(1);
% 将第二道的相关数据（x、y、高度、厚度）追加到 Data_all 矩阵中
for i = 1:1:Z_NUM(2)
    Data_all(NUM_ILL + i, :) = [X_ALL(2) Y_ALL(2) zz1(i)  hou1(i)];
end

% 更新 NUM_ILL 的值
NUM_ILL = NUM_ILL + Z_NUM(2);
% 将第三道的相关数据（x、y、高度、厚度）追加到 Data_all 矩阵中
for i = 1:1:Z_NUM(3)
    Data_all(NUM_ILL + i, :) = [X_ALL(3) Y_ALL(3) zz2(i)  hou2(i)];
end

% 依次类推，将后续各道的相关数据追加到 Data_all 矩阵中
NUM_ILL = NUM_ILL + Z_NUM(3);
for i = 1:1:Z_NUM(4)
    Data_all(NUM_ILL + i, :) = [X_ALL(4) Y_ALL(4) zz3(i)  hou3(i)];
end

NUM_ILL = NUM_ILL + Z_NUM(4);
for i = 1:1:Z_NUM(5)
    Data_all(NUM_ILL + i, :) = [X_ALL(5) Y_ALL(5) zz4(i)  hou4(i)];
end

NUM_ILL = NUM_ILL + Z_NUM(5);
for i = 1:1:Z_NUM(6)
    Data_all(NUM_ILL + i, :) = [X_ALL(6) Y_ALL(6) zz5(i)  hou5(i)];
end

NUM_ILL = NUM_ILL + Z_NUM(6);
for i = 1:1:Z_NUM(7)
    Data_all(NUM_ILL + i, :) = [X_ALL(7) Y_ALL(7) zz6(i)  hou6(i)];
end

NUM_ILL = NUM_ILL + Z_NUM(7);
for i = 1:1:Z_NUM(8)
    Data_all(NUM_ILL + i, :) = [X_ALL(8) Y_ALL(8) zz7(i)  hou7(i)];
end

NUM_ILL = NUM_ILL + Z_NUM(8);
for i = 1:1:Z_NUM(9)
    Data_all(NUM_ILL + i, :) = [X_ALL(9) Y_ALL(9) zz8(i)  hou8(i)];
end

NUM_ILL = NUM_ILL + Z_NUM(9);
for i = 1:1:Z_NUM(10)
    Data_all(NUM_ILL + i, :) = [X_ALL(10) Y_ALL(10) zz9(i)  hou9(i)];
end

NUM_ILL = NUM_ILL + Z_NUM(10);
for i = 1:1:Z_NUM(11)
    Data_all(NUM_ILL + i, :) = [X_ALL(11) Y_ALL(11) zz10(i)  hou10(i)];
end

NUM_ILL = NUM_ILL + Z_NUM(11);
for i = 1:1:Z_NUM(12)
    Data_all(NUM_ILL + i, :) = [X_ALL(12) Y_ALL(12) zz11(i)  hou11(i)];
end

% 找出 Data_all 矩阵中第三列（高度）的最小值，乘以 100 后存储在 Val_min 中
Val_min = min(Data_all(:, 3)) * 100;
% 找出 Data_all 矩阵中第三列（高度）的最大值，乘以 100 后存储在 Val_max 中
Val_max = max(Data_all(:, 3)) * 100;



% 定义一个常量 RR，作为后续生成圆形数据时的半径，这里设定为 6
RR = 6;
% 初始化一个索引变量 i，用于在循环中给数组 X、Y、Z 和 Cc 赋值，初始值为 1
i = 1;

% 外层循环，u01 从 0*2 开始，以步长 1 递增，直到 600*2 结束
% 此循环控制生成数据的 z 坐标值，u01 会被用于计算 Z 数组中的元素
for u01 = 0*2:1:600*2
    % 内层循环，u02 从 1 开始，以步长 1 递增，直到 3.14*200 结束
    % 此循环控制生成数据的 x 和 y 坐标值，u02 会被用于计算 X 和 Y 数组中的元素
    for u02 = 1:1:3.14*200
        % 根据当前的 u02 和 RR 计算当前点的 x 坐标，使用三角函数 cos 计算
        % u02 先除以 100 以得到合适的角度值，再计算 cos 结果乘以半径 RR
        X(i) = RR * cos(u02/100);
        % 根据当前的 u02 和 RR 计算当前点的 y 坐标，使用三角函数 sin 计算
        % u02 先除以 100 以得到合适的角度值，再计算 sin 结果乘以半径 RR
        Y(i) = RR * sin(u02/100);
        % 根据当前的 u01 计算当前点的 z 坐标
        % u01 先除以 100 再除以 2 得到合适的高度值
        Z(i) = u01/100/2;
        % 圆柱体不给厚度，因此  Cc(i) = 0;
        Cc(i) = 0;
        % 索引变量 i 自增 1，以便为下一个数据点赋值
        i = i + 1;
    end
end

% 将数组 X、Y、Z 和 Cc 进行转置后按列合并成一个矩阵 MMM
% 矩阵 MMM 的每一行代表一个数据点，包含 x、y、z 坐标和 厚度
MMM = [X' Y' Z' Cc'];

% 生成矩阵 Origin_ABCD，将 Data_all 矩阵的前 3 列（即 x、y、z 坐标）乘以 1000
% 然后与 Data_all 矩阵的第 4 列（厚度信息）按列合并
% 乘以 1000 可能是为了进行单位转换等操作
Origin_ABCD = [Data_all(:, 1:3)*1000  Data_all(:, 4)];

% 将矩阵 MMM 中的每个元素乘以 1000，进行单位转换等操作
% 结果存储在矩阵 Origin_EFGH 中
Origin_EFGH = MMM * 1000;









