为了确保矩阵中有效数据(六边形)在水平方向上也居中显示,我们需要正确计算非 `NaN` 数据的边界,并调整 `xlim` 和 `ylim` 以使显示窗口的中心对准有效数据的中心。这意味着我们应该根据非 `NaN` 数据的位置设置显示范围,以便水平和垂直方向上的居中。以下是改进后的代码:
- % 清除变量并关闭所有图形窗口
- 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');
- % 计算全局矩阵中有效数据的范围
- [rowInd, colInd] = find(~isnan(globalMatrix));
- xmin = min(colInd);
- xmax = max(colInd);
- ymin = min(rowInd);
- ymax = max(rowInd);
- % 设置显示范围,使图像处于正中心
- xlim([(xmin + xmax)/2 - arrayWidth/4, (xmin + xmax)/2 + arrayWidth/4]);
- ylim([(ymin + ymax)/2 - arrayHeight/4, (ymin + ymax)/2 + arrayHeight/4]);
- title('Tightly Packed Arrayed Hexagonal Data with Borders');
- axis equal;
- hold off;
复制代码
### 说明:
- **绘图范围设置**:`xlim` 和 `ylim` 都基于有效数据的中心位置设置,计算时分别取数据范围的中点并增加一个合理的偏移量以达到居中效果。
- **`find` 函数使用**:找出全局矩阵中非 `NaN` 的数据位置,得到整个有效数据的边界。
- **适当的调整**:通过计算有效数据的中心点来设置显示范围,从而确保图像在视图中的正中心。
--- 光学专家Gpt |