抱歉之前的代码没有正确地对数据进行居中处理。为了正确将有数据的六边形区域居中,我们需要重新计算显示矩阵的大小,然后将填满数据的新矩阵放在中心位置。
我们可以通过以下步骤确保结果正确居中:
1. 计算填满后的六边形阵列实际占用的尺寸。
2. 根据实际尺寸创建一个更大的矩阵,并将数据放在中心位置。
以下是修正后的 MATLAB 代码:
- % 清除变量并关闭所有图形窗口
- clear;
- close all;
- clc;
- % 参数设置
- matrixSize = 50; % 矩阵的大小 (例如 50x50)
- hexRadius = 10; % 六边形的半径
- % 创建一个示例矩阵数据
- data = rand(matrixSize);
- % 计算六边形的顶点
- theta = (0:5) * pi/3;
- % 创建中心六边形的掩码
- [X, Y] = meshgrid(1:matrixSize, 1:matrixSize);
- centerX = matrixSize / 2;
- centerY = matrixSize / 2;
- % 计算每个点是否在六边形内
- hexMask = inpolygon(X, Y, centerX + hexRadius * cos(theta), centerY + hexRadius * sin(theta));
- % 使用掩码移除六边形外的数据
- maskedData = data;
- maskedData(~hexMask) = 0; % 将六边形外的数据清零
- % 显示掩码后的矩阵
- figure;
- imagesc(maskedData);
- colormap('hot');
- title('Masked Data with Central Hexagon');
- % 阵列操作:紧密排列形成多个六边形分布的矩阵数据
- numHexagonsPerRow = 3; % 每行多少个六边形
- numHexagonsPerCol = 3; % 每列多少个六边形
- % 计算整个矩阵的所需大小
- arrayWidth = ceil((numHexagonsPerRow + 0.5) * 1.5 * hexRadius);
- arrayHeight = ceil((numHexagonsPerCol + 0.5) * sqrt(3) * hexRadius);
- % 初始化全局阵列矩阵
- globalMatrix = zeros(arrayHeight, arrayWidth);
- % 填充全局矩阵,形成紧密排列的六边形分布
- for i = 0:(numHexagonsPerCol - 1)
- for j = 0:(numHexagonsPerRow - 1)
- offsetX = j * 1.5 * hexRadius;
- offsetY = i * sqrt(3) * hexRadius;
- if mod(j, 2) == 1
- offsetY = offsetY + (sqrt(3) / 2) * hexRadius;
- end
- % 定义插入位置
- xPos = round(offsetX + hexRadius);
- yPos = round(offsetY + hexRadius);
- % 边界检查:确保插入的索引不超出全局矩阵尺寸
- if xPos + matrixSize - 1 <= size(globalMatrix, 2) && yPos + matrixSize - 1 <= size(globalMatrix, 1)
- xRange = xPos:(xPos + matrixSize - 1);
- yRange = yPos:(yPos + matrixSize - 1);
- maskedXRng = 1:length(xRange);
- maskedYRng = 1:length(yRange);
- globalMatrix(yRange, xRange) = globalMatrix(yRange, xRange) + maskedData(maskedYRng, maskedXRng);
- end
- end
- end
- % 计算中心化所需的总矩阵尺寸
- outputSize = max(size(globalMatrix)) + matrixSize;
- centeredGlobalMatrix = zeros(outputSize, outputSize);
- % 中心定位
- centeringOffset_x = floor((outputSize - size(globalMatrix, 2)) / 2);
- centeringOffset_y = floor((outputSize - size(globalMatrix, 1)) / 2);
- % 将已填充数据置于中心
- centeredGlobalMatrix(centeringOffset_y + 1:centeringOffset_y + size(globalMatrix, 1), ...
- centeringOffset_x + 1:centeringOffset_x + size(globalMatrix, 2)) = globalMatrix;
- % 显示居中的结果
- figure;
- imagesc(centeredGlobalMatrix);
- colormap('hot');
- title('Centered Tightly Packed Arrayed Hexagonal Data');
复制代码
### 修正与改进
- **适当扩展了 `arrayWidth` 和 `arrayHeight`**,以便为每个六边形提供足够的间隔。
- **调整了中心化策略**,在最终显示时,利用 `centeredGlobalMatrix` 将数据置于画布中央。
- **确保 `xRange` 和 `yRange` 不会超过全局矩阵的尺寸**。
这种方法保证序列化的六边形数据位于结果图像的中心。
--- 光学专家Gpt |