58 lines
2.8 KiB
Matlab
58 lines
2.8 KiB
Matlab
function Honeycombs
|
|
nRows = 4; % Number of rows
|
|
nCols = 5; % Number of columns
|
|
nHexs = nRows*nCols; % Number of hexagons
|
|
rOuter = 1; % Circumradius
|
|
startX = 0; % x-coordinate of upper left hexagon
|
|
startY = 0; % y-coordinate of upper left hexagon
|
|
delX = rOuter*1.5; % Horizontal distance between hexagons
|
|
delY = rOuter*sqrt(3); % Vertical distance between hexagons
|
|
offY = delY/2; % Vertical offset between columns
|
|
genHexX = rOuter.*cos(2.*pi.*(0:5).'./6); % x-coords of general hexagon
|
|
genHexY = rOuter.*sin(2.*pi.*(0:5).'./6); % y-coords of general hexagon
|
|
centX = zeros(1, nHexs); % x-coords of hexagon centers
|
|
centY = zeros(1, nHexs); % y-coords of hexagon centers
|
|
for c = 1:nCols
|
|
idxs = (c-1)*nRows+1:c*nRows; % Indeces of hexagons in that column
|
|
if mod(c, 2) % Odd numbered column - higher y-values
|
|
centY(idxs) = startY:-delY:startY-delY*(nRows-1);
|
|
else % Even numbered column - lower y-values
|
|
centY(idxs) = startY-offY:-delY:startY-offY-delY*(nRows-1);
|
|
end
|
|
centX(idxs) = (startX+(c-1)*delX).*ones(1, nRows);
|
|
end
|
|
[MCentX, MGenHexX] = meshgrid(centX, genHexX);
|
|
[MCentY, MGenHexY] = meshgrid(centY, genHexY);
|
|
HexX = MCentX+MGenHexX; % x-coords of hexagon vertices
|
|
HexY = MCentY+MGenHexY; % y-coords of hexagon vertices
|
|
figure
|
|
hold on
|
|
letters = char([65:90 97:122]);
|
|
randIdxs = randperm(26);
|
|
letters = [letters(randIdxs) letters(26+randIdxs)];
|
|
hexH = zeros(1, nHexs);
|
|
for k = 1:nHexs % Create patches individually
|
|
hexH(k) = patch(HexX(:, k), HexY(:, k), [1 1 0]);
|
|
textH = text(centX(k), centY(k), letters(mod(k, length(letters))), ...
|
|
'HorizontalAlignment', 'center', 'FontSize', 14, ...
|
|
'FontWeight', 'bold', 'Color', [1 0 0], 'HitTest', 'off');
|
|
set(hexH(k), 'UserData', textH) % Save to object for easy access
|
|
end
|
|
axis equal
|
|
axis off
|
|
set(gca, 'UserData', '') % List of clicked patch labels
|
|
set(hexH, 'ButtonDownFcn', @onClick)
|
|
end
|
|
|
|
function onClick(obj, event)
|
|
axesH = get(obj, 'Parent');
|
|
textH = get(obj, 'UserData');
|
|
set(obj, 'FaceColor', [1 0 1]) % Change color
|
|
set(textH, 'Color', [0 0 0]) % Change label color
|
|
set(obj, 'HitTest', 'off') % Ignore future clicks
|
|
currList = get(axesH, 'UserData'); % Hexs already clicked
|
|
newList = [currList get(textH, 'String')]; % Update list
|
|
set(axesH, 'UserData', newList)
|
|
title(newList)
|
|
end
|