Wie kann ich bei einem Array von Atomen ABABAB in einem hexagonalen Muster Mathematica zum Erstellen verwenden? mit einem hexagonalen Gitter (unendlich) mit diesem Array, so dass jedes Atom A nur von B-Atomen umgeben ist und umgekehrt.
Kommentare
- Hola Jose , willkommen bei Mathematica.SE. Meinen Sie grafisches Gitter, eine notwendigerweise endliche Darstellung oder eine analytische Beschreibung eines Gitters? Wahrscheinlich könnten Sie mehr Details darüber geben, was Sie damit vorhaben, damit es Ihnen leichter hilft.
- ein endliches Gitter, das durch ein hexagonales Muster mit 2 Atomen gegeben ist, zum Beispiel wie dieses google.es/… , aber mit 2 Atomen statt einem (Graphen)
- Verwandte: 19165 , 14632 .
- Auch verwandt: Wolfram-Demo
- Einige Kenntnisse der Festkörperphysik erleichtern dies.
Antwort
In 2D
unitCell[x_, y_] := { Red , Disk[{x, y}, 0.1] , Blue , Disk[{x, y + 2/3 Sin[120 Degree]}, 0.1] , Gray, , Line[{{x, y}, {x, y + 2/3 Sin[120 Degree]}}] , Line[{{x, y}, {x + Cos[30 Degree]/2, y - Sin[30 Degree]/2}}] , Line[{{x, y}, {x - Cos[30 Degree]/2, y - Sin[30 Degree]/2}}] }
Dadurch wird die Einheitszelle
Graphics[unitCell[0, 0], ImageSize -> 100]
Wir platzieren es in einem Gitter
Graphics[ Block[ { unitVectA = {Cos[120 Degree], Sin[120 Degree]} ,unitVectB = {1, 0} }, Table[ unitCell @@ (unitVectA j + unitVectB k) , {j, 1, 12} , {k, Ceiling[j/2], 20 + Ceiling[j/2]} ] ], ImageSize -> 500 ]
In 3D
unitCell3D[x_, y_, z_] := { Red , Sphere[{x, y, z}, 0.1] , Blue , Sphere[{x, y + 2/3 Sin[120 Degree], z}, 0.1] , Gray , Cylinder[{{x, y, z}, {x, y +2/3 Sin[120 Degree], z}}, 0.05] , Cylinder[{{x, y, z}, {x + Cos[30 Degree]/2, y - Sin[30 Degree]/2, z}}, 0.05] , Cylinder[{{x, y, z}, {x - Cos[30 Degree]/2, y - Sin[30 Degree]/2, z}}, 0.05] } Graphics3D[ Block[ {unitVectA = {Cos[120 Degree], Sin[120 Degree], 0}, unitVectB = {1, 0, 0} }, Table[unitCell3D @@ (unitVectA j + unitVectB k), {j, 20}, {k, 20}]] , PlotRange -> {{0, 10}, {0, 10}, {-1, 1}} ]
Kommentare
- ok danke …: D
- Großartige Antwort, die sowohl 2d als auch 3d berücksichtigt!
Antwort
In 2D
Manipulate[( basis = {{s, 0}, {s/2, s Sqrt[3]/2}}; points = Tuples[Range[0, max], 2].basis; Graphics[Point[points], Frame -> True, AspectRatio -> Automatic]) , {s, 0.1, 1} , {max, 2, 10} ]
Antwort
Eine andere Möglichkeit ist die Verwendung von GeometricTransformation
, die möglicherweise schneller gerendert wird, jedoch durch .
With[{base = Line[{ {{-(1/2), -(1/(2 Sqrt[3]))}, {0, 0}}, {{0, 0}, {0, 1/Sqrt[3]}}, {{0, 0}, {1/2, -(1/(2 Sqrt[3]))}} }] }, Graphics[{ GeometricTransformation[ base, Flatten@Array[ TranslationTransform[ {1/2, -(1/(2 Sqrt[3]))} + {#1 + If[OddQ[#2], 1/2, 0], #2 Sqrt[3]/2} ] &, {16, 16} ] ] }] ]
Dies funktioniert nicht, ohne $IterationLimit
zu erhöhen, wenn Sie {16, 16}
durch {128, 128}
.
Antwort
Es gibt nur wenige Ressourcenfunktionen, die beim Erstellen hexagonaler Gitter helfen können . Der folgende Code stammt aus den Beispielen von HextileBins
.
HextileBins
hexes2 = Keys[ ResourceFunction["HextileBins"][ Flatten[Table[{x, y}, {x, 0, 16}, {y, 0, 12}], 1], 2]]; Graphics[{EdgeForm[Blue], FaceForm[Opacity[0.1]], hexes2}]
lsBCoords = Union[Flatten[First /@ hexes2, 1]];
Graphics[{EdgeForm[Blue], hexes2 /. Polygon[p_] :> Line[Append[p, First[p]]], Red, PointSize[0.02], Point[lsBCoords]}]
HexagonalGridGraph
(Beachten Sie, dass diese Funktion von Wolfram Research übermittelt wird.)
grHex = ResourceFunction["HexagonalGridGraph"][{16, 12}]
lsVCoords = GraphEmbedding[grHex]; lsVCoords[[1 ;; 12]]
(* {{0, 0}, {0, 2}, {Sqrt[3], -1}, {Sqrt[3], 3}, {2 Sqrt[3], 0}, {Sqrt[ 3], 5}, {2 Sqrt[3], 2}, {2 Sqrt[3], 6}, {3 Sqrt[3], -1}, {3 Sqrt[3], 3}, {2 Sqrt[3], 8}, {3 Sqrt[3], 5}} *)
grHexPolygons = Map[Polygon@(List @@@ #)[[All, 1]] &, FindCycle[grHex, {6, 6}, All]] /. v_Integer :> lsVCoords[[v]]; Graphics[{EdgeForm[Blue], FaceForm[Opacity[0.2]], grHexPolygons}]