Source code for diplomat.utils.point_spread_patterns
from math import ceil, sqrt
[docs]
def L1(n):
denominator = ceil(sqrt(n)) - 1.0
return 1.0 / max(1.0, denominator)
[docs]
def L2(n):
denominator = ceil(sqrt(n + 1.0)) - 3.0 + sqrt(2.0 + sqrt(3.0))
return 1.0 / max(1.0, denominator)
[docs]
def L3a(n):
denominator = ceil(sqrt(n + 2.0)) - 2.0 + (0.5 * sqrt(3.0))
return 1.0 / max(1.0, denominator)
[docs]
def L3b(n):
denominator = ceil(sqrt(n + 2.0)) - 5.0 + (2.0 * sqrt(2.0 + sqrt(3.0)))
return 1.0 / max(1.0, denominator)
[docs]
def L4(n):
m = ceil(sqrt(2.0 * n))
for k in range(1, m + 1):
if n == k * (k + 1.0):
numerator = k**2.0 - k - sqrt(2.0 * k)
if numerator == 0:
return 0
denominator = k**3.0 - (2.0 * k**2.0)
return numerator / denominator
return 0
[docs]
def L5(n):
m = ceil(sqrt(4.0 * n))
for p in range(1, m + 1):
for q in range(1, m + 1):
if (p**2 < 3 * q**2) and (q**2 < 3 * p**2):
if n == ceil(((p + 1) * (q + 1)) / 2):
return sqrt((1 / p**2) + (1 / q**2))
return 0
[docs]
def approximate_maxmin_distance(n):
if n == 3:
return sqrt(6) - sqrt(2)
else:
return max(L1(n), L2(n), L3a(n), L3b(n), L4(n), L5(n))