Criando grade hexagonal (gráfico de grade hexagonal)
Existe uma função que pode criar uma grade hexagonal?
Temos um gráfico de grade quadrada, onde podemos especificar as m*ndimensões:
GridGraph[{m, n}]
Temos um gráfico de grade triangular (que funciona apenas para argumentos naté 10 - por motivo desconhecido):
GraphData[{"TriangularGrid", n}, "Graph"]
Não consigo encontrar uma função que gere um gráfico de grade hexagonal. Eu gostaria que fosse GridGraphalgo como HexagonalGridGraph[{m,n,o}]onde m,n,oestão as dimensões m*n*odo gráfico planar - ou de outra forma - "comprimentos" dos lados do gráfico.
Posso fazer meu próprio código, estou perguntando caso já exista uma função implementada.
ATUALIZAR:
O que quero dizer com m*n*ograde hexagonal é, por exemplo, esta 3*5*7grade hexagonal:
Meu código para produzi-lo é muito longo e complicado, então não vou carregá-lo, a menos que possa torná-lo mais simples.
Respostas
Com IGraph / M :
IGMeshGraph@IGLatticeMesh["Hexagonal", {6, 4}]
Também podemos recortá-lo em um hexágono:
IGMeshGraph@IGLatticeMesh["Hexagonal", Polygon@CirclePoints[10, 6]]
Ele também pode gerar muitos outros tipos de reticulados, não apenas hexagonais.
Aqui está minha generalização do código do link fornecido por @LouisB:
HexagonalGridGraph2[{wide1_Integer?Positive, wide2_Integer?Positive,
wide3_Integer?Positive}, opts : OptionsPattern[Graph]] :=
Module[{cells, edges, vertices},
cells =
Flatten[Table[
CirclePoints[{Sqrt[3] (1 j + k - 2 ) + Sqrt[3] (1 j + l - 2 ),
3 k - 2 - 3 l}, {2, \[Pi]/2}, 6], {j, wide1}, {k, wide2}, {l,
wide3}], 2];
edges = Union[Sort /@ Flatten[Partition[#, 2, 1, 1] & /@ cells, 1]];
vertices = Union[Flatten[edges, 1]];
IndexGraph[
Graph[UndirectedEdge @@@ edges, opts,
VertexCoordinates -> Thread[vertices -> vertices]]]]
E aqui estão alguns exemplos:
Sort /@ Tuples[Range[4], {3}] // Union;
Partition[
Rasterize /@ (HexagonalGridGraph2[#, PlotLabel -> #,
ImageSize -> {100, 100}] & /@ %), 5];
ImageAssemble[%]
Podemos gerar as coordenadas do vértice usando uma versão ligeiramente modificada do azerbajdan cellse usá-las com NearestNeighborGraph:
ClearAll[vCoords]
vCoords = DeleteDuplicates @ Flatten[
Table[CirclePoints[{(2 j + k + l - 4) Sqrt[3] , 3 k - 2 - 3 l}, {2, π/2}, 6],
{j, #}, {k, #2}, {l, #3}], 3] &;
ClearAll[hexGridGraph]
hexGridGraph = Module[{v = vCoords @@ #},
NearestNeighborGraph[v, ##2, VertexCoordinates -> v]] &;
Exemplos:
hexGridGraph[{3, 5, 7},
VertexLabels -> Placed["Index", Center],
VertexSize -> .7,
VertexStyle -> White,
VertexLabelStyle -> 8,
ImageSize -> 400]
args = Sort /@ Tuples[Range[4], {3}] // Union;
hexGridGraph[#, PlotLabel -> #, ImageSize -> {100, 100}] & /@ args //
Multicolumn[#, 5] &
Você pode fazer uma grade hexagonal usando apenas funções internas do MMA. Você pode adaptar o código ao seu gosto:
c3 = Cos[30 Degree]; s3 = Sin[30 Degree];
del1 = {Sqrt[c3^2 + Sqrt[(1 + s3^2)^2 + c3^3]], c3} // N;
del2 = {-Sqrt[c3^2 + Sqrt[(1 + s3^2)^2 + c3^3]], c3} // N;
del3 = {0, 2 c3};
trans[del_] := Map[(del + #) &, hex, {2}];
n = 3;
grid = Flatten[
Table[trans[i1 del1 + i2 del2 + i3 del3], {i1, n}, {i2, n}, {i3,
n}], 2];
Graphics[Line /@ grid]
Há uma função de recursos que faz gráficos hexagonais: HexagonalGridGraph. (Contribuição do WRI.)