很高兴听到结果的改善!要在图像中显示每个六边形区域的边界,我们可以使用 `plot` 函数绘制六边形边界。同时,为了把整体图像移动到正中心位置,我们需要调整最终图像的边距。
以下是实现这几个功能的代码:
- % 清除变量并关闭所有图形窗口
- clear;
- close all;
- clc;
- % 参数设置
- matrixSize = 50; % 单个六边形矩阵的大小
- hexRadius = 20; % 六边形的半径
- % 创建一个示例矩阵数据
- 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) = NaN; % 将六边形外的数据置为 NaN
- % 阵列操作:紧密排列形成多个六边形分布的矩阵数据
- numHexagonsPerRow = 5; % 每行多少个六边形
- numHexagonsPerCol = 5; % 每列多少个六边形
- % 紧密排列时,计算整体阵列大小
- effectiveHexWidth = 1.5 * hexRadius; % 每个六边形的有效宽度
- effectiveHexHeight = sqrt(3) * hexRadius; % 每个六边形的有效高度
- arrayWidth = ceil(numHexagonsPerRow * effectiveHexWidth + matrixSize);
- arrayHeight = ceil(numHexagonsPerCol * effectiveHexHeight + matrixSize);
- % 初始化全局阵列矩阵
- globalMatrix = NaN(arrayHeight, arrayWidth); % 使用 NaN 初始化以帮助可视化调试
- % 绘制图像
- figure;
- hold on;
- for i = 0:(numHexagonsPerCol - 1)
- for j = 0:(numHexagonsPerRow - 1)
- offsetX = j * effectiveHexWidth;
- offsetY = i * effectiveHexHeight;
- if mod(j, 2) == 1
- offsetY = offsetY + effectiveHexHeight / 2; % 交错排列
- end
- % 定义插入位置
- xPos = round(offsetX + 1);
- yPos = round(offsetY + 1);
- % 获取插入范围
- xRange = xPos:min(xPos + matrixSize - 1, arrayWidth);
- yRange = yPos:min(yPos + matrixSize - 1, arrayHeight);
- % 插入掩码数据,保持现有的数据不变,只替换 NaN 部分
- for yi = 1:length(yRange)
- for xi = 1:length(xRange)
- if isnan(globalMatrix(yRange(yi), xRange(xi))) && ~isnan(maskedData(yi, xi))
- globalMatrix(yRange(yi), xRange(xi)) = maskedData(yi, xi);
- end
- end
- end
- % 绘制六边形边界
- hexX = centerX + offsetX + hexRadius * cos(theta);
- hexY = centerY + offsetY + hexRadius * sin(theta);
- plot(hexX, hexY, 'k', 'LineWidth', 1);
- end
- end
- % 显示图像
- imagesc(globalMatrix);
- colormap('hot');
- colorbar;
- set(gca, 'Color', 'w');
- % 居中图像
- xlim([min(min(find(~isnan(globalMatrix)))), max(max(find(~isnan(globalMatrix))))]);
- ylim([min(min(find(~isnan(globalMatrix')))), max(max(find(~isnan(globalMatrix'))))]);
- title('Tightly Packed Arrayed Hexagonal Data with Borders');
- axis equal;
- hold off;
复制代码
### 说明:
- **绘制边界**:使用 `plot` 函数在每个位置绘制六边形的边界。
- **居中调整**:通过 `xlim` 和 `ylim` 控制图像显示在中心。通过寻找非 `NaN` 的值来设置范围。
- **`hold on/off`**:确保在同一图形上进行绘图。
这应该能够正确显示每个六边形的边界,并将整个六边形阵列居中显示。
--- 光学专家Gpt |