Criando grade hexagonal (gráfico de grade hexagonal)

Oct 08 2020

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

11 Szabolcs Oct 08 2020 at 18:46

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.

10 azerbajdzan Oct 08 2020 at 20:05

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[%]

8 kglr Oct 09 2020 at 03:08

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] &

5 DanielHuber Oct 08 2020 at 19:34

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]

1 AntonAntonov Nov 12 2020 at 21:21

Há uma função de recursos que faz gráficos hexagonais: HexagonalGridGraph. (Contribuição do WRI.)