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 }