code wiki / _hdl_build / nx_viz_pack.nx

nx_viz_pack.nx source

↩ module page · 39 lines · 1642 B

1// nx_viz_pack.nx -- the CIRCLE-PACK layer of the sovereign Nishi viz library (the d3-hierarchy pack core, bits-up). 2// Greedy spiral placement: largest circle at centre, each subsequent circle spirals outward to the first 3// non-overlapping spot (checked via vs_isqrt distance). Deterministic, non-overlapping BY CONSTRUCTION. Radii are 4// caller-supplied (r = isqrt(value)*k for area-proportional bubbles). Closes layout-pack. license_tier: ORIGINAL 5import "nx_viz_trig.nx" 6import "nx_syscalls.nx" 7const K_MAGIC_10000: i64 = 10000 8const K_MAGIC_200000: i64 = 200000 9 10func vp_pack(n: i64, r: *i64, xs: *i64, ys: *i64) -> i64 { 11 if n <= 0 { return 0 } 12 xs[0] = 0; ys[0] = 0 13 var i: i64 = 1 14 while i < n { 15 var placed: i64 = 0 16 var rad: i64 = 4 17 while placed == 0 { 18 var ang: i64 = 0 19 while ang < 360 { 20 let px: i64 = (rad * vs_cos(ang)) / K_MAGIC_10000 21 let py: i64 = (rad * vs_sin(ang)) / K_MAGIC_10000 22 var ok: i64 = 1 23 var j: i64 = 0 24 while j < i { 25 let dx: i64 = px - xs[j] 26 let dy: i64 = py - ys[j] 27 let d: i64 = vs_isqrt(dx * dx + dy * dy) 28 if d < r[i] + r[j] { ok = 0; j = i } else { j = j + 1 } 29 } 30 if ok == 1 { xs[i] = px; ys[i] = py; placed = 1; ang = 360 } else { ang = ang + 8 } 31 } 32 if placed == 0 { rad = rad + 4 } 33 if rad > K_MAGIC_200000 { xs[i] = rad; ys[i] = 0; placed = 1 } 34 } 35 i = i + 1 36 } 37 return n 38} 39func main() -> i64 { return 0 }