2D Brillouin Zones
The first Brillouin zone is a set of points in reciprocal space that can be reached from a specific point of origin without crossing any Bragg planes.

Import["E:\\Users\\Jurgis\\EPFL\\Courses\\1st semester\\Modelling problem solving, computing and visualisation I\\Final project\\reciprocal_lattice.png"]

First, let’s define the Bravais lattice and the primitive cell.
A Bravais lattice is a geometrical periodic pattern within the crystal, where all the lattice points are equivalent. A primitive cell corresponds to a single lattice point with discrete translational symmetry.
Any fundamental crystal lattice must be definable by three primitive translational vectors: (Subscript[a, 1]), a2, (Subscript[a, 3]). The combination of these vectors is used to define the crystal translational vector “r”
r =  (Subscript[a, 1]) (Subscript[n, 1])+(Subscript[a, 2]) (Subscript[n, 2])+ (Subscript[a, 3])(Subscript[n, 3])
Where (Subscript[n, n]) are  arbitrary integers and (Subscript[r, 1]) another translational vector, which means that the whole crystal structure must look the same in every aspect viewed from either r or (Subscript[r, 1]).
Reciprocal space
Every lattice has a reciprocal lattice associated to it. 
In 3D, the lattice vectors would be (Subscript[b, 1]), (Subscript[b, 2]) and (Subscript[b, 3]). And they can be denoted as:
(Subscript[b, 1]) = 2 π((Subscript[a, 2])x (Subscript[a, 3]))÷((Subscript[a, 1])*((Subscript[a, 2])x (Subscript[a, 3])))
(Subscript[b, 2]) = 2 π((Subscript[a, 1])x (Subscript[a, 3]))÷((Subscript[a, 1])*((Subscript[a, 2])x (Subscript[a, 3])))
(Subscript[b, 3]) = 2 π((Subscript[a, 1])x (Subscript[a, 2]))÷((Subscript[a, 1])*((Subscript[a, 2])x (Subscript[a, 3])))
   

For simplicity’s sake, let’s look at a transformation from a 2D direct lattice to a reciprocal lattice.

A simple visualization for direct lattice and reciprocal lattice vectors.

reciprocalLattice

braggPlanes

brillouinZone

brillouinZoneTriangle

The visualization made using the demonstartion made by:
 Jaroslaw W. Klos
“2D Brillouin Zones”
 http://demonstrations.wolfram.com/2DBrillouinZones/
 Wolfram Demonstrations Project
 Published: May 16, 2013

brillouinZone := Manipulate[
Module[{mnmax,rng,imgsize,pp,a1,a2, points, fig1, fig2,fig3},
mnmax=5;rng=2.05;imgsize=380;pp=50;
a1={1,0};
a2={0,1};
points=Table[n a1+m a2,{n,-mnmax,mnmax},{m,-mnmax,mnmax}]//Flatten[#,1]&//Select[#,Norm[#]<mnmax&]&;
f[p_]:=((0<(((#[[1]])^2)+((#[[2]])^2))<(2(p[[1]]#[[1]]+p[[2]]#[[2]])))&/@(points))//Count[#,True]&;
fig1=points//ListPlot[#,PlotStyle->Directive[PointSize[Large],Red],Axes->False]&;fig2=ContourPlot[#,{x,-rng,rng},{y,-rng,rng},ContourStyle->Black]&/@(#[[1]]x+#[[2]]y==1/2(((#[[1]])^2)+((#[[2]])^2))&/@points);
fig3=Table[RegionPlot[f[{x,y}]==n-1,{x,-rng,rng},{y,-rng,rng},PlotPoints->pp,PlotStyle->Hue[(n-1)/9 0.75],FrameTicks->None],{n,If[ssel,nn,1],nn}];
If[bpon,
Show[fig3,fig2,fig1,ImageSize->imgsize,AspectRatio->1],
Show[fig3,fig1,ImageSize->imgsize,AspectRatio->1]
]],
"number of Brillouin zones",
{{nn,3,""},1,9,1,ImageSize->Tiny,Appearance->"Labeled",ControlType->Slider},
Delimiter,
"outermost Brillouin zone only:",
{{ssel,True,""},{True,False}},
Delimiter,
"show Bragg planes",
{{bpon,True,""},{True,False}},
ControlPlacement->Left,
SynchronousUpdating->False,
AutorunSequencing->{1},
TrackedSymbols:> {nn, ssel, bpon}
]

braggPlanes :=Manipulate[
Module[{rng,mnmax, imgsize,pp,a1,a2, points, points1,points2,fig1, fig2},
rng=2.5;imgsize=380;pp=50;mnmax = 2;
a1={1,0};
a2={0,1};
points1 = {{-1,0}, {0,1}, {0,0}, {0,-1}, {1,0}};
points=Table[n a1+m a2,{n,-mnmax,mnmax},{m,-mnmax,mnmax}]//Flatten[#,1]&//Select[#,Norm[#]<mnmax&]&;
points2 = {{-1,0}, {0,1}, {0,0}, {0,-1}, {1,0}, {1,1}, {-1,1}, {-1,-1}, {1,-1}, {-2,0}, {2,0}, {0,2}, {0, -2}};
f[p_]:=((0<(((#[[1]])^2)+((#[[2]])^2))<(2(p[[1]]#[[1]]+p[[2]]#[[2]])))&/@(points))//Count[#,True]&;
fig1=If[ssel ==1,points1 ,If[ ssel ==2, points , points2]]//ListPlot[#,PlotStyle->Directive[PointSize[Large],Red],Axes->False]&;fig2=ContourPlot[(#[[1]]x+#[[2]]y==1/2(((#[[1]])^2)+((#[[2]])^2))),{x,-rng,rng},{y,-rng,rng},ContourStyle->Black, FrameTicks->None]&/@ If[ssel ==1,points1 ,If[ ssel ==2, points , points2]];
Show[fig2,fig1,ImageSize->imgsize,AspectRatio->1
]],
Delimiter,
"Number of Brag planes",
{{ssel,1,""},1, 3, 1, ImageSize-> Tiny,Appearance-> "Labeled", ControlType->Slider},
ControlPlacement->Left,
SynchronousUpdating->False,
AutorunSequencing->{1},
TrackedSymbols:> { ssel}
]

reciprocalLattice :=Manipulate[
Module[{latticePoints, vectorA, vectorB, lattice, recVecA, recVecB},
latticePoints = Table[m {2,0}+n{0,2},{m, -1,4}, {n, -1,4}];
vectorA = Arrow[{{0,0}, {x,0}}];
vectorB =Arrow[{{0,0}, {0,y}}];
recVecA = Arrow[{{0,0}, {2 Pi/x, 0}}];
recVecB = Arrow[{{0,0}, {0, 2 Pi/y}}];
lattice = ListPlot[latticePoints, Axes->False,PlotStyle->Directive[PointSize[Large],Red]];
Show[{If[rl,Graphics[vectorA],Graphics[recVecA]], If[rl,Graphics[vectorB], Graphics[recVecB]],lattice}]
],
"Length of the direct x vector",{{x, 1, ""},1, 8, 0.1, ImageSize-> Tiny, ControlType-> Slider},
"Length of the direct y vector",{{y, 1, ""},1,8, 0.1, ImageSize-> Tiny, ControlType-> Slider},
"Direct lattice", {{rl, True, ""},{False, True}}, Delimiter, 
ControlPlacement->Left,
TrackedSymbols:>{x, y, rl}]

brillouinZoneTriangle :=Manipulate[
Module[{mnmax,rng,imgsize,pp,a1,a2, points, fig1, fig2,fig3},
mnmax=5;rng=2.05;imgsize=380;pp=50;
a1={1,0};
a2={1/2,(Sqrt[3])/2};
points=Table[n a1+m a2,{n,-mnmax,mnmax},{m,-mnmax,mnmax}]//Flatten[#,1]&//Select[#,Norm[#]<mnmax&]&;
f[p_]:=((0<(((#[[1]])^2)+((#[[2]])^2))<(2(p[[1]]#[[1]]+p[[2]]#[[2]])))&/@(points))//Count[#,True]&;
fig1=points//ListPlot[#,PlotStyle->Directive[PointSize[Large],Red],Axes->False]&;fig2=ContourPlot[#,{x,-rng,rng},{y,-rng,rng},ContourStyle->Black]&/@(#[[1]]x+#[[2]]y==1/2(((#[[1]])^2)+((#[[2]])^2))&/@points);
fig3=Table[RegionPlot[f[{x,y}]==n-1,{x,-rng,rng},{y,-rng,rng},PlotPoints->pp,PlotStyle->Hue[(n-1)/9 0.75],FrameTicks->None],{n,If[ssel,nn,1],nn}];
If[bpon,
Show[fig3,fig2,fig1,ImageSize->imgsize,AspectRatio->1],
Show[fig3,fig1,ImageSize->imgsize,AspectRatio->1]
]],
"number of Brillouin zones",
{{nn,3,""},1,9,1,ImageSize->Tiny,Appearance->"Labeled",ControlType->Slider},
Delimiter,
"outermost Brillouin zone only:",
{{ssel,True,""},{True,False}},
Delimiter,
"show Bragg planes",
{{bpon,True,""},{True,False}},
ControlPlacement->Left,
SynchronousUpdating->False,
AutorunSequencing->{1},
TrackedSymbols:> {nn, ssel, bpon}
]