# Calculate the 1st Brillouin zone with given lattice basis vectors

Given two basis vectors in the 2-dimensional momentum space b1, b2, I want to write a function that returns the 1st Brillouin zone:

BrillouinZone[b1_, b2_] := ...


which is defined as the region made of points that are closer to the origin of the reciprocal lattice than they are to any other reciprocal lattice points (see Wikipedia). For example, the reciprocal basis vectors of the square lattice are

b1 = {2 Pi, 0};
b2 = {0, 2 Pi};


The function BrillouinZone should return a region that is the same as the square

Polygon[{Pi, Pi}, {-Pi, Pi}, {-Pi, -Pi}, {Pi, -Pi}]


How to achieve this (efficiently) in Mathematica?

BrillouinZone[b1_, b2_] :=
CanonicalizePolygon[First[Select[
MeshPrimitives[
VoronoiMesh[Catenate@Table[i b1 + j b2, {i, -1, 1}, {j, -1, 1}]], 2],
RegionMember[#, {0, 0}] &]]];

b1 = {2 Pi, 0};
b2 = {0, 2 Pi};
bz = BrillouinZone[b1, b2]

Show[Graphics[{FaceForm[None], EdgeForm[Black], bz}], Axes -> True]