from ... util.util import pointOnCircle
import math
[docs]def calc_ring_pixel_count(rings):
num = 0
for r in rings:
num += len(r)
return num
[docs]def calc_ring_steps(rings):
steps = []
for r in rings:
steps.append(360.0 / len(r))
return steps
[docs]def make_circle_coord_map(rings=None, pixels_per=None, offset=0, invert=False):
if pixels_per:
rings = []
for c in pixels_per:
rings.append([offset, offset + c])
offset = offset + c
if not rings:
raise ValueError('Must specify rings or pixels_per')
if rings:
num = 0
out_rings = []
for r in rings:
if len(r) != 2:
raise ValueError(
'"rings" values must only be first and last index.')
if r[0] < r[1]:
indices = list(range(r[0], r[1]))
else:
indices = list(range(r[1], r[0]))[::-1]
out_rings.append(indices)
num += len(indices)
if invert:
out_rings = out_rings[::-1]
return (out_rings, calc_ring_steps(out_rings))
[docs]def make_circle_coord_map_positions(
rings, origin=(0, 0, 0), z_diff=0, radii=None):
if len(origin) not in [2, 3]:
raise ValueError('origin must be (x,y) or (x,y,z)')
use_z = len(origin) == 3
if use_z:
ox, oy, oz = origin
else:
ox, oz = origin
num = calc_ring_pixel_count(rings)
steps = calc_ring_steps(rings)
points = [None] * num
z = 0
for i in range(len(rings)):
r = rings[i]
step = steps[i]
angle = 0.0
for p in r:
if radii:
radius = radii[i]
else:
radius = (len(r) - 1) * math.pi
x, y = pointOnCircle(0, 0, radius, angle)
if use_z:
points[p] = (x + ox, y + oy, z + oz)
else:
points[p] = (x + ox, y + oy)
angle += step
z += z_diff
return points