Gegeven een array van atomen ABABAB in een hexagonaal patroon, hoe kan ik Mathematica gebruiken om met een hexagonaal rooster (oneindig) met deze array, zodat elk atoom A alleen wordt omringd door B-atomen en vice versa.
Opmerkingen
- Hola Jose , welkom bij Mathematica.SE. Bedoel je een grafisch rooster, een plot dat noodzakelijkerwijs eindig is, of een analytische beschrijving van een rooster? Waarschijnlijk zou je meer details kunnen geven over wat je ermee wilt doen, zodat het gemakkelijker is om je te helpen.
- een eindig rooster gegeven door een hexagonaal patroon met 2 atomen bijvoorbeeld zoals dit google.es/… maar met 2 atomen in plaats van één (grafeen)
- Gerelateerd: 19165 , 14632 .
- Ook gerelateerd: Wolfram Demo
- Enige kennis van Solid State Physics maakt het gemakkelijker.
Antwoord
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}}] }
Hierdoor wordt de eenheidscel gemaakt
Graphics[unitCell[0, 0], ImageSize -> 100]
We plaatsen het in een rooster
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}} ]
Reacties
- ok bedankt …: D
- Geweldig antwoord, ik vond het leuk om zowel 2D als 3D te overwegen!
Antwoord
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} ]
Antwoord
Een andere manier is om GeometricTransformation
te gebruiken, wat mogelijk sneller wordt weergegeven, maar wordt beperkt door $IterationLimit
.
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} ] ] }] ]
Dit werkt niet zonder $IterationLimit
te verhogen wanneer u {16, 16}
vervangt door {128, 128}
.
Antwoord
Er zijn weinig bronfuncties die kunnen helpen bij het maken van zeshoekige roosters . De onderstaande code is afkomstig uit de voorbeelden van 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
(Merk op dat deze functie afkomstig is van Wolfram Research.)
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}]