code wiki / _hdl_build / nx_curvebench.nx
nx_curvebench.nx
buildroot/runtime/_hdl_build/nx_curvebench.nx
about
nx_curvebench.nx -- ★★★OUTLINE CURVATURE: the metric that replaces waist-to-hip ratio.
WHY WHR IS GONE, and it was not an aesthetic judgement -- it was arithmetic. Parsing ANSUR II, the US Army
anthropometric survey: **0.0% of 1,986 women are at or below WHR 0.70. The minimum in the entire sample is
0.701.** A target that no member of a 2,000-person population reaches is not a target, it is a number that
got repeated. Independently: Hubner & Ufken 2024 measured outline CURVATURE explaining ~65% of attractiveness
variance against WHR's ~28%, and Lidborg & Boothroyd 2025 (N=125,062) found most significant WHR-fertility
associations running the WRONG WAY, which removes the mechanism WHR was supposed to have.
★★THE POINT IS NOT THAT CURVATURE IS A *LOWER* TARGET -- it is a BETTER-MEASURING one. It captures the same
visual quality more faithfully, so aiming at an idealised figure becomes a NUMBER on this axis rather than
an argument about a ratio nobody meets.
★★★AND THAT REFRAMES WHAT A "MUSE" IS. What a generator needs from a reference figure is not pixels, it is
AN AIM POINT ON A METRIC. Extract the number, aim at the number: it composes with the fitter, it survives the
reference going away, and it is not a likeness of anybody. A stored image is a liability with an expiry date;
a curvature target is a parameter.
WHAT IT MEASURES: the front-view silhouette as a half-width profile w(y), then the BEND in that profile.
★DIMENSIONLESS BY CONSTRUCTION -- both w and y are normalised by stature before differencing, so the index
describes SHAPE and not SIZE. A metric that grows with the body is measuring the body, not its form, and T3
exists to prove this one does not.
nx_curvebench measure <body.nxmesh> [stature_mm] -> curvature index + WHR, side by side
nx_curvebench selftest
license_tier: ORIGINAL expect_exit: 0 No hw writes (Rule 26).
dependencies 2 imports · 0 importers
imports: nx_gate_verdict.nxnx_itoa_lib.nx
imported by: nobody (leaf or entry point)
call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown
structs
| none |
consts
| 28 | const CB_MAGIC_100000: i64 = 100000 |
| 30 | const CB_M8388607: i64 = 8388607 |
| 31 | const CB_M8388608: i64 = 8388608 |
| 32 | const CB_HDR: i64 = 16 |
| 33 | const CB_LAYENT: i64 = 24 |
| 34 | const CB_TRI: i64 = 84 |
| 35 | const CB_LID: i64 = 4 |
| 36 | const CB_SCALE: i64 = 1024 |
| 37 | const CB_MM: i64 = 1000 |
| 38 | const CB_STATURE: i64 = 1750 |
| 39 | const CB_MAXTRI: i64 = 400000 |
| 42 | const CB_BANDS: i64 = 128 |
| 45 | const CB_LO: i64 = 470 |
| 46 | const CB_HI: i64 = 760 |
| 48 | const CB_WAIST: i64 = 615 |
| 49 | const CB_HIP: i64 = 530 |
| 50 | const CB_BIG: i64 = 4611686018427387903 |
| 51 | const CB_OUT: i64 = 16 |
| 60 | const CB_PREC: i64 = 100000 |
functions
| 62 | func cb_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } called by 1: main |
| 67 | func cb_pn(v: i64) -> i64 { nxi_out(v); return 0 } |
| 68 | func cb_streq(a: *u8, b: *u8) -> i64 called by 1: main |
| 73 | func cb_atoi(s: *u8) -> i64 called by 1: main |
| 79 | func cb_rd32(b: *u8, o: i64) -> i64 |
| 82 | func cb_f32mul(b: *u8, o: i64, mul: i64) -> i64 |
| 95 | func cb_abs(v: i64) -> i64 { if v < 0 { return 0-v } return v } |
| 100 | func cb_profile(path: *u8, W: *i64, stature: i64) -> i64 |
| 181 | func cb_band(permil: i64) -> i64 |
| 188 | func cb_measure(W: *i64, out: *i64) -> i64 |
| 284 | func cb_fx_cylinder(W: *i64, w: i64) -> i64 called by 1: cb_gate |
| 290 | func cb_fx_cone(W: *i64, w0: i64, w1: i64) -> i64 called by 1: cb_gate |
| 299 | func cb_fx_hourglass(W: *i64, wideR: i64, waistR: i64) -> i64 |
| 315 | func cb_gate() -> i64 |
| 393 | func main(argc: i64, argv: *i64) -> i64 |