sites := {(x0, y0), (x1, y1), ..., (xn-1, yn-1)}
pad := padding (some number)
n := number of sites
xl := minimum x-coordinate in sites (left)
xr := maximum x-coordinate in sites (right)
yt := maximum y-coordinate in sites (top)
yb := minimum y-coordinate in sites (bottom)
Box := {(xl-pad,yt+pad), (xr+pad,yt+pad), (xr+pad,yb-pad), (xl-pad,yb-pad)}
cells := {}
for each i in {0, 1, ..., n-1} do:
cell := Box
site := sites[i]
for each j in {0, 1, ..., n-1} do:
if i = j, continue with next iteration
m := length(cell) *number of vertices in cell*
new_cell := {}
next := sites[j]
bisector := two_points_bisector(site, next) *perpendicular bisector of site and next*
for each k in {0, 1, ..., m-1} do:
A := cell[k]
B := cell[(k+1) mod m]
egde := segment(A, B)
if bisector intersects edge, then:
t := intersection(edge, bisector)
if t = B, then:
new_cell := {B, cell[(k+2) mod m]}
first_intersection_index := (k+2) mod m
otherwise:
new_cell := {t, B}
first_intersection_index := (k+1) mod m
finish loop
if new_cell = {}, then:
new_cell := cell
otherwise:
for each k in {first_intersection_index, first_intersection_index+1, ..., m-1} do:
A := cell[k]
B := cell[(k+1) mod m]
egde := segment(A, B)
if bisector intersects edge, then:
u := intersection(edge, bisector)
new_cell ∪ {u} *add u to new_cell*
second_intersection_index := k+1;
finish loop
otherwise:
new_cell ∪ {B} *add B to new_cell*
if site is not in new_cell, then:
new_cell := {u}
while second_intersection_index mod m ≠ first_intersection_index do:
v := cell[second_intersection_index mod m]
new_cell ∪ {v} *add v to new_cell*
second_intersection_index := second_intersection_index + 1
new_cell ∪ {t} *add t to new_cell*
cell = new_cell
cells ∪ {cell} *add cell to cells*
cells
good code thanks