Alternative approach works but looks bad

This commit is contained in:
jaseg 2025-12-17 10:22:19 +01:00
parent 87033c116f
commit 82eccbad1d
2 changed files with 35 additions and 40 deletions

View file

@ -578,8 +578,8 @@ class PlanarInductor():
xv, yv = self.shape.project_point(r, fold_angle, r_ref=refs_layer0[-1])
footprint.lines.append(kicad.make_line(*points_layer0[-1], xv, yv, self.trace_width, self.layer_pair[0]))
footprint.lines.append(kicad.make_line(xv, yv, *points_layer1[0], self.trace_width, self.layer_pair[1]))
#footprint.lines.append(kicad.make_line(*points_layer0[-1], xv, yv, self.trace_width, self.layer_pair[0]))
#footprint.lines.append(kicad.make_line(xv, yv, *points_layer1[0], self.trace_width, self.layer_pair[1]))
footprint.pads.append(kicad.make_via(xv, yv,
self.via_diameter, self.via_drill, self.clearance,

View file

@ -31,6 +31,14 @@ def interpolate(p1, p2, t, t_start=0, t_end=1):
return (x1 + t*dx, y1 + t*dy)
def interpolate_1d(a, b, t, t_start=0, t_end=1):
if math.isclose(t_start, t_end):
return a
t_range = t_end - t_start
t = (t - t_start) / t_range
return a + (b-a) * t
def approx_in_range(value, lower, upper):
""" Approximate range check """
if math.isclose(value, lower) or math.isclose(value, upper):
@ -278,7 +286,8 @@ class Skeletonator:
return t_map_int + ia2
else:
return t_map_int + ia1 + (ia2 - ia1) * ((t - oa1) / (oa2 - oa1))
def do_spiral(self, t1, t2, r1=None, r2=None):
print(f' {t1=:.5f} {t2=:.5f} {r1=:.2f} {r2=:.2f}')
if r1 is None:
@ -290,46 +299,32 @@ class Skeletonator:
t1, t2 = t2, t1
r1, r2 = r2, r1
def r_interpolate(t):
f = (t - t1) / (t2 - t1)
f = min(1, max(0, f)) # Clip to start/end of spiral
return r1 + (r2 - r1) * f
angle_map = []
circumferences = []
n = 100
radius_steps = [r1 + (r2 - r1) * i/(n-1) for i in range(n)]
angle_steps = [t1 + (t2 - t1) * i/(n-1) for i in range(n)]
for r in radius_steps:
_ic_arcs, circumference = self.map_circumference(r)
circumference_sum = sum(math.dist(p1, p2) for p1, p2 in edge_cycle(circumference))
circumferences.append(circumference_sum)
r_ref = min(r1, r2) # r_start, r_end) # Handle outward spirals where the radii are swapped
_ic_arcs, inner_circumference = self.map_circumference(r_ref)
inner_circumference_sum = sum(math.dist(p1, p2) for p1, p2 in edge_cycle(inner_circumference))
angle = 0
point_angles = [0]
for p1, p2 in edge_cycle(circumference):
edge_angle = math.dist(p1, p2) / circumference_sum
angle += edge_angle
point_angles.append(angle)
angle_map.append(point_angles)
angle = 0
point_angles = [0]
for p1, p2 in edge_cycle(inner_circumference):
edge_angle = math.dist(p1, p2) / inner_circumference_sum
angle += edge_angle
point_angles.append(angle)
if r1 > r2:
t1 = self.map_angle(t1, r1, r2)
else:
t2 = self.map_angle(t2, r1, r2)
turn_angles = range(math.floor(t1), math.ceil(t2) + 1)
for t_start, t_end in zip(turn_angles, turn_angles[1:]):
t_end = t_start + 1
for (p1, p2), (tp1, tp2) in zip(self.poly_edges, itertools.pairwise(point_angles)):
tp1, tp2 = tp1 + t_start, tp2 + t_start
rp1 = r_interpolate(tp1)
rp2 = r_interpolate(tp2)
_arc, p1_proj = self.project_arc(p1, rp1)
_arc, p2_proj = self.project_arc(p2, rp2)
for r, t, point_angles in zip(radius_steps, angle_steps, angle_map):
for (p1, p2), (tp1, tp2) in zip(self.poly_edges, itertools.pairwise(point_angles + point_angles[:1])):
_arc, p1_proj = self.project_arc(p1, r)
_arc, p2_proj = self.project_arc(p2, r)
if approx_in_range(t1, tp1, tp2):
_arc, p2_proj_r1 = self.project_arc(p2, r1)
yield interpolate(p1_proj, p2_proj_r1, t1, tp1, tp2), r_ref
if approx_in_range(t2, tp1, tp2):
_arc, p1_proj_r2 = self.project_arc(p1, r2)
yield interpolate(p1_proj_r2, p2_proj, t2, tp1, tp2), r_ref
elif approx_in_range(tp2, t1, t2):
yield p2_proj, r_ref
if approx_in_range(t%1, tp1, tp2):
yield interpolate(p1_proj, p2_proj, t%1, tp1, tp2), r
def dump_to_pdf(self, filename):
with PdfPages(filename) as pdf: