nx_uv_planar_subdivision_gate_t280.nx source
↩ module page · 34 lines · 3070 B
1import "nx_uv_harmonic_candidate_t280.nx"
2import "nx_gate_verdict.nx"
3func pg_mesh(n:i64)->*i64{
4 if n<1{return 0 as *i64};if n>UV_ABC_MAX{return 0 as *i64}
5 let side:i64=n+1;let m:*i64=ncp_model_new(side*side,n*n*2);if m==(0 as *i64){return m}
6 var y:i64=0;while y<=n{var x:i64=0;while x<=n{uv_set_vert(m,y*side+x,x*1000,y*1000,0);x=x+1};y=y+1}
7 var t:i64=0;y=0;while y<n{var x:i64=0;while x<n{let a:i64=y*side+x;uv_set_tri(m,t,a,a+1,a+side+1);uv_set_tri(m,t+1,a,a+side+1,a+side);t=t+2;x=x+1};y=y+1}
8 if uv_chart_build(m)!=UV_OK{ncp_model_free(m);return 0 as *i64};return m
9}
10func pg_num(s:*u8)->i64{var i:i64=0;var v:i64=0;while s[i]!=(0 as u8){let d:i64=(s[i] as i64)-48;if d<0{return 0};if d>9{return 0};if v>(NCP_MAX-d)/10{return 0};v=v*10+d;i=i+1};return v}
11func main(argc:i64,argv:*i64)->i64{
12 if argc!=3{return 2};let maxn:i64=pg_num(argv[1] as *u8);let budget:i64=pg_num(argv[2] as *u8);if maxn<1{return 2};if budget<1{return 2}
13 let ctr:*i64=gv_ctr();var n:i64=1
14 while n<=maxn{
15 let m:*i64=pg_mesh(n);if m==(0 as *i64){return 3};let q:*i64=uds_prepare(m);if q==(0 as *i64){return 4}
16 let s:*UvGramSolve=ulh_begin(m,q,0,0.00000001);if s==(0 as *UvGramSolve){return 5};var rc:i64=s.result
17 if rc==UV_E_NOTRUN{let cancel:*i64=sys_mmap_try(8) as *i64;cancel[0]=1;let before:i64=s.matvecs
18 gv_check_eq("cancelled step reports cancellation",uls_step_controlled(s,budget,cancel),ULS_CANCELLED,ctr)
19 gv_check_eq("cancellation performs no matrix work",s.matvecs,before,ctr)
20 gv_check_eq("cancellation preserves resumable state",s.result,UV_E_NOTRUN,ctr)
21 cancel[0]=0;rc=uls_step_controlled(s,budget,cancel);sys_munmap_direct(cancel as *u8,8)
22 }
23 gv_puts("PLANAR subdivisions=");gv_num(n);gv_puts(" faces=");gv_num(s.nt);gv_puts(" iterations=");gv_num(s.iterations);gv_puts("\n")
24 gv_check_eq("subdivided planar solve converges",rc,UV_OK,ctr);if rc!=UV_OK{return 6}
25 var t:i64=0;var neg:i64=0;var zero:i64=0;var minarea:f64=0.0
26 while t<s.nt{let a:i64=s.corners[t*3];let b:i64=s.corners[t*3+1];let c:i64=s.corners[t*3+2];let area:f64=(s.x[b]-s.x[a])*(s.x[s.n+c]-s.x[s.n+a])-(s.x[s.n+b]-s.x[s.n+a])*(s.x[c]-s.x[a]);if area<0.0{neg=neg+1};if area==0.0{zero=zero+1};if area>0.0{if minarea==0.0{minarea=area};if area<minarea{minarea=area}};t=t+1}
27 gv_check_eq("planar raw float folds",neg,0,ctr);gv_check_eq("planar raw float collapsed triangles",zero,0,ctr)
28 gv_puts("PLANAR minAreaRawF64Bits=");let bits:*i64=(&minarea) as *i64;gv_num(bits[0]);gv_puts("\n")
29 gv_check_eq("planar coordinates exported",uls_export(s),UV_OK,ctr);uls_free(s)
30 gv_check_eq("planar atlas packs",uvi_atlas(m),UV_OK,ctr);m[UV_H_STAGE]=UV_ST_SOLVED;gv_check_eq("planar quantized atlas distortion gate",uv_distortion(m),UV_OK,ctr)
31 gv_check_eq("planar quantized collapsed triangles",uv_uvdegen(m),0,ctr);gv_check_eq("planar quantized folded triangles",uv_flipped(m),0,ctr)
32 ncp_model_free(q);ncp_model_free(m);if n>maxn/2{break};n=n*2
33 };return gv_verdict("UV-PLANAR-SUBDIVISION-T280",ctr,"Planar conditioning/quantization controls only; resident mapping remains separate")
34}